package lifecycle import ( "os" "path/filepath" "testing" "bugabinga.net/luci/internal/history" ) func TestRunLockRejectsDeleteWhileProcessing(t *testing.T) { data := t.TempDir() processing, err := TryLockRun(data, "42", true) if err != nil { t.Fatal(err) } defer processing.Close() if _, err := TryLockRun(data, "42", false); err == nil { t.Fatal("exclusive delete lock acquired while run lock is held") } } func TestDeleteTombstonesAndRetriesLegacyCleanup(t *testing.T) { data := t.TempDir() events := []history.Event{{RunID: "42", ChildID: "legacy-001", Job: "check", Status: "success"}, {RunID: "42", ChildID: "run", Job: "push", Status: "success"}} log := filepath.Join(data, "logs", "42-check.log.zst") artifact := filepath.Join(data, "artifacts", "42", "001", "result") for path := range map[string]bool{log: true, artifact: true} { if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(path, []byte("x"), 0o644); err != nil { t.Fatal(err) } } preview, err := PreviewRun(data, "42", events) if err != nil || preview.Bytes != 2 || len(preview.Files) != 2 { t.Fatalf("preview=%+v err=%v", preview, err) } if err := Delete(data, preview); err != nil { t.Fatal(err) } if deleted, err := Deleted(data, "42"); err != nil || !deleted { t.Fatalf("deleted=%v err=%v", deleted, err) } if _, err := os.Stat(log); !os.IsNotExist(err) { t.Fatalf("log remains: %v", err) } if err := Delete(data, preview); err != nil { t.Fatalf("retry: %v", err) } filtered, err := Filter(data, append([]history.Event(nil), events...)) if err != nil || len(filtered) != 0 { t.Fatalf("filtered=%v err=%v", filtered, err) } }