package qq_obv11 import ( "errors" "testing" "time" ) func TestRateLimiterAllowWithinWindow(t *testing.T) { t.Parallel() rl := newRateLimiter(3, 10*time.Second) now := time.Now() for i := 0; i < 3; i++ { if !rl.allow(now) { t.Fatalf("allow #%d denied, want allowed", i) } } if rl.allow(now) { t.Error("4th allow in window accepted, want denied") } } func TestRateLimiterDeniedOverWindow(t *testing.T) { t.Parallel() rl := newRateLimiter(2, 10*time.Second) base := time.Now() if !rl.allow(base) || !rl.allow(base) { t.Fatal("first two sends should be allowed") } if rl.allow(base) { t.Error("third send within window allowed, want denied") } // After the window elapses, the budget frees up. if !rl.allow(base.Add(11 * time.Second)) { t.Error("send after window elapsed denied, want allowed") } } func TestRateLimiterDisabledAllowsAll(t *testing.T) { t.Parallel() rl := newRateLimiter(0, 10*time.Second) for i := 0; i < 100; i++ { if !rl.allow(time.Now()) { t.Fatalf("disabled limiter denied send #%d", i) } } } func TestRateLimiterNilAllows(t *testing.T) { t.Parallel() var rl *rateLimiter if !rl.allow(time.Now()) { t.Error("nil limiter denied send, want allowed") } } func TestErrRateLimitedSentinel(t *testing.T) { t.Parallel() if !errors.Is(ErrRateLimited, ErrRateLimited) { t.Error("ErrRateLimited should be its own sentinel") } }