github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/sharedaction/resource_unix_test.go (about)

     1  // +build !windows
     2  
     3  package sharedaction_test
     4  
     5  import (
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	. "code.cloudfoundry.org/cli/actor/sharedaction"
    11  	"code.cloudfoundry.org/cli/actor/sharedaction/sharedactionfakes"
    12  	"code.cloudfoundry.org/ykk"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Resource Actions", func() {
    18  	var (
    19  		actor      *Actor
    20  		fakeConfig *sharedactionfakes.FakeConfig
    21  		srcDir     string
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		fakeConfig = new(sharedactionfakes.FakeConfig)
    26  		actor = NewActor(fakeConfig)
    27  
    28  		var err error
    29  		srcDir, err = ioutil.TempDir("", "v2-resource-actions")
    30  		Expect(err).ToNot(HaveOccurred())
    31  
    32  		subDir := filepath.Join(srcDir, "level1", "level2")
    33  		err = os.MkdirAll(subDir, 0777)
    34  		Expect(err).ToNot(HaveOccurred())
    35  
    36  		err = ioutil.WriteFile(filepath.Join(subDir, "tmpFile1"), []byte("why hello"), 0644)
    37  		Expect(err).ToNot(HaveOccurred())
    38  
    39  		err = ioutil.WriteFile(filepath.Join(srcDir, "tmpFile2"), []byte("Hello, Binky"), 0751)
    40  		Expect(err).ToNot(HaveOccurred())
    41  
    42  		err = ioutil.WriteFile(filepath.Join(srcDir, "tmpFile3"), []byte("Bananarama"), 0655)
    43  		Expect(err).ToNot(HaveOccurred())
    44  	})
    45  
    46  	AfterEach(func() {
    47  		Expect(os.RemoveAll(srcDir)).ToNot(HaveOccurred())
    48  	})
    49  
    50  	Describe("GatherArchiveResources", func() {
    51  		Context("when the archive exists", func() {
    52  			var (
    53  				archive string
    54  
    55  				resources  []Resource
    56  				executeErr error
    57  			)
    58  
    59  			BeforeEach(func() {
    60  				tmpfile, err := ioutil.TempFile("", "example")
    61  				Expect(err).ToNot(HaveOccurred())
    62  				archive = tmpfile.Name()
    63  				Expect(tmpfile.Close()).ToNot(HaveOccurred())
    64  			})
    65  
    66  			JustBeforeEach(func() {
    67  				err := zipit(srcDir, archive, "")
    68  				Expect(err).ToNot(HaveOccurred())
    69  
    70  				resources, executeErr = actor.GatherArchiveResources(archive)
    71  			})
    72  
    73  			AfterEach(func() {
    74  				Expect(os.RemoveAll(archive)).ToNot(HaveOccurred())
    75  			})
    76  
    77  			It("gathers a list of all files in a source archive", func() {
    78  				Expect(executeErr).ToNot(HaveOccurred())
    79  
    80  				Expect(resources).To(Equal(
    81  					[]Resource{
    82  						{Filename: "/", Mode: DefaultFolderPermissions},
    83  						{Filename: "/level1/", Mode: DefaultFolderPermissions},
    84  						{Filename: "/level1/level2/", Mode: DefaultFolderPermissions},
    85  						{Filename: "/level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: DefaultArchiveFilePermissions},
    86  						{Filename: "/tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: DefaultArchiveFilePermissions},
    87  						{Filename: "/tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: DefaultArchiveFilePermissions},
    88  					}))
    89  			})
    90  
    91  			Context("when a .cfignore file exists in the archive", func() {
    92  				BeforeEach(func() {
    93  					err := ioutil.WriteFile(filepath.Join(srcDir, ".cfignore"), []byte("level2"), 0655)
    94  					Expect(err).ToNot(HaveOccurred())
    95  				})
    96  
    97  				It("excludes all patterns of files mentioned in .cfignore", func() {
    98  					Expect(executeErr).ToNot(HaveOccurred())
    99  
   100  					Expect(resources).To(Equal(
   101  						[]Resource{
   102  							{Filename: "/", Mode: DefaultFolderPermissions},
   103  							{Filename: "/level1/", Mode: DefaultFolderPermissions},
   104  							{Filename: "/tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: DefaultArchiveFilePermissions},
   105  							{Filename: "/tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: DefaultArchiveFilePermissions},
   106  						}))
   107  				})
   108  			})
   109  
   110  			Context("when default ignored files exist in the archive", func() {
   111  				BeforeEach(func() {
   112  					for _, filename := range DefaultIgnoreLines {
   113  						if filename != ".cfignore" {
   114  							err := ioutil.WriteFile(filepath.Join(srcDir, filename), nil, 0655)
   115  							Expect(err).ToNot(HaveOccurred())
   116  							err = ioutil.WriteFile(filepath.Join(srcDir, "level1", filename), nil, 0655)
   117  							Expect(err).ToNot(HaveOccurred())
   118  						}
   119  					}
   120  				})
   121  
   122  				It("excludes all default files", func() {
   123  					Expect(executeErr).ToNot(HaveOccurred())
   124  
   125  					Expect(resources).To(Equal(
   126  						[]Resource{
   127  							{Filename: "/", Mode: DefaultFolderPermissions},
   128  							{Filename: "/level1/", Mode: DefaultFolderPermissions},
   129  							{Filename: "/level1/level2/", Mode: DefaultFolderPermissions},
   130  							{Filename: "/level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: DefaultArchiveFilePermissions},
   131  							{Filename: "/tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: DefaultArchiveFilePermissions},
   132  							{Filename: "/tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: DefaultArchiveFilePermissions},
   133  						}))
   134  				})
   135  			})
   136  		})
   137  
   138  		Context("when the archive does not exist", func() {
   139  			It("returns an error if the file is problematic", func() {
   140  				_, err := actor.GatherArchiveResources("/does/not/exist")
   141  				Expect(os.IsNotExist(err)).To(BeTrue())
   142  			})
   143  		})
   144  	})
   145  
   146  	Describe("GatherDirectoryResources", func() {
   147  		Context("when files exist in the directory", func() {
   148  			var (
   149  				gatheredResources []Resource
   150  				executeErr        error
   151  			)
   152  
   153  			JustBeforeEach(func() {
   154  				gatheredResources, executeErr = actor.GatherDirectoryResources(srcDir)
   155  			})
   156  
   157  			It("gathers a list of all directories files in a source directory", func() {
   158  				Expect(executeErr).ToNot(HaveOccurred())
   159  
   160  				Expect(gatheredResources).To(Equal(
   161  					[]Resource{
   162  						{Filename: "level1", Mode: DefaultFolderPermissions},
   163  						{Filename: "level1/level2", Mode: DefaultFolderPermissions},
   164  						{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   165  						{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   166  						{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   167  					}))
   168  			})
   169  
   170  			Context("when a .cfignore file exists in the sourceDir", func() {
   171  				BeforeEach(func() {
   172  					err := ioutil.WriteFile(filepath.Join(srcDir, ".cfignore"), []byte("level2"), 0655)
   173  					Expect(err).ToNot(HaveOccurred())
   174  				})
   175  
   176  				It("excludes all patterns of files mentioned in .cfignore", func() {
   177  					Expect(executeErr).ToNot(HaveOccurred())
   178  
   179  					Expect(gatheredResources).To(Equal(
   180  						[]Resource{
   181  							{Filename: "level1", Mode: DefaultFolderPermissions},
   182  							{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   183  							{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   184  						}))
   185  				})
   186  			})
   187  
   188  			Context("when default ignored files exist in the app dir", func() {
   189  				BeforeEach(func() {
   190  					for _, filename := range DefaultIgnoreLines {
   191  						if filename != ".cfignore" {
   192  							err := ioutil.WriteFile(filepath.Join(srcDir, filename), nil, 0655)
   193  							Expect(err).ToNot(HaveOccurred())
   194  							err = ioutil.WriteFile(filepath.Join(srcDir, "level1", filename), nil, 0655)
   195  							Expect(err).ToNot(HaveOccurred())
   196  						}
   197  					}
   198  				})
   199  
   200  				It("excludes all default files", func() {
   201  					Expect(executeErr).ToNot(HaveOccurred())
   202  
   203  					Expect(gatheredResources).To(Equal(
   204  						[]Resource{
   205  							{Filename: "level1", Mode: DefaultFolderPermissions},
   206  							{Filename: "level1/level2", Mode: DefaultFolderPermissions},
   207  							{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   208  							{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   209  							{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   210  						}))
   211  				})
   212  			})
   213  
   214  			Context("when trace files are in the source directory", func() {
   215  				BeforeEach(func() {
   216  					traceFilePath := filepath.Join(srcDir, "i-am-trace.txt")
   217  					err := ioutil.WriteFile(traceFilePath, nil, 0655)
   218  					Expect(err).ToNot(HaveOccurred())
   219  
   220  					fakeConfig.VerboseReturns(false, []string{traceFilePath, "/some-other-path"})
   221  				})
   222  
   223  				It("excludes all of the trace files", func() {
   224  					Expect(executeErr).ToNot(HaveOccurred())
   225  
   226  					Expect(gatheredResources).To(Equal(
   227  						[]Resource{
   228  							{Filename: "level1", Mode: DefaultFolderPermissions},
   229  							{Filename: "level1/level2", Mode: DefaultFolderPermissions},
   230  							{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   231  							{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   232  							{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   233  						}))
   234  				})
   235  			})
   236  		})
   237  
   238  		Context("when the directory is empty", func() {
   239  			var emptyDir string
   240  
   241  			BeforeEach(func() {
   242  				var err error
   243  				emptyDir, err = ioutil.TempDir("", "v2-resource-actions-empty")
   244  				Expect(err).ToNot(HaveOccurred())
   245  			})
   246  
   247  			AfterEach(func() {
   248  				Expect(os.RemoveAll(emptyDir)).ToNot(HaveOccurred())
   249  			})
   250  
   251  			It("returns an EmptyDirectoryError", func() {
   252  				_, err := actor.GatherDirectoryResources(emptyDir)
   253  				Expect(err).To(MatchError(EmptyDirectoryError{Path: emptyDir}))
   254  			})
   255  		})
   256  	})
   257  
   258  	Describe("ZipDirectoryResources", func() {
   259  		var (
   260  			resultZip  string
   261  			resources  []Resource
   262  			executeErr error
   263  		)
   264  
   265  		BeforeEach(func() {
   266  			resources = []Resource{
   267  				{Filename: "level1"},
   268  				{Filename: "level1/level2"},
   269  				{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   270  				{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   271  				{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   272  			}
   273  		})
   274  
   275  		JustBeforeEach(func() {
   276  			resultZip, executeErr = actor.ZipDirectoryResources(srcDir, resources)
   277  		})
   278  
   279  		AfterEach(func() {
   280  			err := os.RemoveAll(srcDir)
   281  			Expect(err).ToNot(HaveOccurred())
   282  
   283  			err = os.RemoveAll(resultZip)
   284  			Expect(err).ToNot(HaveOccurred())
   285  		})
   286  
   287  		Context("when zipping on UNIX", func() {
   288  			It("zips the directory and keeps the file permissions", func() {
   289  				Expect(executeErr).ToNot(HaveOccurred())
   290  
   291  				Expect(resultZip).ToNot(BeEmpty())
   292  				zipFile, err := os.Open(resultZip)
   293  				Expect(err).ToNot(HaveOccurred())
   294  				defer zipFile.Close()
   295  
   296  				zipInfo, err := zipFile.Stat()
   297  				Expect(err).ToNot(HaveOccurred())
   298  
   299  				reader, err := ykk.NewReader(zipFile, zipInfo.Size())
   300  				Expect(err).ToNot(HaveOccurred())
   301  
   302  				Expect(reader.File).To(HaveLen(5))
   303  				Expect(reader.File[2].Mode()).To(Equal(os.FileMode(0644)))
   304  				Expect(reader.File[3].Mode()).To(Equal(os.FileMode(0751)))
   305  				Expect(reader.File[4].Mode()).To(Equal(os.FileMode(0655)))
   306  			})
   307  		})
   308  	})
   309  })