github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/actor/v2action/resource_windows_test.go (about) 1 package v2action_test 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 8 . "code.cloudfoundry.org/cli/actor/v2action" 9 "code.cloudfoundry.org/cli/actor/v2action/v2actionfakes" 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 fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient 19 srcDir string 20 ) 21 22 BeforeEach(func() { 23 fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient) 24 actor = NewActor(fakeCloudControllerClient, nil) 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 archive string 51 52 BeforeEach(func() { 53 tmpfile, err := ioutil.TempFile("", "gather-archive-resource-test") 54 Expect(err).ToNot(HaveOccurred()) 55 defer tmpfile.Close() 56 archive = tmpfile.Name() 57 58 err = zipit(srcDir, archive, "") 59 Expect(err).ToNot(HaveOccurred()) 60 }) 61 62 AfterEach(func() { 63 Expect(os.RemoveAll(archive)).ToNot(HaveOccurred()) 64 }) 65 66 It("gathers a list of all files in a source archive", func() { 67 resources, err := actor.GatherArchiveResources(archive) 68 Expect(err).ToNot(HaveOccurred()) 69 70 Expect(resources).To(Equal( 71 []Resource{ 72 {Filename: "/", Mode: DefaultFolderPermissions}, 73 {Filename: "/level1/", Mode: DefaultFolderPermissions}, 74 {Filename: "/level1/level2/", Mode: DefaultFolderPermissions}, 75 {Filename: "/level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: DefaultArchiveFilePermissions}, 76 {Filename: "/tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: DefaultArchiveFilePermissions}, 77 {Filename: "/tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: DefaultArchiveFilePermissions}, 78 })) 79 }) 80 }) 81 82 Context("when the archive does not exist", func() { 83 It("returns an error if the file is problematic", func() { 84 _, err := actor.GatherArchiveResources("/does/not/exist") 85 Expect(os.IsNotExist(err)).To(BeTrue()) 86 }) 87 }) 88 }) 89 90 Describe("GatherDirectoryResources", func() { 91 Context("when files exist in the directory", func() { 92 It("gathers a list of all directories files in a source directory", func() { 93 resources, err := actor.GatherDirectoryResources(srcDir) 94 Expect(err).ToNot(HaveOccurred()) 95 96 Expect(resources).To(Equal( 97 []Resource{ 98 {Filename: "level1", Mode: DefaultFolderPermissions}, 99 {Filename: "level1/level2", Mode: DefaultFolderPermissions}, 100 {Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0766}, 101 {Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0766}, 102 {Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0766}, 103 })) 104 }) 105 }) 106 107 Context("when the directory is empty", func() { 108 var emptyDir string 109 110 BeforeEach(func() { 111 var err error 112 emptyDir, err = ioutil.TempDir("", "v2-resource-actions-empty") 113 Expect(err).ToNot(HaveOccurred()) 114 }) 115 116 AfterEach(func() { 117 Expect(os.RemoveAll(emptyDir)).ToNot(HaveOccurred()) 118 }) 119 120 It("returns an EmptyDirectoryError", func() { 121 _, err := actor.GatherDirectoryResources(emptyDir) 122 Expect(err).To(MatchError(EmptyDirectoryError{Path: emptyDir})) 123 }) 124 }) 125 }) 126 127 Describe("ZipDirectoryResources", func() { 128 var ( 129 resultZip string 130 resources []Resource 131 executeErr error 132 ) 133 134 BeforeEach(func() { 135 resources = []Resource{ 136 {Filename: "level1", Mode: DefaultFolderPermissions}, 137 {Filename: "level1/level2", Mode: DefaultFolderPermissions}, 138 {Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0766}, 139 {Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0766}, 140 {Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0766}, 141 } 142 }) 143 144 JustBeforeEach(func() { 145 resultZip, executeErr = actor.ZipDirectoryResources(srcDir, resources) 146 }) 147 148 AfterEach(func() { 149 err := os.RemoveAll(srcDir) 150 Expect(err).ToNot(HaveOccurred()) 151 152 err = os.RemoveAll(resultZip) 153 Expect(err).ToNot(HaveOccurred()) 154 }) 155 156 Context("when zipping on windows", func() { 157 It("zips the directory and sets all the file modes to 07XX", func() { 158 Expect(executeErr).ToNot(HaveOccurred()) 159 160 Expect(resultZip).ToNot(BeEmpty()) 161 zipFile, err := os.Open(resultZip) 162 Expect(err).ToNot(HaveOccurred()) 163 defer zipFile.Close() 164 165 zipInfo, err := zipFile.Stat() 166 Expect(err).ToNot(HaveOccurred()) 167 168 reader, err := ykk.NewReader(zipFile, zipInfo.Size()) 169 Expect(err).ToNot(HaveOccurred()) 170 171 Expect(reader.File).To(HaveLen(5)) 172 Expect(reader.File[2].Mode()).To(Equal(os.FileMode(0766))) 173 Expect(reader.File[3].Mode()).To(Equal(os.FileMode(0766))) 174 Expect(reader.File[4].Mode()).To(Equal(os.FileMode(0766))) 175 }) 176 }) 177 }) 178 })