You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.2 KiB
98 lines
2.2 KiB
package antispam |
|
|
|
import ( |
|
"context" |
|
"io/ioutil" |
|
"math/rand" |
|
"net/http" |
|
"strconv" |
|
"testing" |
|
"time" |
|
|
|
"go-common/app/interface/main/upload/model" |
|
"go-common/library/cache/redis" |
|
"go-common/library/container/pool" |
|
bm "go-common/library/net/http/blademaster" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
func TestAntiSpamHandler(t *testing.T) { |
|
anti := New( |
|
&Config{ |
|
On: true, |
|
Second: 1, |
|
N: 1, |
|
Hour: 1, |
|
M: 1, |
|
Redis: &redis.Config{ |
|
Config: &pool.Config{ |
|
Active: 10, |
|
Idle: 10, |
|
IdleTimeout: xtime.Duration(time.Second * 60), |
|
}, |
|
Name: "test", |
|
Proto: "tcp", |
|
Addr: "172.16.33.54:6380", |
|
DialTimeout: xtime.Duration(time.Second), |
|
ReadTimeout: xtime.Duration(time.Second), |
|
WriteTimeout: xtime.Duration(time.Second), |
|
}}, GetGetRateLimit) |
|
|
|
engine := bm.New() |
|
engine.UseFunc(func(c *bm.Context) { |
|
mid, _ := strconv.ParseInt(c.Request.Form.Get("mid"), 10, 64) |
|
c.Set("mid", mid) |
|
c.Next() |
|
}) |
|
engine.Use(anti.Handler()) |
|
engine.GET("/antispam", func(c *bm.Context) { |
|
c.String(200, "pass") |
|
}) |
|
go engine.Run(":18080") |
|
|
|
time.Sleep(time.Millisecond * 50) |
|
mid := rand.Int() |
|
_, content, err := httpGet("http://127.0.0.1:18080/antispam?mid=" + strconv.Itoa(mid) + "&bucket=a&dir=b") |
|
if err != nil { |
|
t.Logf("http get failed, err:=%v", err) |
|
t.FailNow() |
|
} |
|
if string(content) != "pass" { |
|
t.Logf("request should block by limiter, but passed") |
|
t.FailNow() |
|
} |
|
|
|
_, content, err = httpGet("http://127.0.0.1:18080/antispam?mid=" + strconv.Itoa(mid) + "&bucket=a&dir=b") |
|
if err != nil { |
|
t.Logf("http get failed, err:=%v", err) |
|
t.FailNow() |
|
} |
|
if string(content) == "pass" { |
|
t.Logf("request should block by limiter, but passed") |
|
t.FailNow() |
|
} |
|
|
|
engine.Server().Shutdown(context.TODO()) |
|
} |
|
|
|
func httpGet(url string) (code int, content []byte, err error) { |
|
resp, err := http.Get(url) |
|
if err != nil { |
|
return |
|
} |
|
defer resp.Body.Close() |
|
|
|
content, err = ioutil.ReadAll(resp.Body) |
|
if err != nil { |
|
return |
|
} |
|
code = resp.StatusCode |
|
return |
|
} |
|
|
|
func GetGetRateLimit(bucket, dir string) (model.DirRateConfig, bool) { |
|
return model.DirRateConfig{ |
|
SecondQPS: 1, |
|
CountQPS: 1, |
|
}, true |
|
}
|
|
|