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  })