github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/package_stemcell/stemcell_generator/tar/tar_writer_test.go (about)

     1  package tar_test
     2  
     3  import (
     4  	archiveTar "archive/tar"
     5  	"bytes"
     6  	"compress/gzip"
     7  	"github.com/cloudfoundry-incubator/stembuild/package_stemcell/stemcell_generator/tar/tarfakes"
     8  	"io"
     9  	"io/ioutil"
    10  	"os"
    11  	"path/filepath"
    12  
    13  	"github.com/cloudfoundry-incubator/stembuild/package_stemcell/stemcell_generator/tar"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  var _ = Describe("TarWriter", func() {
    19  	Describe("Write", func() {
    20  		var (
    21  			workingDir  string
    22  			fakeTarable *tarfakes.FakeTarable
    23  		)
    24  
    25  		BeforeEach(func() {
    26  			tmpDir := os.TempDir()
    27  			var err error
    28  			workingDir, err = ioutil.TempDir(tmpDir, "TarWriterTest")
    29  			Expect(err).NotTo(HaveOccurred())
    30  
    31  			fakeFile := bytes.NewReader([]byte{})
    32  			fakeTarable = &tarfakes.FakeTarable{}
    33  			fakeTarable.ReadStub = fakeFile.Read
    34  			fakeTarable.SizeStub = fakeFile.Size
    35  			fakeTarable.NameReturns("some-file")
    36  		})
    37  
    38  		AfterEach(func() {
    39  			os.RemoveAll(workingDir)
    40  		})
    41  
    42  		It("should not fail", func() {
    43  			w := tar.NewTarWriter()
    44  
    45  			err := os.Chdir(workingDir)
    46  			Expect(err).NotTo(HaveOccurred())
    47  
    48  			err = w.Write("some-file", fakeTarable)
    49  
    50  			Expect(err).NotTo(HaveOccurred())
    51  		})
    52  
    53  		It("creates a file with the filename", func() {
    54  			w := tar.NewTarWriter()
    55  
    56  			err := os.Chdir(workingDir)
    57  			Expect(err).NotTo(HaveOccurred())
    58  
    59  			err = w.Write("some-file", fakeTarable)
    60  
    61  			Expect(err).NotTo(HaveOccurred())
    62  
    63  			tarBall := filepath.Join(workingDir, "some-file")
    64  			Expect(tarBall).To(BeAnExistingFile())
    65  		})
    66  
    67  		It("tars and zips the given readers", func() {
    68  			w := tar.NewTarWriter()
    69  			expectedContents := []string{"file1 content", "file2 slightly longer content"}
    70  			fakeFile1 := bytes.NewReader([]byte(expectedContents[0]))
    71  			fakeFile2 := bytes.NewReader([]byte(expectedContents[1]))
    72  			fakeTarable1 := &tarfakes.FakeTarable{}
    73  			fakeTarable2 := &tarfakes.FakeTarable{}
    74  
    75  			fakeTarable1.ReadStub = fakeFile1.Read
    76  			fakeTarable1.SizeStub = fakeFile1.Size
    77  			fakeTarable1.NameReturns("firstfile")
    78  
    79  			fakeTarable2.ReadStub = fakeFile2.Read
    80  			fakeTarable2.SizeStub = fakeFile2.Size
    81  			fakeTarable2.NameReturns("secondfile")
    82  
    83  			err := os.Chdir(workingDir)
    84  			Expect(err).NotTo(HaveOccurred())
    85  
    86  			err = w.Write("some-zipped-tar", fakeTarable1, fakeTarable2)
    87  
    88  			var fileReader, _ = os.OpenFile("some-zipped-tar", os.O_RDONLY, 0777)
    89  
    90  			gzr, err := gzip.NewReader(fileReader)
    91  			Expect(err).ToNot(HaveOccurred())
    92  			defer gzr.Close()
    93  			tarfileReader := archiveTar.NewReader(gzr)
    94  			var actualContents []string
    95  			var actualFilenames []string
    96  			for {
    97  				header, err := tarfileReader.Next()
    98  				if err == io.EOF {
    99  					break
   100  				}
   101  				Expect(err).NotTo(HaveOccurred())
   102  				actualFilenames = append(actualFilenames, header.Name)
   103  				Expect(header.Mode).To(Equal(int64(os.FileMode(0644))))
   104  
   105  				buf := new(bytes.Buffer)
   106  				_, err = buf.ReadFrom(tarfileReader)
   107  				if err != nil {
   108  					break
   109  				}
   110  				actualContents = append(actualContents, buf.String())
   111  			}
   112  
   113  			Expect(actualContents).To(ConsistOf(expectedContents))
   114  			Expect(actualFilenames).To(ConsistOf("firstfile", "secondfile"))
   115  
   116  		})
   117  	})
   118  })