package systemtime import ( "context" "os" "path/filepath" "testing" ) func TestOSApplierAppliesAndRollsBackTimezoneFile(t *testing.T) { root := t.TempDir() zoneRoot := filepath.Join(root, "zoneinfo") localtime := filepath.Join(root, "etc", "localtime") if err := os.MkdirAll(filepath.Join(zoneRoot, "Asia"), 0o755); err != nil { t.Fatal(err) } if err := os.MkdirAll(filepath.Dir(localtime), 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(zoneRoot, "Asia", "Seoul"), []byte("new-zone"), 0o644); err != nil { t.Fatal(err) } if err := os.WriteFile(localtime, []byte("old-zone"), 0o640); err != nil { t.Fatal(err) } applier, err := NewOSApplier(zoneRoot, localtime) if err != nil { t.Fatal(err) } rollback, err := applier.ApplyTimezone(context.Background(), "Asia/Seoul") if err != nil { t.Fatalf("ApplyTimezone() error = %v", err) } content, _ := os.ReadFile(localtime) if string(content) != "new-zone" { t.Fatalf("localtime = %q, want new-zone", content) } if err := rollback(); err != nil { t.Fatalf("rollback() error = %v", err) } content, _ = os.ReadFile(localtime) if string(content) != "old-zone" { t.Fatalf("restored localtime = %q, want old-zone", content) } } func TestNewOSApplierRequiresAbsolutePaths(t *testing.T) { if _, err := NewOSApplier("zoneinfo", "/etc/localtime"); err == nil { t.Fatal("NewOSApplier accepted a relative zoneinfo root") } if _, err := NewOSApplier("/usr/share/zoneinfo", "localtime"); err == nil { t.Fatal("NewOSApplier accepted a relative localtime path") } }