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