touka/context_benchmark_test.go
2026-04-10 06:08:55 +08:00

81 lines
1.9 KiB
Go

package touka
import (
"net/http"
"testing"
)
func TestContextResetKeepsKeysNilUntilSet(t *testing.T) {
c, _ := CreateTestContext(nil)
if c.Keys != nil {
t.Fatalf("expected fresh test context Keys to be nil before first Set")
}
c.Set("answer", 42)
if c.Keys == nil {
t.Fatalf("expected Set to allocate Keys map")
}
if value, exists := c.Get("answer"); !exists || value != 42 {
t.Fatalf("expected stored value to round-trip, got %v, %t", value, exists)
}
req, err := http.NewRequest(http.MethodGet, "/", nil)
if err != nil {
t.Fatalf("failed to build request: %v", err)
}
c.reset(UnwrapResponseWriter(c.Writer), req)
if c.Keys != nil {
t.Fatalf("expected reset to clear Keys without allocating a new map")
}
if value, exists := c.Get("answer"); exists || value != nil {
t.Fatalf("expected cleared keys after reset, got %v, %t", value, exists)
}
ctxValue := c.Value("missing")
if ctxValue != nil {
t.Fatalf("expected nil value for missing context key after reset, got %v", ctxValue)
}
defer func() {
if r := recover(); r == nil {
t.Fatalf("expected MustGet to panic for missing key after reset")
}
}()
_ = c.MustGet("answer")
}
func BenchmarkContextReset(b *testing.B) {
b.Run("NoKeysUse", func(b *testing.B) {
c, _ := CreateTestContext(nil)
rawWriter := UnwrapResponseWriter(c.Writer)
req, err := http.NewRequest(http.MethodGet, "/", nil)
if err != nil {
b.Fatalf("failed to build request: %v", err)
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
c.reset(rawWriter, req)
}
})
b.Run("WithKeysUse", func(b *testing.B) {
c, _ := CreateTestContext(nil)
rawWriter := UnwrapResponseWriter(c.Writer)
req, err := http.NewRequest(http.MethodGet, "/", nil)
if err != nil {
b.Fatalf("failed to build request: %v", err)
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
c.reset(rawWriter, req)
c.Set("request-id", i)
}
})
}