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