package activator import ( "os" "path/filepath" "strings" "testing" ) func TestInstallMarkerRoundTrips(t *testing.T) { dir := t.TempDir() if _, found, err := ReadInstallMarker(dir, "shop.test"); found || err != nil { t.Fatalf("before any write: found=%v err=%v", found, err) } m := InstallMarker{Incarnation: "inc1", Generation: "g-op7", Stamp: 41, DBMarker: "dbm", FilesSeq: 1882} if err := WriteInstallMarker(dir, "shop.test", m); err != nil { t.Fatal(err) } got, found, err := ReadInstallMarker(dir, "shop.test") if err != nil || !found || got != m { t.Fatalf("got %+v found=%v err=%v", got, found, err) } m.Stamp = 57 if err := WriteInstallMarker(dir, "shop.test", m); err != nil { t.Fatal(err) } if got, _, _ := ReadInstallMarker(dir, "shop.test"); got.Stamp != 57 { t.Fatalf("a second write did not replace the first: %+v", got) } if err := RemoveInstallMarker(dir, "shop.test"); err != nil { t.Fatal(err) } if err := RemoveInstallMarker(dir, "shop.test"); err != nil { t.Fatalf("removing an absent marker: %v", err) } if _, found, _ := ReadInstallMarker(dir, "shop.test"); found { t.Fatal("marker still there") } } func TestInstallMarkerLeavesNoTemporaryFile(t *testing.T) { dir := t.TempDir() if err := WriteInstallMarker(dir, "shop.test", InstallMarker{Stamp: 1}); err != nil { t.Fatal(err) } entries, err := os.ReadDir(filepath.Join(dir, ".installed")) if err != nil { t.Fatal(err) } if len(entries) != 1 { t.Fatalf("%d files in .installed, want 1", len(entries)) } } func TestInstallMarkerForALongHostHasAShortFileName(t *testing.T) { host := strings.Repeat("a", 200) + ".example.com" p := InstallMarkerPath(t.TempDir(), host) if n := len(filepath.Base(p)); n > 64 { t.Fatalf("file name is %d bytes", n) } } func TestADamagedMarkerIsAnErrorNotAbsence(t *testing.T) { dir := t.TempDir() if err := WriteInstallMarker(dir, "shop.test", InstallMarker{Stamp: 1}); err != nil { t.Fatal(err) } if err := os.WriteFile(InstallMarkerPath(dir, "shop.test"), []byte("{half"), 0o600); err != nil { t.Fatal(err) } if _, found, err := ReadInstallMarker(dir, "shop.test"); err == nil || found { t.Fatalf("found=%v err=%v: a damaged marker must be an error", found, err) } }