68 lines
1.4 KiB
Go
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")
|
|
}
|
|
}
|