github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/app_files/zipper_test.go (about) 1 package app_files_test 2 3 import ( 4 "archive/zip" 5 "bytes" 6 . "github.com/cloudfoundry/cli/cf/app_files" 7 "github.com/cloudfoundry/gofileutils/fileutils" 8 . "github.com/onsi/ginkgo" 9 . "github.com/onsi/gomega" 10 "io" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 ) 15 16 func readFile(file *os.File) []byte { 17 bytes, err := ioutil.ReadAll(file) 18 Expect(err).NotTo(HaveOccurred()) 19 return bytes 20 } 21 22 var _ = Describe("Zipper", func() { 23 var filesInZip = []string{ 24 "foo.txt", 25 "fooDir/", 26 "fooDir/bar/", 27 "lastDir/", 28 "subDir/", 29 "subDir/bar.txt", 30 "subDir/otherDir/", 31 "subDir/otherDir/file.txt", 32 } 33 34 It("zips directories", func() { 35 fileutils.TempFile("zip_test", func(zipFile *os.File, err error) { 36 workingDir, err := os.Getwd() 37 Expect(err).NotTo(HaveOccurred()) 38 39 dir := filepath.Join(workingDir, "../../fixtures/zip/") 40 err = os.Chmod(filepath.Join(dir, "subDir/bar.txt"), 0666) 41 Expect(err).NotTo(HaveOccurred()) 42 43 zipper := ApplicationZipper{} 44 err = zipper.Zip(dir, zipFile) 45 Expect(err).NotTo(HaveOccurred()) 46 47 fileStat, err := zipFile.Stat() 48 Expect(err).NotTo(HaveOccurred()) 49 50 reader, err := zip.NewReader(zipFile, fileStat.Size()) 51 Expect(err).NotTo(HaveOccurred()) 52 53 filenames := []string{} 54 for _, file := range reader.File { 55 filenames = append(filenames, file.Name) 56 } 57 58 Expect(filenames).To(Equal(filesInZip)) 59 60 readFileInZip := func(index int) (string, string) { 61 buf := &bytes.Buffer{} 62 file := reader.File[index] 63 fReader, err := file.Open() 64 _, err = io.Copy(buf, fReader) 65 66 Expect(err).NotTo(HaveOccurred()) 67 68 return file.Name, string(buf.Bytes()) 69 } 70 71 Expect(err).NotTo(HaveOccurred()) 72 73 name, contents := readFileInZip(0) 74 Expect(name).To(Equal("foo.txt")) 75 Expect(contents).To(Equal("This is a simple text file.")) 76 77 name, contents = readFileInZip(5) 78 Expect(name).To(Equal("subDir/bar.txt")) 79 Expect(contents).To(Equal("I am in a subdirectory.")) 80 Expect(reader.File[5].FileInfo().Mode()).To(Equal(os.FileMode(0666))) 81 }) 82 }) 83 84 It("is a no-op for a zipfile", func() { 85 fileutils.TempFile("zip_test", func(zipFile *os.File, err error) { 86 dir, err := os.Getwd() 87 Expect(err).NotTo(HaveOccurred()) 88 89 zipper := ApplicationZipper{} 90 fixture := filepath.Join(dir, "../../fixtures/applications/example-app.zip") 91 err = zipper.Zip(fixture, zipFile) 92 Expect(err).NotTo(HaveOccurred()) 93 94 zippedFile, err := os.Open(fixture) 95 Expect(err).NotTo(HaveOccurred()) 96 Expect(readFile(zipFile)).To(Equal(readFile(zippedFile))) 97 }) 98 }) 99 100 It("returns an error when zipping fails", func() { 101 fileutils.TempFile("zip_test", func(zipFile *os.File, err error) { 102 zipper := ApplicationZipper{} 103 err = zipper.Zip("/a/bogus/directory", zipFile) 104 Expect(err).To(HaveOccurred()) 105 Expect(err.Error()).To(ContainSubstring("open /a/bogus/directory")) 106 }) 107 }) 108 109 It("returns an error when the directory is empty", func() { 110 fileutils.TempFile("zip_test", func(zipFile *os.File, err error) { 111 fileutils.TempDir("zip_test", func(emptyDir string, err error) { 112 zipper := ApplicationZipper{} 113 err = zipper.Zip(emptyDir, zipFile) 114 Expect(err).To(HaveOccurred()) 115 Expect(err.Error()).To(ContainSubstring("is empty")) 116 }) 117 }) 118 }) 119 120 Describe(".Unzip", func() { 121 It("extracts the zip file", func() { 122 filez := []string{ 123 "example-app/.cfignore", 124 "example-app/app.rb", 125 "example-app/config.ru", 126 "example-app/Gemfile", 127 "example-app/Gemfile.lock", 128 "example-app/ignore-me", 129 "example-app/manifest.yml", 130 } 131 132 dir, err := os.Getwd() 133 Expect(err).NotTo(HaveOccurred()) 134 fileutils.TempDir("unzipped_app", func(tmpDir string, err error) { 135 zipper := ApplicationZipper{} 136 137 fixture := filepath.Join(dir, "../../fixtures/applications/example-app.zip") 138 err = zipper.Unzip(fixture, tmpDir) 139 Expect(err).NotTo(HaveOccurred()) 140 for _, file := range filez { 141 _, err := os.Stat(filepath.Join(tmpDir, file)) 142 Expect(os.IsNotExist(err)).To(BeFalse()) 143 } 144 }) 145 }) 146 }) 147 148 Describe(".GetZipSize", func() { 149 var zipper = ApplicationZipper{} 150 151 It("returns the size of the zip file", func() { 152 dir, err := os.Getwd() 153 Expect(err).NotTo(HaveOccurred()) 154 zipFile := filepath.Join(dir, "../../fixtures/applications/example-app.zip") 155 156 file, err := os.Open(zipFile) 157 Expect(err).NotTo(HaveOccurred()) 158 159 fileSize, err := zipper.GetZipSize(file) 160 Expect(err).NotTo(HaveOccurred()) 161 Expect(fileSize).To(Equal(int64(1803))) 162 }) 163 164 It("returns an error if the zip file cannot be found", func() { 165 tmpFile, _ := os.Open("fooBar") 166 _, sizeErr := zipper.GetZipSize(tmpFile) 167 Expect(sizeErr).To(HaveOccurred()) 168 }) 169 }) 170 })