99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
|
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
|
||
|
}
|