@@ -673,6 +673,64 @@ func testAcceptance(
673673 builderName = value
674674 })
675675
676+ when ("complex builder" , func () {
677+ it .Before (func () {
678+ // create our nested builder
679+ h .SkipIf (t , imageManager .HostOS () == "windows" , "These tests are not yet compatible with Windows-based containers" )
680+ h .SkipIf (t , ! createBuilderPack .SupportsFeature (invoke .BuilderNoDuplicateLayers ), "bug fixed in 0.18.0" )
681+
682+ // create a task, handled by a 'task manager' which executes our pack commands during tests.
683+ // looks like this is used to de-dup tasks
684+ key := taskKey (
685+ "create-complex-builder" ,
686+ append (
687+ []string {runImageMirror , createBuilderPackConfig .Path (), lifecycle .Identifier ()},
688+ createBuilderPackConfig .FixturePaths ()... ,
689+ )... ,
690+ )
691+ // run task on taskmanager and save output, in case there are future calls to the same task
692+ // likely all our changes need to go on the createBuilderPack.
693+ value , err := suiteManager .RunTaskOnceString (key , func () (string , error ) {
694+ return createComplexBuilder (
695+ t ,
696+ assert ,
697+ createBuilderPack ,
698+ lifecycle ,
699+ buildpackManager ,
700+ runImageMirror ,
701+ )
702+ })
703+ assert .Nil (err )
704+
705+ // register task to be run to 'clean up' a task
706+ suiteManager .RegisterCleanUp ("clean-" + key , func () error {
707+ imageManager .CleanupImages (value )
708+ return nil
709+ })
710+ builderName = value
711+
712+ output := pack .RunSuccessfully (
713+ "config" , "run-image-mirrors" , "add" , "pack-test/run" , "--mirror" , "some-registry.com/pack-test/run1" )
714+ assertOutput := assertions .NewOutputAssertionManager (t , output )
715+ assertOutput .ReportsSuccesfulRunImageMirrorsAdd ("pack-test/run" , "some-registry.com/pack-test/run1" )
716+ })
717+ when ("builder has duplicate buildpacks" , func () {
718+ it ("buildpack layers have no duplication" , func () {
719+ out , _ , err := dockerCli .ImageInspectWithRaw (context .Background (), builderName )
720+ assert .Nil (err )
721+
722+ layerSet := map [string ]interface {}{}
723+ for _ , layer := range out .RootFS .Layers {
724+ _ , ok := layerSet [layer ]
725+ if ok {
726+ t .Fatalf ("duplicate layer found in builder %s" , layer )
727+ }
728+ layerSet [layer ] = true
729+ }
730+ })
731+ })
732+ })
733+
676734 when ("builder.toml is invalid" , func () {
677735 it ("displays an error" , func () {
678736 builderConfigPath := createBuilderPack .FixtureManager ().FixtureLocation ("invalid_builder.toml" )
@@ -1910,6 +1968,7 @@ include = [ "*.jar", "media/mountain.jpg", "/media/person.png", ]
19101968 it .Before (func () {
19111969 // create our nested builder
19121970 h .SkipIf (t , imageManager .HostOS () == "windows" , "These tests are not yet compatible with Windows-based containers" )
1971+ h .SkipIf (t , ! pack .SupportsFeature (invoke .BuilderNoDuplicateLayers ), "bug fixed in 0.18.0" )
19131972
19141973 // create a task, handled by a 'task manager' which executes our pack commands during tests.
19151974 // looks like this is used to de-dup tasks
@@ -2426,12 +2485,14 @@ func createComplexBuilder(t *testing.T,
24262485 packageImageName := registryConfig .RepoName ("nested-level-1-buildpack-" + h .RandString (8 ))
24272486 nestedLevelTwoBuildpackName := registryConfig .RepoName ("nested-level-2-buildpack-" + h .RandString (8 ))
24282487 simpleLayersBuildpackName := registryConfig .RepoName ("simple-layers-buildpack-" + h .RandString (8 ))
2488+ simpleLayersBuildpackDifferentShaName := registryConfig .RepoName ("simple-layers-buildpack-different-name-" + h .RandString (8 ))
24292489
24302490 templateMapping ["package_id" ] = "simple/nested-level-1"
24312491 templateMapping ["package_image_name" ] = packageImageName
24322492 templateMapping ["nested_level_1_buildpack" ] = packageImageName
24332493 templateMapping ["nested_level_2_buildpack" ] = nestedLevelTwoBuildpackName
24342494 templateMapping ["simple_layers_buildpack" ] = simpleLayersBuildpackName
2495+ templateMapping ["simple_layers_buildpack_different_sha" ] = simpleLayersBuildpackDifferentShaName
24352496
24362497 fixtureManager := pack .FixtureManager ()
24372498
@@ -2452,6 +2513,7 @@ func createComplexBuilder(t *testing.T,
24522513 nestedLevelTwoConfigFile ,
24532514 templateMapping ,
24542515 )
2516+
24552517 err = nestedLevelTwoConfigFile .Close ()
24562518 assert .Nil (err )
24572519
@@ -2481,11 +2543,20 @@ func createComplexBuilder(t *testing.T,
24812543 ),
24822544 )
24832545
2484- defer imageManager .CleanupImages (packageImageName , nestedLevelTwoBuildpackName , simpleLayersBuildpackName )
2546+ simpleLayersDifferentShaBuildpack := buildpacks .NewPackageImage (
2547+ t ,
2548+ pack ,
2549+ simpleLayersBuildpackDifferentShaName ,
2550+ fixtureManager .FixtureLocation ("simple-layers-buildpack-different-sha_package.toml" ),
2551+ buildpacks .WithRequiredBuildpacks (buildpacks .SimpleLayersDifferentSha ),
2552+ )
2553+
2554+ defer imageManager .CleanupImages (packageImageName , nestedLevelTwoBuildpackName , simpleLayersBuildpackName , simpleLayersBuildpackDifferentShaName )
24852555
24862556 builderBuildpacks = append (
24872557 builderBuildpacks ,
24882558 packageImageBuildpack ,
2559+ simpleLayersDifferentShaBuildpack ,
24892560 )
24902561
24912562 buildpackManager .PrepareBuildpacks (tmpDir , builderBuildpacks ... )
0 commit comments