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  }