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 }