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

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