internal/sampler/adaptive/adaptive_test.go

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)
	}
}