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