|  |  | @ -1,9 +1,13 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | package tests |  |  |  | package tests | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import ( |  |  |  | import ( | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"bytes" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"encoding/json" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"errors" |  |  |  | 	"errors" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"fmt" |  |  |  | 	"fmt" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"os" |  |  |  | 	"os" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"path/filepath" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"strings" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"testing" |  |  |  | 	"testing" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/containerd/containerd/platforms" |  |  |  | 	"github.com/containerd/containerd/platforms" | 
			
		
	
	
		
		
			
				
					|  |  | @ -11,6 +15,7 @@ import ( | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/moby/buildkit/util/contentutil" |  |  |  | 	"github.com/moby/buildkit/util/contentutil" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/moby/buildkit/util/testutil" |  |  |  | 	"github.com/moby/buildkit/util/testutil" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/moby/buildkit/util/testutil/integration" |  |  |  | 	"github.com/moby/buildkit/util/testutil/integration" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	"github.com/opencontainers/go-digest" | 
			
		
	
		
		
			
				
					
					|  |  |  | 	"github.com/stretchr/testify/require" |  |  |  | 	"github.com/stretchr/testify/require" | 
			
		
	
		
		
			
				
					
					|  |  |  | ) |  |  |  | ) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -23,6 +28,7 @@ func buildCmd(sb integration.Sandbox, args ...string) (string, error) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | var buildTests = []func(t *testing.T, sb integration.Sandbox){ |  |  |  | var buildTests = []func(t *testing.T, sb integration.Sandbox){ | 
			
		
	
		
		
			
				
					
					|  |  |  | 	testBuild, |  |  |  | 	testBuild, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	testImageIDOutput, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	testBuildLocalExport, |  |  |  | 	testBuildLocalExport, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	testBuildRegistryExport, |  |  |  | 	testBuildRegistryExport, | 
			
		
	
		
		
			
				
					
					|  |  |  | 	testBuildTarExport, |  |  |  | 	testBuildTarExport, | 
			
		
	
	
		
		
			
				
					|  |  | @ -83,6 +89,56 @@ func testBuildRegistryExport(t *testing.T, sb integration.Sandbox) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	require.Equal(t, img.Layers[0]["bar"].Data, []byte("foo")) |  |  |  | 	require.Equal(t, img.Layers[0]["bar"].Data, []byte("foo")) | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | func testImageIDOutput(t *testing.T, sb integration.Sandbox) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dockerfile := []byte(`FROM busybox:latest`) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dir, err := tmpdir(t, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		fstest.CreateFile("Dockerfile", dockerfile, 0600), | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	targetDir := t.TempDir() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	outFlag := "--output=type=docker" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if sb.Name() == "remote" { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		// there is no Docker atm to load the image
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		outFlag += ",dest=" + targetDir + "/image.tar" | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	cmd := buildxCmd(sb, "build", "-q", outFlag, "--iidfile", filepath.Join(targetDir, "iid.txt"), "--metadata-file", filepath.Join(targetDir, "md.json"), dir) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	stdout := bytes.NewBuffer(nil) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	cmd.Stdout = stdout | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	cmd.Stderr = os.Stderr | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	err = cmd.Run() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dt, err := os.ReadFile(filepath.Join(targetDir, "iid.txt")) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	imageID := string(dt) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NotEmpty(t, imageID) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dgst, err := digest.Parse(string(dt)) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.Equal(t, dgst.String(), strings.TrimSpace(stdout.String())) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	dt, err = os.ReadFile(filepath.Join(targetDir, "md.json")) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	type mdT struct { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		ConfigDigest string `json:"containerimage.config.digest"` | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	var md mdT | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	err = json.Unmarshal(dt, &md) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NoError(t, err) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.NotEmpty(t, md.ConfigDigest) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	require.Equal(t, dgst, digest.Digest(md.ConfigDigest)) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func createTestProject(t *testing.T) string { |  |  |  | func createTestProject(t *testing.T) string { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	dockerfile := []byte(` |  |  |  | 	dockerfile := []byte(` | 
			
		
	
		
		
			
				
					
					|  |  |  | FROM busybox:latest AS base |  |  |  | FROM busybox:latest AS base | 
			
		
	
	
		
		
			
				
					|  |  | 
 |