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