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

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