Files
Cyrene_v2/plugins/channels/qq_obv11/ratelimit_test.go
T

68 lines
1.4 KiB
Go

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