feat: 完整游戏运维功能
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package repo
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"browser.local/platform/domain"
|
||||
)
|
||||
|
||||
func TestClientManagerLifecycleRepositoriesPersistAndFilter(t *testing.T) {
|
||||
path := filepath.Join(t.TempDir(), "metadata.json")
|
||||
store, err := NewFileStore(path)
|
||||
if err != nil {
|
||||
t.Fatalf("create file store: %v", err)
|
||||
}
|
||||
stamp := time.Date(2026, 7, 18, 3, 0, 0, 0, time.UTC)
|
||||
installation := domain.ClientManagerInstallation{ID: "cm-install-1", ServerInstanceID: "server-1", PluginID: "game.scum", ProfileKey: "scum-client-manager", RunEndpointID: "run-1", TargetOS: "linux", TargetArch: "amd64", Status: domain.ClientManagerLifecycleOnline, Phase: "healthy", ActiveVersion: "1.0.0", ActiveArtifactID: "artifact-1", KeyGeneration: 2, DeploymentGeneration: 3, Health: domain.ClientManagerHealthHealthy, LastSeenAt: stamp, CreatedAt: stamp, UpdatedAt: stamp}
|
||||
if err := store.ClientManagerInstallations().Create(installation); err != nil {
|
||||
t.Fatalf("persist installation: %v", err)
|
||||
}
|
||||
session := domain.ClientManagerSession{ID: "cm-session-1", InstallationID: installation.ID, ServerInstanceID: installation.ServerInstanceID, ProfileKey: installation.ProfileKey, RunEndpointID: installation.RunEndpointID, ArtifactID: installation.ActiveArtifactID, KeyGeneration: 2, DeploymentGeneration: 3, TokenHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Capabilities: []string{"component.register", "component.heartbeat"}, Status: domain.ClientManagerSessionActive, LastSeenAt: stamp, ExpiresAt: stamp.Add(15 * time.Minute), CreatedAt: stamp, UpdatedAt: stamp}
|
||||
if err := store.ClientManagerSessions().Create(session); err != nil {
|
||||
t.Fatalf("persist session: %v", err)
|
||||
}
|
||||
nonce := domain.ClientManagerRegistrationNonce{ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", InstallationID: installation.ID, CreatedAt: stamp, ExpiresAt: stamp.Add(5 * time.Minute)}
|
||||
if err := store.ClientManagerNonces().Create(nonce); err != nil {
|
||||
t.Fatalf("persist nonce: %v", err)
|
||||
}
|
||||
|
||||
restarted, err := NewFileStore(path)
|
||||
if err != nil {
|
||||
t.Fatalf("reload file store: %v", err)
|
||||
}
|
||||
installations, err := restarted.ClientManagerInstallations().List(domain.ClientManagerInstallationFilter{ServerInstanceID: "server-1", ProfileKey: "scum-client-manager", Status: domain.ClientManagerLifecycleOnline})
|
||||
if err != nil || len(installations) != 1 || installations[0].DeploymentGeneration != 3 {
|
||||
t.Fatalf("unexpected persisted installations: items=%+v err=%v", installations, err)
|
||||
}
|
||||
sessions, err := restarted.ClientManagerSessions().List(domain.ClientManagerSessionFilter{InstallationID: installation.ID, Status: domain.ClientManagerSessionActive})
|
||||
if err != nil || len(sessions) != 1 {
|
||||
t.Fatalf("unexpected persisted sessions: items=%+v err=%v", sessions, err)
|
||||
}
|
||||
sessions[0].Capabilities[0] = "mutated"
|
||||
stored, _ := restarted.ClientManagerSessions().Get(session.ID)
|
||||
if stored.Capabilities[0] != "component.register" {
|
||||
t.Fatalf("repository returned shared capability storage: %+v", stored)
|
||||
}
|
||||
expired, err := restarted.ClientManagerNonces().List(domain.ClientManagerNonceFilter{ExpiresBefore: stamp.Add(6 * time.Minute)})
|
||||
if err != nil || len(expired) != 1 {
|
||||
t.Fatalf("unexpected nonce expiry filter: items=%+v err=%v", expired, err)
|
||||
}
|
||||
if err := restarted.ClientManagerNonces().Delete(nonce.ID); err != nil {
|
||||
t.Fatalf("delete expired nonce: %v", err)
|
||||
}
|
||||
if _, err := restarted.ClientManagerNonces().Get(nonce.ID); err != ErrNotFound {
|
||||
t.Fatalf("expected deleted nonce, got %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user