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 }