mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
test: add offline Steam and allocator fakes
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
// Package testkit provides deterministic offline collaborators for control
|
||||
// plane integration tests. It contains no network or Steam/cloud dependency.
|
||||
package testkit
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/cosmic-clash/cosmic-clash/server/domain"
|
||||
)
|
||||
|
||||
type FakeSteamVerifier struct {
|
||||
Verifier *domain.TicketVerifier
|
||||
Identities map[string]string
|
||||
}
|
||||
|
||||
func NewFakeSteamVerifier(appID uint64) (*FakeSteamVerifier, error) {
|
||||
verifier, err := domain.NewTicketVerifier(appID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &FakeSteamVerifier{Verifier: verifier, Identities: make(map[string]string)}, nil
|
||||
}
|
||||
|
||||
func (f *FakeSteamVerifier) Verify(ticket domain.SteamTicket, now time.Time) (domain.VerifiedIdentity, error) {
|
||||
return f.Verifier.Verify(ticket, func(steamID string) (string, bool) {
|
||||
playerID, ok := f.Identities[steamID]
|
||||
return playerID, ok
|
||||
}, now)
|
||||
}
|
||||
|
||||
type FakeAllocator struct {
|
||||
Allocator *domain.Allocator
|
||||
ForcedError error
|
||||
}
|
||||
|
||||
func NewFakeAllocator(servers []domain.ReadyServer) (*FakeAllocator, error) {
|
||||
allocator, err := domain.NewAllocator(servers)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &FakeAllocator{Allocator: allocator}, nil
|
||||
}
|
||||
|
||||
func (f *FakeAllocator) Allocate(request domain.AllocationRequest, now time.Time) (domain.Allocation, error) {
|
||||
if f.ForcedError != nil {
|
||||
return domain.Allocation{}, f.ForcedError
|
||||
}
|
||||
return f.Allocator.Allocate(request, now)
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package testkit
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/cosmic-clash/cosmic-clash/server/domain"
|
||||
)
|
||||
|
||||
func TestFakeSteamVerifierIsDeterministicAndOffline(t *testing.T) {
|
||||
now := time.Unix(1000, 0)
|
||||
fake, err := NewFakeSteamVerifier(480)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fake.Identities["steam-1"] = "player-1"
|
||||
ticket := domain.SteamTicket{TicketID: "ticket-1", SteamID: "steam-1", AppID: 480, ExpiresAt: now.Add(time.Minute)}
|
||||
identity, err := fake.Verify(ticket, now)
|
||||
if err != nil || identity.PlayerID != "player-1" {
|
||||
t.Fatalf("identity = %+v err=%v", identity, err)
|
||||
}
|
||||
if _, err := fake.Verify(ticket, now); err == nil {
|
||||
t.Fatal("fake accepted ticket replay")
|
||||
}
|
||||
}
|
||||
|
||||
func TestFakeAllocatorCanForceFailureWithoutCloudState(t *testing.T) {
|
||||
fake, err := NewFakeAllocator([]domain.ReadyServer{{ServerID: "server-1", Region: "EU", Build: "build-1", Protocol: 1, Transport: "enet", State: domain.ServerReady}})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fake.ForcedError = errors.New("forced allocation failure")
|
||||
_, err = fake.Allocate(domain.AllocationRequest{AllocationID: "allocation-1", MatchID: "match-1", Region: "EU", Build: "build-1", Protocol: 1, Transport: "enet"}, time.Unix(1000, 0))
|
||||
if err == nil || err.Error() != "forced allocation failure" {
|
||||
t.Fatalf("forced failure = %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user