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  }