fix(multiplayer): harden live registration verification

This commit is contained in:
Josh Creek
2026-09-04 16:48:25 +01:00
parent 482d4b0985
commit a5cbba8ac9
6 changed files with 84 additions and 15 deletions
@@ -23,6 +23,16 @@ import (
_ "github.com/jackc/pgx/v5/stdlib"
)
type recordingRegistrar struct {
delegate api.ServerRegistrar
err error
}
func (r *recordingRegistrar) RegisterServer(ctx context.Context, binding domain.WorkloadBinding, protocol int, assignmentReady bool, idempotencyKey string, now time.Time) error {
r.err = r.delegate.RegisterServer(ctx, binding, protocol, assignmentReady, idempotencyKey, now)
return r.err
}
func TestRealSupervisorRegistersAllocatedServerThroughControlPlane(t *testing.T) {
dsn := os.Getenv("COSMIC_CLASH_POSTGRES_DSN")
if dsn == "" {
@@ -102,7 +112,8 @@ func TestRealSupervisorRegistersAllocatedServerThroughControlPlane(t *testing.T)
}))
defer sdk.Close()
rosterPath := filepath.Join(t.TempDir(), "join-roster.json")
service := &api.Service{ServerRegistrar: api.ServerRegistrarFromStore(db), WorkloadVerify: api.WorkloadVerifierFromSignedToken(secret, db), Roster: func(ctx context.Context, binding domain.WorkloadBinding, at time.Time) ([][]byte, error) {
registrar := &recordingRegistrar{delegate: api.ServerRegistrarFromStore(db)}
service := &api.Service{ServerRegistrar: registrar, WorkloadVerify: api.WorkloadVerifierFromSignedToken(secret, db), Roster: func(ctx context.Context, binding domain.WorkloadBinding, at time.Time) ([][]byte, error) {
return store.GetAssignmentRoster(ctx, db, binding.MatchID, binding.ServerID, at)
}, Now: func() time.Time { return now }}
control := httptest.NewServer(service.Handler())
@@ -116,7 +127,10 @@ func TestRealSupervisorRegistersAllocatedServerThroughControlPlane(t *testing.T)
t.Fatal(err)
}
if err := supervisor.Start(ctx); err != nil {
t.Fatal(err)
var matchState, matchServerID, allocationID, ticketState string
_ = db.QueryRowContext(ctx, `SELECT state, server_id, allocation_id FROM matches WHERE match_id = 'supervisor-live-match'`).Scan(&matchState, &matchServerID, &allocationID)
_ = db.QueryRowContext(ctx, `SELECT state FROM queue_tickets WHERE ticket_id = 'supervisor-live-ticket-0'`).Scan(&ticketState)
t.Fatalf("start supervisor: %v (registration error=%v; match state=%q server=%q allocation=%q ticket=%q)", err, registrar.err, matchState, matchServerID, allocationID, ticketState)
}
if err := supervisor.Wait(); err != nil {
t.Fatal(err)