171 lines
4.5 KiB
Go
171 lines
4.5 KiB
Go
|
|
package middleware
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// BenchmarkPreferencesMiddleware benchmarks the middleware
|
||
|
|
func BenchmarkPreferencesMiddleware(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
_ = GetPreferences(r)
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"})
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "show"})
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-language", Value: "en"})
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-theme", Value: "default"})
|
||
|
|
req.AddCookie(&http.Cookie{Name: "color-theme", Value: "light"})
|
||
|
|
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkPreferencesMiddlewareWithMigration benchmarks with value migration
|
||
|
|
func BenchmarkPreferencesMiddlewareWithMigration(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
_ = GetPreferences(r)
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-length", Value: "extended"}) // Old value
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "true"}) // Old value
|
||
|
|
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkGetPreferences benchmarks context retrieval
|
||
|
|
func BenchmarkGetPreferences(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
_ = GetPreferences(r)
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"})
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
|
||
|
|
// Setup context once
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
_ = GetPreferences(req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkContextHelpers benchmarks helper functions
|
||
|
|
func BenchmarkGetLanguage(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-language", Value: "es"})
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
|
||
|
|
// Setup context
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
_ = GetLanguage(req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkIsLongCV(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"})
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
_ = IsLongCV(req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func BenchmarkShowIcons(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-icons", Value: "show"})
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
_ = ShowIcons(req)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkSetPreferenceCookie benchmarks cookie setting
|
||
|
|
func BenchmarkSetPreferenceCookie(b *testing.B) {
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
SetPreferenceCookie(w, "cv-length", "long")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkParallelPreferencesMiddleware benchmarks under parallel load
|
||
|
|
func BenchmarkParallelPreferencesMiddleware(b *testing.B) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
_ = GetPreferences(r)
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
wrappedHandler := PreferencesMiddleware(handler)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
b.RunParallel(func(pb *testing.PB) {
|
||
|
|
for pb.Next() {
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.AddCookie(&http.Cookie{Name: "cv-length", Value: "long"})
|
||
|
|
w := httptest.NewRecorder()
|
||
|
|
wrappedHandler.ServeHTTP(w, req)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// BenchmarkPreferencesWithoutMiddleware benchmarks fallback path
|
||
|
|
func BenchmarkPreferencesWithoutMiddleware(b *testing.B) {
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
|
||
|
|
b.ResetTimer()
|
||
|
|
for i := 0; i < b.N; i++ {
|
||
|
|
_ = GetPreferences(req)
|
||
|
|
}
|
||
|
|
}
|