github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/internal/fakes/fake_images.go (about)

     1  package fakes
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/BurntSushi/toml"
    10  	"github.com/buildpacks/imgutil"
    11  	"github.com/buildpacks/imgutil/fakes"
    12  
    13  	"github.com/buildpacks/pack/internal/builder"
    14  	"github.com/buildpacks/pack/pkg/archive"
    15  	"github.com/buildpacks/pack/pkg/dist"
    16  	h "github.com/buildpacks/pack/testhelpers"
    17  )
    18  
    19  type FakeImageCreator func(name string, topLayerSha string, identifier imgutil.Identifier) *fakes.Image
    20  
    21  func NewFakeBuilderImage(t *testing.T, tmpDir, name string, stackID, uid, gid string, metadata builder.Metadata, bpLayers dist.ModuleLayers, order dist.Order, exLayers dist.ModuleLayers, orderExtensions dist.Order, creator FakeImageCreator) *fakes.Image {
    22  	fakeBuilderImage := creator(name, "", nil)
    23  
    24  	h.AssertNil(t, fakeBuilderImage.SetLabel("io.buildpacks.stack.id", stackID))
    25  	h.AssertNil(t, fakeBuilderImage.SetEnv("CNB_USER_ID", uid))
    26  	h.AssertNil(t, fakeBuilderImage.SetEnv("CNB_GROUP_ID", gid))
    27  
    28  	h.AssertNil(t, dist.SetLabel(fakeBuilderImage, "io.buildpacks.builder.metadata", metadata))
    29  	h.AssertNil(t, dist.SetLabel(fakeBuilderImage, "io.buildpacks.buildpack.layers", bpLayers))
    30  
    31  	for bpID, v := range bpLayers {
    32  		for bpVersion, bpLayerInfo := range v {
    33  			bpInfo := dist.ModuleInfo{
    34  				ID:      bpID,
    35  				Version: bpVersion,
    36  			}
    37  
    38  			buildpackDescriptor := dist.BuildpackDescriptor{
    39  				WithAPI:    bpLayerInfo.API,
    40  				WithInfo:   bpInfo,
    41  				WithStacks: bpLayerInfo.Stacks,
    42  				WithOrder:  bpLayerInfo.Order,
    43  			}
    44  
    45  			buildpackTar := CreateBuildpackTar(t, tmpDir, buildpackDescriptor)
    46  			err := fakeBuilderImage.AddLayer(buildpackTar)
    47  			h.AssertNil(t, err)
    48  		}
    49  	}
    50  
    51  	for exID, v := range exLayers {
    52  		for exVersion, exLayerInfo := range v {
    53  			exInfo := dist.ModuleInfo{
    54  				ID:      exID,
    55  				Version: exVersion,
    56  			}
    57  
    58  			extensionDescriptor := dist.ExtensionDescriptor{
    59  				WithAPI:  exLayerInfo.API,
    60  				WithInfo: exInfo,
    61  			}
    62  
    63  			extensionTar := CreateExtensionTar(t, tmpDir, extensionDescriptor)
    64  			err := fakeBuilderImage.AddLayer(extensionTar)
    65  			h.AssertNil(t, err)
    66  		}
    67  	}
    68  
    69  	h.AssertNil(t, dist.SetLabel(fakeBuilderImage, "io.buildpacks.buildpack.order", order))
    70  	h.AssertNil(t, dist.SetLabel(fakeBuilderImage, "io.buildpacks.extension.order", orderExtensions))
    71  
    72  	tarBuilder := archive.TarBuilder{}
    73  	orderTomlBytes := &bytes.Buffer{}
    74  	h.AssertNil(t, toml.NewEncoder(orderTomlBytes).Encode(orderTOML{Order: order, OrderExtensions: orderExtensions}))
    75  	tarBuilder.AddFile("/cnb/order.toml", 0777, archive.NormalizedDateTime, orderTomlBytes.Bytes())
    76  
    77  	orderTar := filepath.Join(tmpDir, fmt.Sprintf("order.%s.toml", h.RandString(8)))
    78  	h.AssertNil(t, tarBuilder.WriteToPath(orderTar, archive.DefaultTarWriterFactory()))
    79  	h.AssertNil(t, fakeBuilderImage.AddLayer(orderTar))
    80  
    81  	return fakeBuilderImage
    82  }
    83  
    84  type orderTOML struct {
    85  	Order           dist.Order `toml:"order"`
    86  	OrderExtensions dist.Order `toml:"orderExtensions"`
    87  }