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  }