package logview import ( "context" "fmt" "io" "strings" "testing" "tangled.org/core/spindle/db" "tangled.org/core/spindle/models" ) type recordingReader struct { contents map[string]string opens []string } func (r *recordingReader) Open(_ context.Context, ref string) (io.ReadCloser, error) { r.opens = append(r.opens, ref) content, ok := r.contents[ref] if !ok { return nil, fmt.Errorf("missing artifact %q", ref) } return io.NopCloser(strings.NewReader(content)), nil } func TestFollowDoesNotUseAnotherPipelineArtifact(t *testing.T) { d, err := db.Make(context.Background(), t.TempDir()+"/spindle.db") if err != nil { t.Fatal(err) } t.Cleanup(func() { d.Close() }) target := models.WorkflowId{PipelineId: models.PipelineId("target"), Name: "build.yml"} other := models.WorkflowId{PipelineId: models.PipelineId("other"), Name: target.Name} if err := d.SaveArtifactRef("other-lease", "did:plc:other", other, "other.log", "hash"); err != nil { t.Fatal(err) } reader := &recordingReader{contents: map[string]string{"other.log": "wrong log\n"}} if _, _, err := Follow(context.Background(), d, reader, t.TempDir(), target, true); err == nil { t.Fatal("Follow succeeded without an artifact for the target pipeline") } if len(reader.opens) != 0 { t.Fatalf("opened unrelated artifacts: %v", reader.opens) } } func TestFollowReadsExactPipelineArtifact(t *testing.T) { d, err := db.Make(context.Background(), t.TempDir()+"/spindle.db") if err != nil { t.Fatal(err) } t.Cleanup(func() { d.Close() }) target := models.WorkflowId{PipelineId: models.PipelineId("target"), Name: "build.yml"} other := models.WorkflowId{PipelineId: models.PipelineId("other"), Name: target.Name} if err := d.SaveArtifactRef("other-lease", "did:plc:other", other, "other.log", "hash"); err != nil { t.Fatal(err) } if err := d.SaveArtifactRef("target-lease", "did:plc:target", target, "target.log", "hash"); err != nil { t.Fatal(err) } reader := &recordingReader{contents: map[string]string{ "other.log": "wrong log\n", "target.log": "target log\n", }} lines, stop, err := Follow(context.Background(), d, reader, t.TempDir(), target, true) if err != nil { t.Fatal(err) } defer stop() line := <-lines if line == nil || line.Text != "target log" { t.Fatalf("line = %#v, want target log", line) } if len(reader.opens) != 1 || reader.opens[0] != "target.log" { t.Fatalf("opened artifacts = %v, want target.log", reader.opens) } }