First Commit
ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
web / web (push) Waiting to run
docs / links (push) Canceled after 0s
detections / detections (push) Canceled after 0s
ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
web / web (push) Waiting to run
docs / links (push) Canceled after 0s
detections / detections (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
package llmpool
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// A configured soft-trip threshold replaces the default: two transient failures
|
||||
// are enough, and the fixed cooldown replaces the 1/5/30min ladder.
|
||||
func TestSetPolicyOverridesThresholdAndCooldown(t *testing.T) {
|
||||
reg := NewRegistry(nil, nil)
|
||||
reg.SetPolicy(2, 90*time.Second)
|
||||
if reg.Trip(1, "429", false) {
|
||||
t.Fatal("tripped on the first transient failure, want the second")
|
||||
}
|
||||
if !reg.Trip(1, "429", false) {
|
||||
t.Fatal("should trip on transient failure #2")
|
||||
}
|
||||
st := reg.Get(1)
|
||||
if d := time.Until(st.OpenUntil); d < 80*time.Second || d > 90*time.Second {
|
||||
t.Fatalf("cooldown=%v, want ~90s", d)
|
||||
}
|
||||
// Every later trip keeps the same fixed window instead of climbing the ladder.
|
||||
reg.Trip(1, "429", true)
|
||||
st = reg.Get(1)
|
||||
if d := time.Until(st.OpenUntil); d < 80*time.Second || d > 90*time.Second {
|
||||
t.Fatalf("second cooldown=%v, want ~90s (fixed)", d)
|
||||
}
|
||||
}
|
||||
|
||||
// A negative threshold turns off soft tripping entirely: transient failures never
|
||||
// open the breaker, deterministic ones still do immediately.
|
||||
func TestSetPolicyDisablesSoftTrip(t *testing.T) {
|
||||
reg := NewRegistry(nil, nil)
|
||||
reg.SetPolicy(-1, 0)
|
||||
for i := range 10 {
|
||||
if reg.Trip(1, "429", false) {
|
||||
t.Fatalf("transient failure #%d tripped the breaker, want never", i+1)
|
||||
}
|
||||
}
|
||||
if reg.IsOpen(1) {
|
||||
t.Fatal("breaker should stay closed for transient failures")
|
||||
}
|
||||
if !reg.Trip(1, "no credit", true) {
|
||||
t.Fatal("a hard failure must still trip immediately")
|
||||
}
|
||||
if d := time.Until(reg.Get(1).OpenUntil); d < 50*time.Second || d > 60*time.Second {
|
||||
t.Fatalf("cooldown=%v, want the default first rung (~1min)", d)
|
||||
}
|
||||
}
|
||||
|
||||
// The zero policy is the historical behaviour: 3 transient failures, ladder cooldown.
|
||||
func TestZeroPolicyKeepsDefaults(t *testing.T) {
|
||||
reg := NewRegistry(nil, nil)
|
||||
reg.SetPolicy(0, 0)
|
||||
for i := 1; i < softTripAfter; i++ {
|
||||
if reg.Trip(1, "429", false) {
|
||||
t.Fatalf("tripped after %d transient failures, want %d", i, softTripAfter)
|
||||
}
|
||||
}
|
||||
if !reg.Trip(1, "429", false) {
|
||||
t.Fatalf("should trip on failure #%d", softTripAfter)
|
||||
}
|
||||
if d := time.Until(reg.Get(1).OpenUntil); d < 50*time.Second || d > 60*time.Second {
|
||||
t.Fatalf("cooldown=%v, want the first ladder rung (~1min)", d)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user