github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/build/buildkit_printer_test.go (about) 1 package build 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 "strings" 10 "testing" 11 12 controlapi "github.com/moby/buildkit/api/services/control" 13 "github.com/stretchr/testify/assert" 14 15 "github.com/tilt-dev/tilt/pkg/logger" 16 ) 17 18 // NOTE(dmiller): set at runtime with: 19 // go test -ldflags="-X github.com/tilt-dev/tilt/internal/build.WriteGoldenMaster=1" github.com/tilt-dev/tilt/internal/build -run ^TestBuildkitPrinter 20 var WriteGoldenMaster = "0" 21 22 type buildkitTestCase struct { 23 name string 24 responsePath string 25 } 26 27 func (c buildkitTestCase) readResponse(reader io.Reader) ([]controlapi.StatusResponse, error) { 28 result := make([]controlapi.StatusResponse, 0) 29 decoder := json.NewDecoder(reader) 30 for decoder.More() { 31 var resp controlapi.StatusResponse 32 err := decoder.Decode(&resp) 33 if err != nil { 34 return nil, err 35 } 36 result = append(result, resp) 37 } 38 return result, nil 39 } 40 41 func TestBuildkitPrinter(t *testing.T) { 42 cases := []buildkitTestCase{ 43 {"add-success", "add-success.response.txt"}, 44 {"add-failure", "add-failure.response.txt"}, 45 {"echo-hi-success", "echo-hi-success.response.txt"}, 46 {"echo-hi-success-verbose", "echo-hi-success.response.txt"}, 47 {"echo-hi-failure", "echo-hi-failure.response.txt"}, 48 {"echo-hi-failure-verbose", "echo-hi-failure.response.txt"}, 49 {"multistage-success", "multistage-success.response.txt"}, 50 {"multistage-fail-run", "multistage-fail-run.response.txt"}, 51 {"multistage-fail-copy", "multistage-fail-copy.response.txt"}, 52 {"sleep-success", "sleep-success.response.txt"}, 53 {"sleep-cache", "sleep-cache.response.txt"}, 54 {"rust-success", "rust-success.response.txt"}, 55 } 56 57 base := t.Name() 58 for _, c := range cases { 59 t.Run(c.name, func(t *testing.T) { 60 fullPath := fmt.Sprintf("testdata/%s/%s", base, c.responsePath) 61 f, err := os.Open(fullPath) 62 if err != nil { 63 t.Fatal(err) 64 } 65 defer func() { 66 _ = f.Close() 67 }() 68 69 responses, err := c.readResponse(f) 70 if err != nil { 71 t.Fatal(err) 72 } 73 74 output := &strings.Builder{} 75 p := newBuildkitPrinter(logger.NewLogger(logger.InfoLvl, output)) 76 77 for _, resp := range responses { 78 err := p.parseAndPrint(toVertexes(resp)) 79 if err != nil { 80 t.Fatal(err) 81 } 82 } 83 84 d1 := []byte(output.String()) 85 gmPath := fmt.Sprintf("testdata/%s.master.txt", t.Name()) 86 if WriteGoldenMaster == "1" { 87 err := os.MkdirAll(filepath.Dir(gmPath), 0777) 88 if err != nil { 89 t.Fatal(err) 90 } 91 92 err = os.WriteFile(gmPath, d1, 0644) 93 if err != nil { 94 t.Fatal(err) 95 } 96 } 97 expected, err := os.ReadFile(gmPath) 98 if err != nil { 99 t.Fatal(err) 100 } 101 102 assert.Equal(t, normalize(string(expected)), normalize(output.String())) 103 }) 104 } 105 }