1package replication23import (4 "errors"5 "io"6 "os"7 "path/filepath"8 "testing"9)1011func TestWriteArtifactFailurePreservesPreviousFile(t *testing.T) {12 dir := t.TempDir()13 path := filepath.Join(dir, "relay.json")14 const previous = "previous artifact\n"15 if err := os.WriteFile(path, []byte(previous), 0o600); err != nil {16 t.Fatal(err)17 }18 wantErr := errors.New("generation failed")19 if err := writeArtifact(path, func(w io.Writer) error {20 if _, err := w.Write([]byte("partial replacement")); err != nil {21 return err22 }23 return wantErr24 }); !errors.Is(err, wantErr) {25 t.Fatalf("writeArtifact error = %v, want %v", err, wantErr)26 }27 got, err := os.ReadFile(path)28 if err != nil {29 t.Fatal(err)30 }31 if string(got) != previous {32 t.Fatalf("previous artifact changed: %q", got)33 }34 entries, err := os.ReadDir(dir)35 if err != nil {36 t.Fatal(err)37 }38 if len(entries) != 1 || entries[0].Name() != "relay.json" {39 t.Fatalf("staging file left behind: %#v", entries)40 }41}