github.com/paketo-buildpacks/packit@v1.3.2-0.20211206231111-86b75c657449/layer_test.go (about) 1 package packit_test 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "github.com/paketo-buildpacks/packit" 9 "github.com/sclevine/spec" 10 11 . "github.com/onsi/gomega" 12 ) 13 14 func testLayer(t *testing.T, context spec.G, it spec.S) { 15 var ( 16 Expect = NewWithT(t).Expect 17 18 layersDir string 19 ) 20 21 it.Before(func() { 22 var err error 23 layersDir, err = os.MkdirTemp("", "layers") 24 Expect(err).NotTo(HaveOccurred()) 25 }) 26 27 it.After(func() { 28 Expect(os.RemoveAll(layersDir)).To(Succeed()) 29 }) 30 31 context("Reset", func() { 32 var layer packit.Layer 33 34 context("when there is no previous build", func() { 35 it.Before(func() { 36 layer = packit.Layer{ 37 Name: "some-layer", 38 Path: filepath.Join(layersDir, "some-layer"), 39 Launch: true, 40 Build: true, 41 Cache: true, 42 } 43 }) 44 45 it("initializes an empty layer", func() { 46 var err error 47 layer, err = layer.Reset() 48 Expect(err).NotTo(HaveOccurred()) 49 50 Expect(layer).To(Equal(packit.Layer{ 51 Name: "some-layer", 52 Path: filepath.Join(layersDir, "some-layer"), 53 Launch: false, 54 Build: false, 55 Cache: false, 56 SharedEnv: packit.Environment{}, 57 BuildEnv: packit.Environment{}, 58 LaunchEnv: packit.Environment{}, 59 ProcessLaunchEnv: map[string]packit.Environment{}, 60 })) 61 62 Expect(filepath.Join(layersDir, "some-layer")).To(BeADirectory()) 63 }) 64 }) 65 66 context("when cache is retrieved from previous build", func() { 67 it.Before(func() { 68 sharedEnvDir := filepath.Join(layersDir, "some-layer", "env") 69 Expect(os.MkdirAll(sharedEnvDir, os.ModePerm)).To(Succeed()) 70 71 err := os.WriteFile(filepath.Join(sharedEnvDir, "OVERRIDE_VAR.override"), []byte("override-value"), 0600) 72 Expect(err).NotTo(HaveOccurred()) 73 74 buildEnvDir := filepath.Join(layersDir, "some-layer", "env.build") 75 Expect(os.MkdirAll(buildEnvDir, os.ModePerm)).To(Succeed()) 76 77 err = os.WriteFile(filepath.Join(buildEnvDir, "DEFAULT_VAR.default"), []byte("default-value"), 0600) 78 Expect(err).NotTo(HaveOccurred()) 79 80 err = os.WriteFile(filepath.Join(buildEnvDir, "INVALID_VAR.invalid"), []byte("invalid-value"), 0600) 81 Expect(err).NotTo(HaveOccurred()) 82 83 launchEnvDir := filepath.Join(layersDir, "some-layer", "env.launch") 84 Expect(os.MkdirAll(launchEnvDir, os.ModePerm)).To(Succeed()) 85 86 err = os.WriteFile(filepath.Join(launchEnvDir, "APPEND_VAR.append"), []byte("append-value"), 0600) 87 Expect(err).NotTo(HaveOccurred()) 88 89 err = os.WriteFile(filepath.Join(launchEnvDir, "APPEND_VAR.delim"), []byte("!"), 0600) 90 Expect(err).NotTo(HaveOccurred()) 91 92 layer = packit.Layer{ 93 Name: "some-layer", 94 Path: filepath.Join(layersDir, "some-layer"), 95 Launch: true, 96 Build: true, 97 Cache: true, 98 SharedEnv: packit.Environment{ 99 "OVERRIDE_VAR.override": "override-value", 100 }, 101 BuildEnv: packit.Environment{ 102 "DEFAULT_VAR.default": "default-value", 103 }, 104 LaunchEnv: packit.Environment{ 105 "APPEND_VAR.append": "append-value", 106 "APPEND_VAR.delim": "!", 107 }, 108 Metadata: map[string]interface{}{ 109 "some-key": "some-value", 110 }, 111 } 112 }) 113 114 context("when Reset is called on a layer", func() { 115 it("resets all of the layer data and clears the directory", func() { 116 var err error 117 layer, err = layer.Reset() 118 Expect(err).NotTo(HaveOccurred()) 119 120 Expect(layer).To(Equal(packit.Layer{ 121 Name: "some-layer", 122 Path: filepath.Join(layersDir, "some-layer"), 123 Launch: false, 124 Build: false, 125 Cache: false, 126 SharedEnv: packit.Environment{}, 127 BuildEnv: packit.Environment{}, 128 LaunchEnv: packit.Environment{}, 129 ProcessLaunchEnv: map[string]packit.Environment{}, 130 })) 131 132 Expect(filepath.Join(layersDir, "some-layer")).To(BeADirectory()) 133 134 files, err := filepath.Glob(filepath.Join(layersDir, "some-layer", "*")) 135 Expect(err).NotTo(HaveOccurred()) 136 137 Expect(files).To(BeEmpty()) 138 }) 139 }) 140 }) 141 142 context("failure cases", func() { 143 context("could not remove files in layer", func() { 144 it.Before(func() { 145 Expect(os.Chmod(layersDir, 0000)).To(Succeed()) 146 }) 147 148 it.After(func() { 149 Expect(os.Chmod(layersDir, 0777)).To(Succeed()) 150 }) 151 152 it("return an error", func() { 153 layer := packit.Layer{ 154 Name: "some-layer", 155 Path: filepath.Join(layersDir, "some-layer"), 156 } 157 158 _, err := layer.Reset() 159 Expect(err).To(MatchError(ContainSubstring("error could not remove file: "))) 160 Expect(err).To(MatchError(ContainSubstring("permission denied"))) 161 }) 162 }) 163 }) 164 }) 165 }