github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/actor/v2action/resource_unix_test.go (about)

     1  // +build !windows
     2  
     3  package v2action_test
     4  
     5  import (
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	. "code.cloudfoundry.org/cli/actor/v2action"
    11  	"code.cloudfoundry.org/cli/actor/v2action/v2actionfakes"
    12  	"code.cloudfoundry.org/ykk"
    13  	. "github.com/onsi/ginkgo"
    14  	. "github.com/onsi/gomega"
    15  )
    16  
    17  var _ = Describe("Resource Actions", func() {
    18  	var (
    19  		actor                     *Actor
    20  		fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient
    21  		srcDir                    string
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient)
    26  		actor = NewActor(fakeCloudControllerClient, nil)
    27  
    28  		var err error
    29  		srcDir, err = ioutil.TempDir("", "v2-resource-actions")
    30  		Expect(err).ToNot(HaveOccurred())
    31  
    32  		subDir := filepath.Join(srcDir, "level1", "level2")
    33  		err = os.MkdirAll(subDir, 0777)
    34  		Expect(err).ToNot(HaveOccurred())
    35  
    36  		err = ioutil.WriteFile(filepath.Join(subDir, "tmpFile1"), []byte("why hello"), 0644)
    37  		Expect(err).ToNot(HaveOccurred())
    38  
    39  		err = ioutil.WriteFile(filepath.Join(srcDir, "tmpFile2"), []byte("Hello, Binky"), 0751)
    40  		Expect(err).ToNot(HaveOccurred())
    41  
    42  		err = ioutil.WriteFile(filepath.Join(srcDir, "tmpFile3"), []byte("Bananarama"), 0655)
    43  		Expect(err).ToNot(HaveOccurred())
    44  	})
    45  
    46  	AfterEach(func() {
    47  		Expect(os.RemoveAll(srcDir)).ToNot(HaveOccurred())
    48  	})
    49  
    50  	Describe("GatherArchiveResources", func() {
    51  		Context("when the archive exists", func() {
    52  			var archive string
    53  
    54  			BeforeEach(func() {
    55  				tmpfile, err := ioutil.TempFile("", "example")
    56  				Expect(err).ToNot(HaveOccurred())
    57  				defer tmpfile.Close()
    58  				archive = tmpfile.Name()
    59  
    60  				err = zipit(srcDir, archive, "")
    61  				Expect(err).ToNot(HaveOccurred())
    62  			})
    63  
    64  			AfterEach(func() {
    65  				Expect(os.RemoveAll(archive)).ToNot(HaveOccurred())
    66  			})
    67  
    68  			It("gathers a list of all files in a source archive", func() {
    69  				resources, err := actor.GatherArchiveResources(archive)
    70  				Expect(err).ToNot(HaveOccurred())
    71  
    72  				Expect(resources).To(Equal(
    73  					[]Resource{
    74  						{Filename: "/", Mode: DefaultFolderPermissions},
    75  						{Filename: "/level1/", Mode: DefaultFolderPermissions},
    76  						{Filename: "/level1/level2/", Mode: DefaultFolderPermissions},
    77  						{Filename: "/level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: DefaultArchiveFilePermissions},
    78  						{Filename: "/tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: DefaultArchiveFilePermissions},
    79  						{Filename: "/tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: DefaultArchiveFilePermissions},
    80  					}))
    81  			})
    82  		})
    83  
    84  		Context("when the archive does not exist", func() {
    85  			It("returns an error if the file is problematic", func() {
    86  				_, err := actor.GatherArchiveResources("/does/not/exist")
    87  				Expect(os.IsNotExist(err)).To(BeTrue())
    88  			})
    89  		})
    90  	})
    91  
    92  	Describe("GatherDirectoryResources", func() {
    93  		Context("when files exist in the directory", func() {
    94  			It("gathers a list of all directories files in a source directory", func() {
    95  				resources, err := actor.GatherDirectoryResources(srcDir)
    96  				Expect(err).ToNot(HaveOccurred())
    97  
    98  				Expect(resources).To(Equal(
    99  					[]Resource{
   100  						{Filename: "level1", Mode: DefaultFolderPermissions},
   101  						{Filename: "level1/level2", Mode: DefaultFolderPermissions},
   102  						{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   103  						{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   104  						{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   105  					}))
   106  			})
   107  		})
   108  
   109  		Context("when the directory is empty", func() {
   110  			var emptyDir string
   111  
   112  			BeforeEach(func() {
   113  				var err error
   114  				emptyDir, err = ioutil.TempDir("", "v2-resource-actions-empty")
   115  				Expect(err).ToNot(HaveOccurred())
   116  			})
   117  
   118  			AfterEach(func() {
   119  				Expect(os.RemoveAll(emptyDir)).ToNot(HaveOccurred())
   120  			})
   121  
   122  			It("returns an EmptyDirectoryError", func() {
   123  				_, err := actor.GatherDirectoryResources(emptyDir)
   124  				Expect(err).To(MatchError(EmptyDirectoryError{Path: emptyDir}))
   125  			})
   126  		})
   127  	})
   128  
   129  	Describe("ZipDirectoryResources", func() {
   130  		var (
   131  			resultZip  string
   132  			resources  []Resource
   133  			executeErr error
   134  		)
   135  
   136  		BeforeEach(func() {
   137  			resources = []Resource{
   138  				{Filename: "level1"},
   139  				{Filename: "level1/level2"},
   140  				{Filename: "level1/level2/tmpFile1", SHA1: "9e36efec86d571de3a38389ea799a796fe4782f4", Size: 9, Mode: 0644},
   141  				{Filename: "tmpFile2", SHA1: "e594bdc795bb293a0e55724137e53a36dc0d9e95", Size: 12, Mode: 0751},
   142  				{Filename: "tmpFile3", SHA1: "f4c9ca85f3e084ffad3abbdabbd2a890c034c879", Size: 10, Mode: 0655},
   143  			}
   144  		})
   145  
   146  		JustBeforeEach(func() {
   147  			resultZip, executeErr = actor.ZipDirectoryResources(srcDir, resources)
   148  		})
   149  
   150  		AfterEach(func() {
   151  			err := os.RemoveAll(srcDir)
   152  			Expect(err).ToNot(HaveOccurred())
   153  
   154  			err = os.RemoveAll(resultZip)
   155  			Expect(err).ToNot(HaveOccurred())
   156  		})
   157  
   158  		Context("when zipping on UNIX", func() {
   159  			It("zips the directory and keeps the file permissions", func() {
   160  				Expect(executeErr).ToNot(HaveOccurred())
   161  
   162  				Expect(resultZip).ToNot(BeEmpty())
   163  				zipFile, err := os.Open(resultZip)
   164  				Expect(err).ToNot(HaveOccurred())
   165  				defer zipFile.Close()
   166  
   167  				zipInfo, err := zipFile.Stat()
   168  				Expect(err).ToNot(HaveOccurred())
   169  
   170  				reader, err := ykk.NewReader(zipFile, zipInfo.Size())
   171  				Expect(err).ToNot(HaveOccurred())
   172  
   173  				Expect(reader.File).To(HaveLen(5))
   174  				Expect(reader.File[2].Mode()).To(Equal(os.FileMode(0644)))
   175  				Expect(reader.File[3].Mode()).To(Equal(os.FileMode(0751)))
   176  				Expect(reader.File[4].Mode()).To(Equal(os.FileMode(0655)))
   177  			})
   178  		})
   179  	})
   180  })