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 })