Files
sub2api/backend/internal/service/openai_proxy_stream_circuit_test.go
T

57 lines
1.8 KiB
Go

package service
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestOpenAIProxyStreamCircuitThresholdTTLAndSuccessReset(t *testing.T) {
base := time.Unix(1_800_000_000, 0)
circuit := newOpenAIProxyStreamCircuit(openAIProxyStreamCircuitSettings{
failureThreshold: 2,
failureWindow: time.Minute,
quarantineTTL: 10 * time.Minute,
maxEntries: 16,
})
tripped, _ := circuit.recordFailure(1, base)
require.False(t, tripped)
require.False(t, circuit.isBlocked(1, base))
require.True(t, circuit.recordSuccess(1))
tripped, _ = circuit.recordFailure(1, base.Add(10*time.Second))
require.False(t, tripped, "success must clear the previous failure observation")
tripped, until := circuit.recordFailure(1, base.Add(20*time.Second))
require.True(t, tripped)
require.Equal(t, base.Add(20*time.Second+10*time.Minute), until)
require.True(t, circuit.isBlocked(1, until.Add(-time.Nanosecond)))
require.False(t, circuit.isBlocked(1, until), "TTL expiry must re-admit the proxy")
tripped, _ = circuit.recordFailure(2, base)
require.False(t, tripped)
tripped, _ = circuit.recordFailure(2, base.Add(2*time.Minute))
require.False(t, tripped, "failures outside the window must not accumulate")
}
func TestOpenAIProxyStreamCircuitBoundsEntries(t *testing.T) {
base := time.Unix(1_800_000_000, 0)
circuit := newOpenAIProxyStreamCircuit(openAIProxyStreamCircuitSettings{
failureThreshold: 1,
failureWindow: time.Minute,
quarantineTTL: 10 * time.Minute,
maxEntries: 2,
})
circuit.recordFailure(1, base)
circuit.recordFailure(2, base.Add(time.Second))
circuit.recordFailure(3, base.Add(2*time.Second))
circuit.mu.Lock()
defer circuit.mu.Unlock()
require.Len(t, circuit.entries, 2)
_, oldestRetained := circuit.entries[1]
require.False(t, oldestRetained, "the oldest entry must be evicted at the bound")
}