package ratelimit import ( "testing" "time" ) func TestAllowWindow(t *testing.T) { l := New() const win = 80 * time.Millisecond // 窗口内到量就拒 for i := 0; i < 3; i++ { if !l.AllowWindow("login:ip:1.2.3.4", 3, win) { t.Fatalf("第 %d 次应放行", i+1) } } if l.AllowWindow("login:ip:1.2.3.4", 3, win) { t.Fatal("超过限额应拒绝") } // 不同键互不影响(换 IP 不会被同一个桶牵连) if !l.AllowWindow("login:ip:5.6.7.8", 3, win) { t.Fatal("另一个 IP 应独立计数") } if !l.AllowWindow("login:u:1.2.3.4|admin", 3, win) { t.Fatal("同一 IP 的另一个账号桶应独立") } // 窗口滑过即恢复 time.Sleep(120 * time.Millisecond) if !l.AllowWindow("login:ip:1.2.3.4", 3, win) { t.Fatal("窗口过期后应重新放行") } // limit<=0 不限制 for i := 0; i < 5; i++ { if !l.AllowWindow("free", 0, win) { t.Fatal("limit<=0 应始终放行") } } }