github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/droplet_runner/command_factory/zipper/zipper_test.go (about) 1 package zipper_test 2 3 import ( 4 "archive/zip" 5 "errors" 6 "fmt" 7 "io" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 15 "github.com/cloudfoundry-incubator/ltc/droplet_runner/command_factory/cf_ignore/fake_cf_ignore" 16 zipper_package "github.com/cloudfoundry-incubator/ltc/droplet_runner/command_factory/zipper" 17 ) 18 19 var _ = Describe("Zipper", func() { 20 var zipper zipper_package.Zipper 21 22 BeforeEach(func() { 23 zipper = &zipper_package.DropletArtifactZipper{} 24 }) 25 26 Describe("#Zip", func() { 27 var ( 28 prevDir, tmpDir string 29 err error 30 31 fakeCFIgnore *fake_cf_ignore.FakeCFIgnore 32 ) 33 34 BeforeEach(func() { 35 fakeCFIgnore = &fake_cf_ignore.FakeCFIgnore{} 36 37 tmpDir, err = ioutil.TempDir(os.TempDir(), "zip_contents") 38 Expect(err).NotTo(HaveOccurred()) 39 40 Expect(ioutil.WriteFile(filepath.Join(tmpDir, "ccc"), []byte("ccc contents"), 0644)).To(Succeed()) 41 Expect(os.Symlink("ccc", filepath.Join(tmpDir, "ddd"))).To(Succeed()) 42 Expect(ioutil.WriteFile(filepath.Join(tmpDir, "some-ignored-file"), []byte("ignored contents"), 0644)).To(Succeed()) 43 44 Expect(os.Mkdir(filepath.Join(tmpDir, "subfolder"), 0755)).To(Succeed()) 45 Expect(ioutil.WriteFile(filepath.Join(tmpDir, "subfolder", "sub"), []byte("sub contents"), 0644)).To(Succeed()) 46 47 prevDir, err = os.Getwd() 48 Expect(err).NotTo(HaveOccurred()) 49 Expect(os.Chdir(tmpDir)).To(Succeed()) 50 51 fakeCFIgnore.ShouldIgnoreStub = func(path string) bool { 52 return path == "some-ignored-file" 53 } 54 }) 55 56 AfterEach(func() { 57 Expect(os.Chdir(prevDir)).To(Succeed()) 58 Expect(os.RemoveAll(tmpDir)).To(Succeed()) 59 }) 60 61 It("zips successfully", func() { 62 zipPath, err := zipper.Zip(tmpDir, fakeCFIgnore) 63 Expect(err).NotTo(HaveOccurred()) 64 65 zipReader, err := zip.OpenReader(zipPath) 66 Expect(err).NotTo(HaveOccurred()) 67 68 Expect(zipReader.File).To(HaveLen(4)) 69 70 buffer := make([]byte, 12) 71 h := zipReader.File[0].FileHeader 72 f, err := zipReader.File[0].Open() 73 Expect(err).NotTo(HaveOccurred()) 74 defer f.Close() 75 Expect(h.Name).To(Equal("ccc")) 76 Expect(f.Read(buffer)).To(Equal(12)) 77 Expect(string(buffer)).To(Equal("ccc contents")) 78 79 buffer = make([]byte, 3) 80 h = zipReader.File[1].FileHeader 81 f, err = zipReader.File[1].Open() 82 Expect(err).NotTo(HaveOccurred()) 83 defer f.Close() 84 Expect(h.Name).To(Equal("ddd")) 85 Expect(h.FileInfo().Mode() & os.ModeSymlink).To(Equal(os.ModeSymlink)) 86 Expect(f.Read(buffer)).To(Equal(3)) 87 Expect(string(buffer)).To(Equal("ccc")) 88 89 buffer = make([]byte, 1) 90 h = zipReader.File[2].FileHeader 91 f, err = zipReader.File[2].Open() 92 Expect(err).NotTo(HaveOccurred()) 93 defer f.Close() 94 Expect(h.Name).To(Equal("subfolder/")) 95 Expect(h.FileInfo().IsDir()).To(BeTrue()) 96 _, err = f.Read(buffer) 97 Expect(err).To(MatchError("EOF")) 98 99 buffer = make([]byte, 12) 100 h = zipReader.File[3].FileHeader 101 f, err = zipReader.File[3].Open() 102 Expect(err).NotTo(HaveOccurred()) 103 defer f.Close() 104 Expect(h.Name).To(Equal("subfolder/sub")) 105 Expect(f.Read(buffer)).To(Equal(12)) 106 Expect(string(buffer)).To(Equal("sub contents")) 107 }) 108 109 Context("failure", func() { 110 It("returns an error if passed a non-directory", func() { 111 _, err := zipper.Zip(filepath.Join(tmpDir, "ccc"), fakeCFIgnore) 112 Expect(err).To(MatchError(fmt.Sprintf("%s must be a directory", filepath.Join(tmpDir, "ccc")))) 113 }) 114 115 It("returns an error if .cfignore can't be parsed", func() { 116 Expect(ioutil.WriteFile(filepath.Join(tmpDir, ".cfignore"), []byte{}, 0600)).To(Succeed()) 117 fakeCFIgnore.ParseReturns(errors.New("no")) 118 _, err := zipper.Zip(tmpDir, fakeCFIgnore) 119 Expect(err).To(MatchError("no")) 120 }) 121 }) 122 }) 123 124 Describe("#Unzip", func() { 125 var ( 126 prevDir, tmpDir string 127 err error 128 tmpFile *os.File 129 ) 130 131 BeforeEach(func() { 132 133 tmpDir, err = ioutil.TempDir(os.TempDir(), "unzip_contents") 134 Expect(err).NotTo(HaveOccurred()) 135 136 prevDir, err = os.Getwd() 137 Expect(err).NotTo(HaveOccurred()) 138 Expect(os.Chdir(tmpDir)).To(Succeed()) 139 140 tmpFile, err = ioutil.TempFile("", "zipfile") 141 Expect(err).NotTo(HaveOccurred()) 142 defer tmpFile.Close() 143 144 zipWriter := zip.NewWriter(tmpFile) 145 defer zipWriter.Close() 146 147 var ( 148 w io.Writer 149 length int 150 header *zip.FileHeader 151 ) 152 153 header = &zip.FileHeader{Name: "aaa"} 154 w, err = zipWriter.CreateHeader(header) 155 Expect(err).NotTo(HaveOccurred()) 156 length, err = w.Write([]byte("aaaaa")) 157 Expect(length).To(Equal(5)) 158 Expect(err).NotTo(HaveOccurred()) 159 160 header = &zip.FileHeader{Name: "bbb/1.txt"} 161 w, err = zipWriter.CreateHeader(header) 162 Expect(err).NotTo(HaveOccurred()) 163 length, err = w.Write([]byte("one")) 164 Expect(length).To(Equal(3)) 165 Expect(err).NotTo(HaveOccurred()) 166 167 header = &zip.FileHeader{Name: "bbb/2.txt"} 168 w, err = zipWriter.CreateHeader(header) 169 Expect(err).NotTo(HaveOccurred()) 170 length, err = w.Write([]byte("twoo")) 171 Expect(length).To(Equal(4)) 172 Expect(err).NotTo(HaveOccurred()) 173 174 header = &zip.FileHeader{Name: "ddd/3.txt"} 175 w, err = zipWriter.CreateHeader(header) 176 Expect(err).NotTo(HaveOccurred()) 177 length, err = w.Write([]byte("three")) 178 Expect(length).To(Equal(5)) 179 Expect(err).NotTo(HaveOccurred()) 180 }) 181 182 AfterEach(func() { 183 tmpFile.Close() 184 os.Remove(tmpFile.Name()) 185 }) 186 187 It("unzips", func() { 188 Expect(zipper.Unzip(tmpFile.Name(), tmpDir)).To(Succeed()) 189 190 var ( 191 contents []byte 192 err error 193 ) 194 195 contents, err = ioutil.ReadFile(filepath.Join(tmpDir, "aaa")) 196 Expect(err).NotTo(HaveOccurred()) 197 Expect(string(contents)).To(Equal("aaaaa")) 198 199 _, err = os.Stat(filepath.Join(tmpDir, "aaa")) 200 Expect(err).NotTo(HaveOccurred()) 201 202 _, err = os.Stat(filepath.Join(tmpDir, "bbb")) 203 Expect(err).NotTo(HaveOccurred()) 204 205 contents, err = ioutil.ReadFile(filepath.Join(tmpDir, "bbb", "1.txt")) 206 Expect(err).NotTo(HaveOccurred()) 207 Expect(string(contents)).To(Equal("one")) 208 209 _, err = os.Stat(filepath.Join(tmpDir, "bbb", "1.txt")) 210 Expect(err).NotTo(HaveOccurred()) 211 212 contents, err = ioutil.ReadFile(filepath.Join(tmpDir, "bbb", "2.txt")) 213 Expect(err).NotTo(HaveOccurred()) 214 Expect(string(contents)).To(Equal("twoo")) 215 216 _, err = os.Stat(filepath.Join(tmpDir, "bbb", "2.txt")) 217 Expect(err).NotTo(HaveOccurred()) 218 219 _, err = os.Stat(filepath.Join(tmpDir, "ccc")) 220 Expect(err).To(HaveOccurred()) 221 222 contents, err = ioutil.ReadFile(filepath.Join(tmpDir, "ddd", "3.txt")) 223 Expect(err).NotTo(HaveOccurred()) 224 Expect(string(contents)).To(Equal("three")) 225 226 _, err = os.Stat(filepath.Join(tmpDir, "ddd")) 227 Expect(err).NotTo(HaveOccurred()) 228 }) 229 }) 230 231 Describe("#IsZipFile", func() { 232 It("accepts zip files", func() { 233 minimalZipBytes := []byte{'P', 'K', 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 234 235 tmpFile, err := ioutil.TempFile(os.TempDir(), "emptyzip") 236 Expect(err).NotTo(HaveOccurred()) 237 Expect(ioutil.WriteFile(tmpFile.Name(), minimalZipBytes, 0700)).To(Succeed()) 238 defer func() { 239 tmpFile.Close() 240 os.Remove(tmpFile.Name()) 241 }() 242 243 Expect(zipper.IsZipFile(tmpFile.Name())).To(BeTrue()) 244 }) 245 246 It("rejects non-zip files", func() { 247 tmpFile, err := ioutil.TempFile(os.TempDir(), "badzip") 248 Expect(err).NotTo(HaveOccurred()) 249 Expect(ioutil.WriteFile(tmpFile.Name(), []byte("I promise I'm a zip file"), 0700)).To(Succeed()) 250 defer func() { 251 tmpFile.Close() 252 os.Remove(tmpFile.Name()) 253 }() 254 255 Expect(zipper.IsZipFile(tmpFile.Name())).To(BeFalse()) 256 }) 257 }) 258 })