package db import ( "context" "testing" "tangled.org/core/spindle/models" "tangled.org/core/workflow" ) func TestFailOrphanedWorkflowsOnlyTouchesWorkWithNoOwner(t *testing.T) { ctx := context.Background() database := newTestDB(t) const repo = "did:plc:orphanrepo" tpl := workflow.PipelineSpec{Workflows: []*workflow.WorkflowSpec{{Name: "build"}}} enqueue := func(id string) { t.Helper() record := &models.PipelineRecord{ID: models.PipelineId(id), RepoDID: repo} if err := database.EnqueuePipeline(ctx, repo, record, nil, tpl, "", "", nil); err != nil { t.Fatal(err) } } wid := func(id string) models.WorkflowId { return models.WorkflowId{PipelineId: models.PipelineId(id), Name: "build"} } for _, id := range []string{"orphan-running", "orphan-pending", "finished", "leased"} { enqueue(id) } for range 4 { if job, err := database.DequeueJob(ctx, nil); err != nil || job == nil { t.Fatalf("dequeue = %v, %v", job, err) } } enqueue("queued") must := func(err error) { t.Helper() if err != nil { t.Fatal(err) } } must(database.StatusRunning(wid("orphan-running"), nil)) must(database.StatusRunning(wid("finished"), nil)) must(database.StatusSuccess(wid("finished"), nil)) must(database.StatusRunning(wid("leased"), nil)) must(database.SaveMillLease(MillLease{LeaseID: "lease", NodeID: "node", Epoch: "epoch", Engine: "microvm", PipelineID: "leased", Workflow: "build", State: "running"})) failed, err := database.FailOrphanedWorkflows(nil) if err != nil { t.Fatal(err) } if failed != 2 { t.Fatalf("failed %d workflows, want 2", failed) } want := map[string]models.StatusKind{ "orphan-running": models.StatusKindFailed, "orphan-pending": models.StatusKindFailed, "finished": models.StatusKindSuccess, "leased": models.StatusKindRunning, "queued": models.StatusKindPending, } for id, status := range want { if got, err := database.GetStatus(wid(id)); err != nil || got != status { t.Errorf("%s status = %q (%v), want %q", id, got, err, status) } } if again, err := database.FailOrphanedWorkflows(nil); err != nil || again != 0 { t.Fatalf("second pass failed %d workflows (%v), want 0", again, err) } }