proxy-pool/internal/checker/bootstrap/bootstrap_test.go

56 lines
1.8 KiB
Go

package bootstrap
import (
"context"
"errors"
"net"
"net/http"
"net/http/httptest"
"testing"
"proxy-pool/internal/config"
)
func TestControlPlaneReadinessTransitionsAfterSuccessfulPull(t *testing.T) {
readiness := &controlPlaneReadiness{}
if err := readiness.Ready(context.Background()); !errors.Is(err, ErrNotReady) {
t.Fatalf("Ready() before pull = %v, want ErrNotReady", err)
}
readiness.MarkReady()
if err := readiness.Ready(context.Background()); err != nil {
t.Fatalf("Ready() after successful pull = %v", err)
}
readiness.MarkUnavailable()
if err := readiness.Ready(context.Background()); !errors.Is(err, ErrNotReady) {
t.Fatalf("Ready() after failed pull = %v, want ErrNotReady", err)
}
}
func TestMetricsRuntimeUsesControlPlaneReadiness(t *testing.T) {
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatalf("Listen(): %v", err)
}
defer listener.Close()
readiness := &controlPlaneReadiness{}
runtime, err := newMetricsRuntime(context.Background(), config.Metrics{Enabled: true, Listen: listener.Addr().String()}, Options{
MetricsListener: listener,
}, readiness)
if err != nil {
t.Fatalf("newMetricsRuntime(): %v", err)
}
assertCheckerProbe(t, runtime.handler, "/livez", http.StatusOK, "live\n")
assertCheckerProbe(t, runtime.handler, "/readyz", http.StatusServiceUnavailable, "unavailable\n")
readiness.MarkReady()
assertCheckerProbe(t, runtime.handler, "/readyz", http.StatusOK, "ready\n")
}
func assertCheckerProbe(t *testing.T, handler http.Handler, path string, wantStatus int, wantBody string) {
t.Helper()
recorder := httptest.NewRecorder()
handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, path, nil))
if recorder.Code != wantStatus || recorder.Body.String() != wantBody {
t.Fatalf("GET %s = %d %q, want %d %q", path, recorder.Code, recorder.Body.String(), wantStatus, wantBody)
}
}