Files
kjol/tools/tsgo/internal/api/timing_test.go
2026-07-09 16:50:43 -04:00

96 lines
3.0 KiB
Go

package api
import (
"testing"
"time"
"gotest.tools/v3/assert"
)
func TestTimingCollector(t *testing.T) {
t.Parallel()
t.Run("accumulates totals and records recent requests", func(t *testing.T) {
t.Parallel()
c := newTimingCollector()
c.record("getSourceFile", 2*time.Millisecond)
c.record("getSymbolAtPosition", 500*time.Microsecond)
snap := c.snapshot()
assert.Equal(t, snap.Enabled, true)
assert.Equal(t, snap.Totals.RequestCount, uint64(2))
assert.Equal(t, snap.Totals.TotalProcessingTimeMs, 2.5)
assert.Equal(t, len(snap.RecentRequests), 2)
assert.Equal(t, snap.RecentRequests[0].Method, "getSourceFile")
assert.Equal(t, snap.RecentRequests[0].ProcessingTimeMs, 2.0)
assert.Equal(t, snap.RecentRequests[1].Method, "getSymbolAtPosition")
assert.Equal(t, snap.RecentRequests[1].ProcessingTimeMs, 0.5)
})
t.Run("ring buffer retains only the most recent requests, oldest to newest", func(t *testing.T) {
t.Parallel()
c := newTimingCollector()
methods := []string{"a", "b", "c", "d", "e", "f", "g"}
for _, m := range methods {
c.record(m, time.Millisecond)
}
snap := c.snapshot()
assert.Equal(t, snap.Totals.RequestCount, uint64(7))
assert.Equal(t, len(snap.RecentRequests), serverRecentRequestCapacity)
// Expect the last 5 methods, oldest to newest.
want := methods[len(methods)-serverRecentRequestCapacity:]
for i, w := range want {
assert.Equal(t, snap.RecentRequests[i].Method, w)
}
})
t.Run("negative durations clamp to zero", func(t *testing.T) {
t.Parallel()
c := newTimingCollector()
c.record("x", -5*time.Second)
snap := c.snapshot()
assert.Equal(t, snap.Totals.TotalProcessingTimeMs, 0.0)
assert.Equal(t, snap.RecentRequests[0].ProcessingTimeMs, 0.0)
})
}
func TestServerTimingSnapshotDisabled(t *testing.T) {
t.Parallel()
snap := serverTimingSnapshot(nil)
assert.Equal(t, snap.Enabled, false)
assert.Equal(t, snap.Totals.RequestCount, uint64(0))
assert.Equal(t, len(snap.RecentRequests), 0)
}
func TestTimingCollectorReset(t *testing.T) {
t.Parallel()
c := newTimingCollector()
c.record("a", time.Millisecond)
c.record("b", time.Millisecond)
c.reset()
snap := c.snapshot()
assert.Equal(t, snap.Enabled, true)
assert.Equal(t, snap.Totals.RequestCount, uint64(0))
assert.Equal(t, snap.Totals.TotalProcessingTimeMs, 0.0)
assert.Equal(t, len(snap.RecentRequests), 0)
// The collector remains usable after a reset.
c.record("c", 2*time.Millisecond)
snap = c.snapshot()
assert.Equal(t, snap.Totals.RequestCount, uint64(1))
assert.Equal(t, snap.RecentRequests[0].Method, "c")
}
func TestDurationToMillis(t *testing.T) {
t.Parallel()
assert.Equal(t, durationToMillis(1500*time.Microsecond), 1.5)
assert.Equal(t, durationToMillis(0), 0.0)
assert.Equal(t, durationToMillis(-5*time.Second), 0.0)
// Sub-microsecond durations retain precision rather than truncating to 0.
assert.Equal(t, durationToMillis(500*time.Nanosecond), 0.0005)
assert.Equal(t, durationToMillis(1234*time.Nanosecond), 0.001234)
}