Files

59 lines
1.6 KiB
Go

package common
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"time"
)
func TestGameClockSharedStateAndReset(t *testing.T) {
raw, err := os.ReadFile(filepath.Join("..", "..", "server.json"))
if err != nil {
t.Fatal(err)
}
var cfg RuntimeConfig
if err := json.Unmarshal(raw, &cfg); err != nil {
t.Fatal(err)
}
dir := t.TempDir()
cfg.GameClock.StateFile = filepath.Join(dir, "clock.json")
configPath := filepath.Join(dir, "server.json")
raw, _ = json.Marshal(cfg)
if err := os.WriteFile(configPath, raw, 0600); err != nil {
t.Fatal(err)
}
t.Setenv("GAC_CONFIG", configPath)
t.Setenv("GAC_GAME_CLOCK_STATE_FILE", cfg.GameClock.StateFile)
target := time.Date(2025, 1, 2, 3, 4, 5, 0, time.UTC)
if _, err := SetGameTime(&target); err != nil {
t.Fatal(err)
}
now, err := GameTime()
if err != nil || now.Sub(target) < 0 || now.Sub(target) > time.Second {
t.Fatalf("target not preserved: %v %v", now, err)
}
before, _ := os.ReadFile(cfg.GameClock.StateFile)
if _, err := ReadGameClock(); err != nil {
t.Fatal(err)
}
after, _ := os.ReadFile(cfg.GameClock.StateFile)
if string(before) != string(after) {
t.Fatal("read rewrote state")
}
if _, err := SetGameTime(nil); err != nil {
t.Fatal(err)
}
now, err = GameTime()
if err != nil || time.Since(now).Abs() > time.Second {
t.Fatalf("real time not restored: %v %v", now, err)
}
if err := os.WriteFile(cfg.GameClock.StateFile, []byte(`{"offset_ms":9223372036854775807}`), 0600); err != nil {
t.Fatal(err)
}
if _, err := GameTime(); err == nil {
t.Fatal("overflowing offset accepted")
}
}