github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/buildpack/oci_layout_package_test.go (about)

     1  package buildpack_test
     2  
     3  import (
     4  	"fmt"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/buildpacks/lifecycle/api"
     9  	"github.com/heroku/color"
    10  	"github.com/sclevine/spec"
    11  	"github.com/sclevine/spec/report"
    12  
    13  	"github.com/buildpacks/pack/internal/fakes"
    14  	"github.com/buildpacks/pack/pkg/archive"
    15  	"github.com/buildpacks/pack/pkg/blob"
    16  	"github.com/buildpacks/pack/pkg/buildpack"
    17  	"github.com/buildpacks/pack/pkg/dist"
    18  	h "github.com/buildpacks/pack/testhelpers"
    19  )
    20  
    21  func TestOCILayoutPackage(t *testing.T) {
    22  	color.Disable(true)
    23  	defer color.Disable(false)
    24  	spec.Run(t, "Extract", testOCILayoutPackage, spec.Parallel(), spec.Report(report.Terminal{}))
    25  }
    26  
    27  func testOCILayoutPackage(t *testing.T, when spec.G, it spec.S) {
    28  	when("#BuildpacksFromOCILayoutBlob", func() {
    29  		it("extracts buildpacks", func() {
    30  			mainBP, depBPs, err := buildpack.BuildpacksFromOCILayoutBlob(blob.NewBlob(filepath.Join("testdata", "hello-universe.cnb")))
    31  			h.AssertNil(t, err)
    32  
    33  			h.AssertEq(t, mainBP.Descriptor().Info().ID, "io.buildpacks.samples.hello-universe")
    34  			h.AssertEq(t, mainBP.Descriptor().Info().Version, "0.0.1")
    35  			h.AssertEq(t, len(depBPs), 2)
    36  		})
    37  
    38  		it("provides readable blobs", func() {
    39  			mainBP, depBPs, err := buildpack.BuildpacksFromOCILayoutBlob(blob.NewBlob(filepath.Join("testdata", "hello-universe.cnb")))
    40  			h.AssertNil(t, err)
    41  
    42  			for _, bp := range append([]buildpack.BuildModule{mainBP}, depBPs...) {
    43  				reader, err := bp.Open()
    44  				h.AssertNil(t, err)
    45  
    46  				_, contents, err := archive.ReadTarEntry(
    47  					reader,
    48  					fmt.Sprintf("/cnb/buildpacks/%s/%s/buildpack.toml",
    49  						bp.Descriptor().Info().ID,
    50  						bp.Descriptor().Info().Version,
    51  					),
    52  				)
    53  				h.AssertNil(t, err)
    54  				h.AssertContains(t, string(contents), bp.Descriptor().Info().ID)
    55  				h.AssertContains(t, string(contents), bp.Descriptor().Info().Version)
    56  			}
    57  		})
    58  	})
    59  
    60  	when("#ExtensionsFromOCILayoutBlob", func() {
    61  		it("extracts buildpacks", func() {
    62  			ext, err := buildpack.ExtensionsFromOCILayoutBlob(blob.NewBlob(filepath.Join("testdata", "tree-extension.cnb")))
    63  			h.AssertNil(t, err)
    64  
    65  			h.AssertEq(t, ext.Descriptor().Info().ID, "samples-tree")
    66  			h.AssertEq(t, ext.Descriptor().Info().Version, "0.0.1")
    67  		})
    68  
    69  		it("provides readable blobs", func() {
    70  			ext, err := buildpack.ExtensionsFromOCILayoutBlob(blob.NewBlob(filepath.Join("testdata", "tree-extension.cnb")))
    71  			h.AssertNil(t, err)
    72  			reader, err := ext.Open()
    73  			h.AssertNil(t, err)
    74  
    75  			_, contents, err := archive.ReadTarEntry(
    76  				reader,
    77  				fmt.Sprintf("/cnb/extensions/%s/%s/extension.toml",
    78  					ext.Descriptor().Info().ID,
    79  					ext.Descriptor().Info().Version,
    80  				),
    81  			)
    82  			h.AssertNil(t, err)
    83  			h.AssertContains(t, string(contents), ext.Descriptor().Info().ID)
    84  			h.AssertContains(t, string(contents), ext.Descriptor().Info().Version)
    85  		})
    86  	})
    87  
    88  	when("#IsOCILayoutBlob", func() {
    89  		when("is an OCI layout blob", func() {
    90  			it("returns true", func() {
    91  				isOCILayoutBlob, err := buildpack.IsOCILayoutBlob(blob.NewBlob(filepath.Join("testdata", "hello-universe.cnb")))
    92  				h.AssertNil(t, err)
    93  				h.AssertEq(t, isOCILayoutBlob, true)
    94  			})
    95  		})
    96  
    97  		when("is NOT an OCI layout blob", func() {
    98  			it("returns false", func() {
    99  				buildpackBlob, err := fakes.NewFakeBuildpackBlob(&dist.BuildpackDescriptor{
   100  					WithAPI: api.MustParse("0.3"),
   101  					WithInfo: dist.ModuleInfo{
   102  						ID:      "bp.id",
   103  						Version: "bp.version",
   104  					},
   105  					WithStacks: []dist.Stack{{}},
   106  					WithOrder:  nil,
   107  				}, 0755)
   108  				h.AssertNil(t, err)
   109  
   110  				isOCILayoutBlob, err := buildpack.IsOCILayoutBlob(buildpackBlob)
   111  				h.AssertNil(t, err)
   112  				h.AssertEq(t, isOCILayoutBlob, false)
   113  			})
   114  		})
   115  	})
   116  }