feat(multiplayer): persist connection generation leases

This commit is contained in:
Josh Creek
2026-09-03 13:38:13 +01:00
parent 2e9da3032c
commit 3e0022ce9c
10 changed files with 286 additions and 80 deletions
+9 -7
View File
@@ -12,22 +12,24 @@ import (
func TestServerConnectionSQLBindsWorkloadParticipantAndLiveAssignment(t *testing.T) {
for _, fragment := range []string{
"connected_at = COALESCE", "mp.participation_active", "m.server_id = $2",
"a.allocation_id = $3", "a.state = 'ALLOCATED'", "assn.player_id = mp.player_id",
"assn.expires_at > $5", "RETURNING mp.connected_at",
"connection_generation", "mp.disconnected_at", "mp.participation_active", "m.server_id = $2",
"a.allocation_id = $3", "a.state = 'ALLOCATED'", "assn.player_id = mp.player_id", "FOR UPDATE OF mp",
} {
if !strings.Contains(ServerConnectionParticipantSQL, fragment) {
t.Fatalf("connection SQL missing %q: %s", fragment, ServerConnectionParticipantSQL)
if !strings.Contains(ServerConnectionLeaseSQL, fragment) {
t.Fatalf("connection SQL missing %q: %s", fragment, ServerConnectionLeaseSQL)
}
}
}
func TestRecordPlayerConnectedRejectsInvalidArguments(t *testing.T) {
binding := domain.WorkloadBinding{AllocationID: "allocation-1", MatchID: "match-1", ServerID: "server-1"}
if err := RecordPlayerConnected(context.Background(), (*sql.DB)(nil), binding, "player-1", "connection-key-123456", time.Unix(1000, 0)); err == nil {
if _, err := ClaimPlayerConnection(context.Background(), (*sql.DB)(nil), binding, "player-1", 0, "connection-key-123456", time.Unix(1000, 0)); err == nil {
t.Fatal("nil database accepted")
}
if err := RecordPlayerConnected(context.Background(), &sql.DB{}, domain.WorkloadBinding{}, "player-1", "connection-key-123456", time.Unix(1000, 0)); err == nil {
if _, err := ClaimPlayerConnection(context.Background(), &sql.DB{}, domain.WorkloadBinding{}, "player-1", 0, "connection-key-123456", time.Unix(1000, 0)); err == nil {
t.Fatal("empty workload binding accepted")
}
if err := RecordPlayerDisconnected(context.Background(), &sql.DB{}, binding, "player-1", 0, "disconnect-key-123456", time.Unix(1000, 0)); err == nil {
t.Fatal("zero generation disconnect accepted")
}
}