package adaptive_test
import (
"testing"
"time"
"mercemay.top/src/lambdalog/internal/sampler"
"mercemay.top/src/lambdalog/internal/sampler/adaptive"
)
func TestSampler_StaysBelowTarget(t *testing.T) {
s := adaptive.New(10) // target 10 QPS
s.SeedFixed(42)
base := time.Unix(0, 0)
const inputs = 1000
var emits int
for i := 0; i < inputs; i++ {
now := base.Add(time.Duration(i) * time.Millisecond)
if s.Sample(sampler.Input{Now: now}) == sampler.Emit {
emits++
}
}
// Input was ~1000 QPS; target was 10. Allow 3x slack for randomness.
if emits > 80 {
t.Fatalf("emits=%d, expected well below 80", emits)
}
}
func TestSampler_LowVolumePassesThrough(t *testing.T) {
s := adaptive.New(100)
s.SeedFixed(1)
base := time.Unix(0, 0)
var emits int
for i := 0; i < 5; i++ {
now := base.Add(time.Duration(i) * time.Second)
if s.Sample(sampler.Input{Now: now}) == sampler.Emit {
emits++
}
}
if emits < 5 {
t.Fatalf("low-volume run dropped %d/5", 5-emits)
}
}
func TestSampler_Reset_RestoresFullRate(t *testing.T) {
s := adaptive.New(1) // very aggressive
s.SeedFixed(2)
base := time.Unix(0, 0)
for i := 0; i < 1000; i++ {
s.Sample(sampler.Input{Now: base.Add(time.Duration(i) * time.Millisecond)})
}
// Rate should have dropped below 1.
if s.Probability() >= 1 {
t.Fatalf("probability did not drop: %f", s.Probability())
}
s.Reset(base.Add(time.Hour))
if s.Probability() != 1 {
t.Fatalf("after reset probability=%f, want 1", s.Probability())
}
}
func TestSampler_Floor_Enforced(t *testing.T) {
defer func(prev time.Duration) { adaptive.Window = prev }(adaptive.Window)
adaptive.Window = 10 * time.Millisecond
s := &adaptive.Sampler{TargetQPS: 0.0001, Floor: 0.25}
s.SeedFixed(3)
base := time.Unix(0, 0)
for i := 0; i < 5000; i++ {
s.Sample(sampler.Input{Now: base.Add(time.Duration(i) * time.Microsecond * 200)})
}
if s.Probability() < 0.24 {
t.Fatalf("floor violated: probability=%f", s.Probability())
}
}
func TestSnapshot(t *testing.T) {
s := adaptive.New(100)
s.SeedFixed(4)
snap := s.Snapshot()
if snap.Rate != 0 && snap.Rate != 1 {
t.Fatalf("unexpected initial rate: %f", snap.Rate)
}
s.Sample(sampler.Input{Now: time.Unix(0, 0)})
snap2 := s.Snapshot()
if snap2.Count != 1 {
t.Fatalf("count=%d, want 1", snap2.Count)
}
}
func TestName(t *testing.T) {
if got := adaptive.New(1).Name(); got != "adaptive" {
t.Fatalf("got %q", got)
}
}