github.com/paketo-buildpacks/libpak@v1.70.0/carton/package_test.go (about)

     1  /*
     2   * Copyright 2018-2020 the original author or authors.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      https://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package carton_test
    18  
    19  import (
    20  	"os"
    21  	"path/filepath"
    22  	"testing"
    23  
    24  	"github.com/buildpacks/libcnb/mocks"
    25  	. "github.com/onsi/gomega"
    26  	"github.com/sclevine/spec"
    27  	"github.com/stretchr/testify/mock"
    28  
    29  	"github.com/paketo-buildpacks/libpak/carton"
    30  	cMocks "github.com/paketo-buildpacks/libpak/carton/mocks"
    31  	"github.com/paketo-buildpacks/libpak/effect"
    32  	eMocks "github.com/paketo-buildpacks/libpak/effect/mocks"
    33  )
    34  
    35  func testPackage(t *testing.T, context spec.G, it spec.S) {
    36  	var (
    37  		Expect = NewWithT(t).Expect
    38  
    39  		entryWriter *cMocks.EntryWriter
    40  		executor    *eMocks.Executor
    41  		exitHandler *mocks.ExitHandler
    42  		path        string
    43  	)
    44  
    45  	it.Before(func() {
    46  		entryWriter = &cMocks.EntryWriter{}
    47  		entryWriter.On("Write", mock.Anything, mock.Anything).Return(nil)
    48  
    49  		executor = &eMocks.Executor{}
    50  		executor.On("Execute", mock.Anything).Return(nil)
    51  
    52  		exitHandler = &mocks.ExitHandler{}
    53  		exitHandler.On("Error", mock.Anything)
    54  
    55  		path = t.TempDir()
    56  
    57  		Expect(os.WriteFile(filepath.Join(path, "buildpack.toml"), []byte(`
    58  api = "0.0.0"
    59  
    60  [buildpack]
    61  name    = "test-name"
    62  version = "{{.version}}"
    63  
    64  [[metadata.dependencies]]
    65  id      = "test-id"
    66  name    = "test-name"
    67  version = "1.1.1"
    68  uri     = "test-uri"
    69  sha256  = "test-sha256"
    70  stacks  = [ "test-stack" ]
    71  
    72    [[metadata.dependencies.licenses]]
    73    type = "test-type"
    74    uri  = "test-uri"
    75  
    76  [metadata]
    77  pre-package   = "test-pre-package"
    78  include-files = [
    79    "test-include-files",
    80    "buildpack.toml",
    81  ]
    82  `), 0644)).To(Succeed())
    83  	})
    84  
    85  	it.After(func() {
    86  		Expect(os.RemoveAll(path)).To(Succeed())
    87  	})
    88  
    89  	it("executes pre_package script", func() {
    90  		carton.Package{
    91  			Source: path,
    92  		}.Create(
    93  			carton.WithEntryWriter(entryWriter),
    94  			carton.WithExecutor(executor),
    95  			carton.WithExitHandler(exitHandler))
    96  
    97  		e, ok := executor.Calls[0].Arguments[0].(effect.Execution)
    98  		Expect(ok).To(BeTrue())
    99  		Expect(e.Command).To(Equal("test-pre-package"))
   100  		Expect(e.Dir).To(Equal(path))
   101  	})
   102  
   103  	context("has a buildpack.toml with target specific include files", func() {
   104  		it.Before(func() {
   105  			Expect(os.WriteFile(filepath.Join(path, "buildpack.toml"), []byte(`
   106  api = "0.0.0"
   107  
   108  [buildpack]
   109  name    = "test-name"
   110  version = "{{.version}}"
   111  
   112  [[metadata.dependencies]]
   113  id      = "test-id"
   114  name    = "test-name"
   115  version = "1.1.1"
   116  uri     = "test-uri"
   117  sha256  = "test-sha256"
   118  stacks  = [ "test-stack" ]
   119  
   120    [[metadata.dependencies.licenses]]
   121    type = "test-type"
   122    uri  = "test-uri"
   123  
   124  [metadata]
   125  pre-package   = "test-pre-package"
   126  include-files = [
   127    "buildpack.toml",
   128    "README",
   129    "LICENSE",
   130    "linux/amd64/bin/just-once",
   131    "linux/arm64/bin/also-just-once"
   132  ]
   133  `), 0644)).To(Succeed())
   134  		})
   135  
   136  		it("includes include_files using the original format", func() {
   137  			carton.Package{
   138  				Source:      path,
   139  				Destination: "test-destination",
   140  			}.Create(
   141  				carton.WithEntryWriter(entryWriter),
   142  				carton.WithExecutor(executor),
   143  				carton.WithExitHandler(exitHandler))
   144  
   145  			Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   146  			Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   147  
   148  			Expect(entryWriter.Calls[1].Arguments[0]).To(Equal(filepath.Join(path, "LICENSE")))
   149  			Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/amd64/LICENSE")))
   150  			Expect(entryWriter.Calls[2].Arguments[0]).To(Equal(filepath.Join(path, "README")))
   151  			Expect(entryWriter.Calls[2].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/amd64/README")))
   152  			Expect(entryWriter.Calls[3].Arguments[0]).To(Equal(filepath.Join(path, "linux/amd64/bin/just-once")))
   153  			Expect(entryWriter.Calls[3].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/amd64/bin/just-once")))
   154  
   155  			Expect(entryWriter.Calls[4].Arguments[0]).To(Equal(filepath.Join(path, "LICENSE")))
   156  			Expect(entryWriter.Calls[4].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/arm64/LICENSE")))
   157  			Expect(entryWriter.Calls[5].Arguments[0]).To(Equal(filepath.Join(path, "README")))
   158  			Expect(entryWriter.Calls[5].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/arm64/README")))
   159  			Expect(entryWriter.Calls[6].Arguments[0]).To(Equal(filepath.Join(path, "linux/arm64/bin/also-just-once")))
   160  			Expect(entryWriter.Calls[6].Arguments[1]).To(Equal(filepath.Join("test-destination", "linux/arm64/bin/also-just-once")))
   161  		})
   162  	})
   163  
   164  	it("includes include_files using the target format", func() {
   165  		carton.Package{
   166  			Source:      path,
   167  			Destination: "test-destination",
   168  		}.Create(
   169  			carton.WithEntryWriter(entryWriter),
   170  			carton.WithExecutor(executor),
   171  			carton.WithExitHandler(exitHandler))
   172  
   173  		Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   174  		Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   175  		Expect(entryWriter.Calls[1].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   176  		Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   177  	})
   178  
   179  	it("replaces .version in buildpack.toml", func() {
   180  		carton.Package{
   181  			Source:      path,
   182  			Destination: "test-destination",
   183  			Version:     "2.2.2",
   184  		}.Create(
   185  			carton.WithEntryWriter(entryWriter),
   186  			carton.WithExecutor(executor),
   187  			carton.WithExitHandler(exitHandler))
   188  
   189  		Expect(entryWriter.Calls[0].Arguments[0]).NotTo(Equal(filepath.Join(path, "buildpack.toml")))
   190  		Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   191  		Expect(entryWriter.Calls[1].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   192  		Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   193  
   194  		Expect(os.ReadFile(entryWriter.Calls[0].Arguments[0].(string))).To(Equal([]byte(`
   195  api = "0.0.0"
   196  
   197  [buildpack]
   198  name    = "test-name"
   199  version = "2.2.2"
   200  
   201  [[metadata.dependencies]]
   202  id      = "test-id"
   203  name    = "test-name"
   204  version = "1.1.1"
   205  uri     = "test-uri"
   206  sha256  = "test-sha256"
   207  stacks  = [ "test-stack" ]
   208  
   209    [[metadata.dependencies.licenses]]
   210    type = "test-type"
   211    uri  = "test-uri"
   212  
   213  [metadata]
   214  pre-package   = "test-pre-package"
   215  include-files = [
   216    "test-include-files",
   217    "buildpack.toml",
   218  ]
   219  `)))
   220  	})
   221  
   222  	context("includes dependencies", func() {
   223  		it.Before(func() {
   224  			Expect(os.WriteFile(filepath.Join(path, "buildpack.toml"), []byte(`
   225  api = "0.0.0"
   226  
   227  [buildpack]
   228  name    = "test-name"
   229  version = "{{.version}}"
   230  
   231  [[metadata.dependencies]]
   232  id      = "test-id"
   233  name    = "test-name"
   234  version = "1.1.1"
   235  uri     = "test-uri-1"
   236  sha256  = "test-sha256-1"
   237  
   238  [[metadata.dependencies]]
   239  id      = "test-id"
   240  name    = "test-name"
   241  version = "2.0.5"
   242  uri     = "test-uri-2"
   243  sha256  = "test-sha256-2"
   244  
   245  [[metadata.dependencies]]
   246  id      = "another-test-id"
   247  name    = "test-name"
   248  version = "1.1.1"
   249  uri     = "test-uri-3"
   250  sha256  = "test-sha256-3"
   251  
   252  [metadata]
   253  pre-package   = "test-pre-package"
   254  include-files = [
   255    "test-include-files",
   256    "buildpack.toml",
   257  ]
   258  `), 0644)).To(Succeed())
   259  		})
   260  
   261  		it("includes all dependencies", func() {
   262  			carton.Package{
   263  				Source:              path,
   264  				Destination:         "test-destination",
   265  				IncludeDependencies: true,
   266  				CacheLocation:       "testdata",
   267  			}.Create(
   268  				carton.WithEntryWriter(entryWriter),
   269  				carton.WithExecutor(executor),
   270  				carton.WithExitHandler(exitHandler))
   271  
   272  			Expect(entryWriter.Calls).To(HaveLen(8))
   273  			Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   274  			Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   275  
   276  			Expect(entryWriter.Calls[1].Arguments[0]).To(Equal("testdata/test-sha256-1.toml"))
   277  			Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-1.toml")))
   278  			Expect(entryWriter.Calls[2].Arguments[0]).To(Equal("testdata/test-sha256-1/test-uri-1"))
   279  			Expect(entryWriter.Calls[2].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-1/test-uri-1")))
   280  
   281  			Expect(entryWriter.Calls[3].Arguments[0]).To(Equal("testdata/test-sha256-2.toml"))
   282  			Expect(entryWriter.Calls[3].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-2.toml")))
   283  			Expect(entryWriter.Calls[4].Arguments[0]).To(Equal("testdata/test-sha256-2/test-uri-2"))
   284  			Expect(entryWriter.Calls[4].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-2/test-uri-2")))
   285  
   286  			Expect(entryWriter.Calls[5].Arguments[0]).To(Equal("testdata/test-sha256-3.toml"))
   287  			Expect(entryWriter.Calls[5].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3.toml")))
   288  			Expect(entryWriter.Calls[6].Arguments[0]).To(Equal("testdata/test-sha256-3/test-uri-3"))
   289  			Expect(entryWriter.Calls[6].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3/test-uri-3")))
   290  
   291  			Expect(entryWriter.Calls[7].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   292  			Expect(entryWriter.Calls[7].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   293  		})
   294  
   295  		it("includes filter by id", func() {
   296  			carton.Package{
   297  				Source:              path,
   298  				Destination:         "test-destination",
   299  				IncludeDependencies: true,
   300  				CacheLocation:       "testdata",
   301  				DependencyFilters:   []string{`^another-test-id$`},
   302  			}.Create(
   303  				carton.WithEntryWriter(entryWriter),
   304  				carton.WithExecutor(executor),
   305  				carton.WithExitHandler(exitHandler))
   306  
   307  			Expect(entryWriter.Calls).To(HaveLen(4))
   308  			Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   309  			Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   310  
   311  			Expect(entryWriter.Calls[1].Arguments[0]).To(Equal("testdata/test-sha256-3.toml"))
   312  			Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3.toml")))
   313  			Expect(entryWriter.Calls[2].Arguments[0]).To(Equal("testdata/test-sha256-3/test-uri-3"))
   314  			Expect(entryWriter.Calls[2].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3/test-uri-3")))
   315  
   316  			Expect(entryWriter.Calls[3].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   317  			Expect(entryWriter.Calls[3].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   318  		})
   319  
   320  		it("includes filter by version", func() {
   321  			carton.Package{
   322  				Source:              path,
   323  				Destination:         "test-destination",
   324  				IncludeDependencies: true,
   325  				CacheLocation:       "testdata",
   326  				DependencyFilters:   []string{`^1.1.1$`},
   327  			}.Create(
   328  				carton.WithEntryWriter(entryWriter),
   329  				carton.WithExecutor(executor),
   330  				carton.WithExitHandler(exitHandler))
   331  
   332  			Expect(entryWriter.Calls).To(HaveLen(6))
   333  			Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   334  			Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   335  
   336  			Expect(entryWriter.Calls[1].Arguments[0]).To(Equal("testdata/test-sha256-1.toml"))
   337  			Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-1.toml")))
   338  			Expect(entryWriter.Calls[2].Arguments[0]).To(Equal("testdata/test-sha256-1/test-uri-1"))
   339  			Expect(entryWriter.Calls[2].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-1/test-uri-1")))
   340  
   341  			Expect(entryWriter.Calls[3].Arguments[0]).To(Equal("testdata/test-sha256-3.toml"))
   342  			Expect(entryWriter.Calls[3].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3.toml")))
   343  			Expect(entryWriter.Calls[4].Arguments[0]).To(Equal("testdata/test-sha256-3/test-uri-3"))
   344  			Expect(entryWriter.Calls[4].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-3/test-uri-3")))
   345  
   346  			Expect(entryWriter.Calls[5].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   347  			Expect(entryWriter.Calls[5].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   348  		})
   349  
   350  		it("includes filter by version and id", func() {
   351  			carton.Package{
   352  				Source:                  path,
   353  				Destination:             "test-destination",
   354  				IncludeDependencies:     true,
   355  				CacheLocation:           "testdata",
   356  				DependencyFilters:       []string{`^test-id$|^2\.0\.5$`},
   357  				StrictDependencyFilters: true,
   358  			}.Create(
   359  				carton.WithEntryWriter(entryWriter),
   360  				carton.WithExecutor(executor),
   361  				carton.WithExitHandler(exitHandler))
   362  
   363  			Expect(entryWriter.Calls).To(HaveLen(4))
   364  			Expect(entryWriter.Calls[0].Arguments[0]).To(Equal(filepath.Join(path, "buildpack.toml")))
   365  			Expect(entryWriter.Calls[0].Arguments[1]).To(Equal(filepath.Join("test-destination", "buildpack.toml")))
   366  
   367  			Expect(entryWriter.Calls[1].Arguments[0]).To(Equal("testdata/test-sha256-2.toml"))
   368  			Expect(entryWriter.Calls[1].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-2.toml")))
   369  			Expect(entryWriter.Calls[2].Arguments[0]).To(Equal("testdata/test-sha256-2/test-uri-2"))
   370  			Expect(entryWriter.Calls[2].Arguments[1]).To(Equal(filepath.Join("test-destination", "dependencies/test-sha256-2/test-uri-2")))
   371  
   372  			Expect(entryWriter.Calls[3].Arguments[0]).To(Equal(filepath.Join(path, "test-include-files")))
   373  			Expect(entryWriter.Calls[3].Arguments[1]).To(Equal(filepath.Join("test-destination", "test-include-files")))
   374  		})
   375  	})
   376  }