test(06-14): regression coverage for surf and bouncer gap closure

This commit is contained in:
Jakub Zych
2026-09-21 19:47:16 +02:00
parent 1d2e00cf59
commit f1218f2c84
5 changed files with 292 additions and 0 deletions

View File

@@ -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)
}
})
}
}