// Shutdown recovery must be checked through the Service caller: shared-daemon
// E2E cannot safely refuse shutdown while advertising replacement credentials.
package app
import (
"context"
"errors"
"net"
"net/http"
"net/http/httptest"
"strconv"
"sync/atomic"
"testing"
"albedo/cli/internal/daemon"
)
func TestStopDaemonDoesNotRecoverAuthenticationRefusal(t *testing.T) {
var shutdowns, healthProbes atomic.Int32
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
switch request.URL.Path {
case "/shutdown":
shutdowns.Add(1)
if request.Method != http.MethodPost || request.Header.Get("Authorization") != "Bearer old" {
t.Errorf("unexpected shutdown attempt: %s %q", request.Method, request.Header.Get("Authorization"))
}
writer.WriteHeader(http.StatusForbidden)
_, _ = writer.Write([]byte(`{"code":"authentication_required","error":"invalid bearer"}`))
case "/health":
healthProbes.Add(1)
_, _ = writer.Write([]byte(`{"version":2}`))
default:
t.Errorf("unexpected request %s", request.URL.Path)
writer.WriteHeader(http.StatusNotFound)
}
}))
defer server.Close()
_, portText, err := net.SplitHostPort(server.Listener.Addr().String())
if err != nil {
t.Fatal(err)
}
port, err := strconv.Atoi(portText)
if err != nil {
t.Fatal(err)
}
replacement := daemon.ConnectionSnapshot{Port: port, Token: "new", Version: 2}
original := replacement
original.Token = "old"
conn := daemon.NewConnection(original, func(context.Context) (daemon.ConnectionSnapshot, error) {
t.Error("shutdown must not rediscover a replacement")
return replacement, nil
})
t.Cleanup(conn.HTTPClient().CloseIdleConnections)
service := Service{Existing: func(context.Context) (*daemon.Connection, error) { return conn, nil }}
err = service.StopDaemon(context.Background())
apiError, ok := errors.AsType[*daemon.APIError](err)
if !ok || apiError.StatusCode != http.StatusForbidden {
t.Fatalf("want original authentication rejection, got %v", err)
}
if shutdowns.Load() != 1 || healthProbes.Load() != 0 {
t.Fatalf("shutdown was recovered: attempts=%d health probes=%d", shutdowns.Load(), healthProbes.Load())
}
}