test(06-14): regression coverage for surf and bouncer gap closure
This commit is contained in:
@@ -403,3 +403,71 @@ func TestRegisterBucketRejectsInvalidDefinitions(t *testing.T) {
|
||||
t.Fatal("overflowing minutes accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRegisterBucketRejectsInvalid(t *testing.T) {
|
||||
key := func(*http.Request) string { return "k" }
|
||||
cases := []struct {
|
||||
name string
|
||||
store Store
|
||||
b Bucket
|
||||
}{
|
||||
{"nil key", NewMemoryStore(time.Minute), Bucket{Max: 1, Decay: time.Minute}},
|
||||
{"max zero", NewMemoryStore(time.Minute), Bucket{Max: 0, Decay: time.Minute, Key: key}},
|
||||
{"max negative", NewMemoryStore(time.Minute), Bucket{Max: -1, Decay: time.Minute, Key: key}},
|
||||
{"decay zero", NewMemoryStore(time.Minute), Bucket{Max: 1, Key: key}},
|
||||
{"decay negative", NewMemoryStore(time.Minute), Bucket{Max: 1, Decay: -time.Second, Key: key}},
|
||||
{"nil store", nil, Bucket{Max: 1, Decay: time.Minute, Key: key}},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
l := NewFixedWindowLimiter(tc.store, nil)
|
||||
err := l.RegisterBucket("golem15.p", "bkt", tc.b)
|
||||
if err == nil || !strings.Contains(err.Error(), "golem15.p") || !strings.Contains(err.Error(), "bkt") {
|
||||
t.Fatalf("err = %v", err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateThrottleRejectsOverflowAndNilStore(t *testing.T) {
|
||||
l := NewFixedWindowLimiter(NewMemoryStore(time.Minute), nil)
|
||||
for _, p := range []string{"1,9223372036854775807", "0,1", "1,0", "-1,1", "x,y", "nope"} {
|
||||
if err := l.ValidateThrottle(p); err == nil {
|
||||
t.Errorf("%q accepted", p)
|
||||
}
|
||||
}
|
||||
if err := l.ValidateThrottle("5,1"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := NewFixedWindowLimiter(nil, nil).ValidateThrottle("5,1"); err == nil {
|
||||
t.Fatal("nil store accepted")
|
||||
}
|
||||
var nilLim *FixedWindowLimiter
|
||||
if err := nilLim.ValidateThrottle("5,1"); err == nil {
|
||||
t.Fatal("nil limiter accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMiddlewareFailsClosed(t *testing.T) {
|
||||
var nilLim *FixedWindowLimiter
|
||||
cases := map[string]*FixedWindowLimiter{
|
||||
"unknown bucket": NewFixedWindowLimiter(NewMemoryStore(time.Minute), nil),
|
||||
"nil store": NewFixedWindowLimiter(nil, nil),
|
||||
"nil limiter": nilLim,
|
||||
}
|
||||
params := map[string]string{"unknown bucket": "missing", "nil store": "5,1", "nil limiter": "5,1"}
|
||||
for name, l := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
called := false
|
||||
h := l.Middleware(params[name])(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
||||
called = true
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}))
|
||||
rec := httptest.NewRecorder()
|
||||
h.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil))
|
||||
if called || rec.Code != http.StatusInternalServerError {
|
||||
t.Fatalf("called=%v code=%d", called, rec.Code)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user