github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+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/ykk" 11 . "github.com/liamawhite/cli-with-i18n/actor/sharedaction" 12 "github.com/liamawhite/cli-with-i18n/actor/sharedaction/sharedactionfakes" 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 })