gopkg.in/essentialkaos/ek.v7@v7.4.0/fsutil/fs_test.go (about)

     1  package fsutil
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                     Copyright (c) 2009-2017 ESSENTIAL KAOS                         //
     6  //        Essential Kaos Open Source License <https://essentialkaos.com/ekol>         //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"fmt"
    12  	"io/ioutil"
    13  	"os"
    14  	"sort"
    15  	"testing"
    16  
    17  	check "pkg.re/check.v1"
    18  )
    19  
    20  // ////////////////////////////////////////////////////////////////////////////////// //
    21  
    22  type FSSuite struct{}
    23  
    24  // ////////////////////////////////////////////////////////////////////////////////// //
    25  
    26  func Test(t *testing.T) { check.TestingT(t) }
    27  
    28  // ////////////////////////////////////////////////////////////////////////////////// //
    29  
    30  var _ = check.Suite(&FSSuite{})
    31  
    32  // ////////////////////////////////////////////////////////////////////////////////// //
    33  
    34  func (s *FSSuite) TestList(c *check.C) {
    35  	tmpDir := c.MkDir()
    36  
    37  	os.Mkdir(tmpDir+"/.dir0", 0755)
    38  
    39  	os.Create(tmpDir + "/.file0")
    40  
    41  	ioutil.WriteFile(tmpDir+"/file1.mp3", []byte("TESTDATA12345678"), 644)
    42  	ioutil.WriteFile(tmpDir+"/file2.jpg", []byte("TESTDATA"), 644)
    43  
    44  	os.Mkdir(tmpDir+"/dir1", 0755)
    45  	os.Mkdir(tmpDir+"/dir2", 0755)
    46  
    47  	os.Create(tmpDir + "/dir1/file3.mp3")
    48  	os.Create(tmpDir + "/dir2/file4.wav")
    49  
    50  	os.Mkdir(tmpDir+"/dir1/dir3", 0755)
    51  
    52  	listing1 := List(tmpDir, false)
    53  	listing2 := List(tmpDir, true)
    54  	listing3 := ListAll(tmpDir, false)
    55  	listing4 := ListAll(tmpDir, true, ListingFilter{})
    56  	listing5 := ListAllDirs(tmpDir, false)
    57  	listing6 := ListAllDirs(tmpDir, true, ListingFilter{})
    58  	listing7 := ListAllFiles(tmpDir, false)
    59  	listing8 := ListAllFiles(tmpDir, true)
    60  	listing9 := ListAllFiles(tmpDir, true, ListingFilter{MatchPatterns: []string{"*.mp3", "*.wav"}})
    61  	listing10 := ListAllFiles(tmpDir, true, ListingFilter{NotMatchPatterns: []string{"*.mp3"}})
    62  	listing11 := List(tmpDir, true, ListingFilter{Perms: "DR"})
    63  	listing12 := List(tmpDir, true, ListingFilter{NotPerms: "DR"})
    64  	listing13 := ListAllFiles(tmpDir, true, ListingFilter{NotMatchPatterns: []string{"*.mp3"}, SizeZero: true})
    65  	listing14 := ListAllFiles(tmpDir, false, ListingFilter{SizeEqual: 16})
    66  	listing15 := ListAllFiles(tmpDir, false, ListingFilter{SizeLess: 12, SizeGreater: 5})
    67  	listing16 := ListAllFiles(tmpDir, false, ListingFilter{SizeGreater: 12})
    68  	listing17 := List(
    69  		tmpDir, false,
    70  		ListingFilter{
    71  			ATimeOlder:   2524608000,
    72  			CTimeOlder:   2524608000,
    73  			MTimeOlder:   2524608000,
    74  			ATimeYounger: 1,
    75  			CTimeYounger: 1,
    76  			MTimeYounger: 1,
    77  		},
    78  	)
    79  
    80  	sort.Strings(listing1)
    81  	sort.Strings(listing2)
    82  	sort.Strings(listing3)
    83  	sort.Strings(listing4)
    84  	sort.Strings(listing5)
    85  	sort.Strings(listing6)
    86  	sort.Strings(listing7)
    87  	sort.Strings(listing8)
    88  	sort.Strings(listing9)
    89  	sort.Strings(listing10)
    90  	sort.Strings(listing11)
    91  	sort.Strings(listing12)
    92  	sort.Strings(listing13)
    93  	sort.Strings(listing14)
    94  	sort.Strings(listing15)
    95  	sort.Strings(listing16)
    96  	sort.Strings(listing17)
    97  
    98  	c.Assert(
    99  		listing1,
   100  		check.DeepEquals,
   101  		[]string{".dir0", ".file0", "dir1", "dir2", "file1.mp3", "file2.jpg"},
   102  	)
   103  
   104  	c.Assert(
   105  		listing2,
   106  		check.DeepEquals,
   107  		[]string{"dir1", "dir2", "file1.mp3", "file2.jpg"},
   108  	)
   109  
   110  	c.Assert(
   111  		listing3,
   112  		check.DeepEquals,
   113  		[]string{".dir0", ".file0", "dir1", "dir1/dir3", "dir1/file3.mp3", "dir2", "dir2/file4.wav", "file1.mp3", "file2.jpg"},
   114  	)
   115  
   116  	c.Assert(
   117  		listing4,
   118  		check.DeepEquals,
   119  		[]string{"dir1", "dir1/dir3", "dir1/file3.mp3", "dir2", "dir2/file4.wav", "file1.mp3", "file2.jpg"},
   120  	)
   121  
   122  	c.Assert(
   123  		listing5,
   124  		check.DeepEquals,
   125  		[]string{".dir0", "dir1", "dir1/dir3", "dir2"},
   126  	)
   127  
   128  	c.Assert(
   129  		listing6,
   130  		check.DeepEquals,
   131  		[]string{"dir1", "dir1/dir3", "dir2"},
   132  	)
   133  
   134  	c.Assert(
   135  		listing7,
   136  		check.DeepEquals,
   137  		[]string{".file0", "dir1/file3.mp3", "dir2/file4.wav", "file1.mp3", "file2.jpg"},
   138  	)
   139  
   140  	c.Assert(
   141  		listing8,
   142  		check.DeepEquals,
   143  		[]string{"dir1/file3.mp3", "dir2/file4.wav", "file1.mp3", "file2.jpg"},
   144  	)
   145  
   146  	c.Assert(
   147  		listing9,
   148  		check.DeepEquals,
   149  		[]string{"dir1/file3.mp3", "dir2/file4.wav", "file1.mp3"},
   150  	)
   151  
   152  	c.Assert(
   153  		listing10,
   154  		check.DeepEquals,
   155  		[]string{"dir2/file4.wav", "file2.jpg"},
   156  	)
   157  
   158  	c.Assert(
   159  		listing11,
   160  		check.DeepEquals,
   161  		[]string{"dir1", "dir2"},
   162  	)
   163  
   164  	c.Assert(
   165  		listing12,
   166  		check.DeepEquals,
   167  		[]string{"file1.mp3", "file2.jpg"},
   168  	)
   169  
   170  	c.Assert(
   171  		listing13,
   172  		check.DeepEquals,
   173  		[]string{"dir2/file4.wav"},
   174  	)
   175  
   176  	c.Assert(
   177  		listing14,
   178  		check.DeepEquals,
   179  		[]string{"file1.mp3"},
   180  	)
   181  
   182  	c.Assert(
   183  		listing15,
   184  		check.DeepEquals,
   185  		[]string{"file2.jpg"},
   186  	)
   187  
   188  	c.Assert(
   189  		listing16,
   190  		check.DeepEquals,
   191  		[]string{"file1.mp3"},
   192  	)
   193  
   194  	c.Assert(
   195  		listing17,
   196  		check.DeepEquals,
   197  		[]string{".dir0", ".file0", "dir1", "dir2", "file1.mp3", "file2.jpg"},
   198  	)
   199  
   200  	c.Assert(readDir("/not_exist"), check.IsNil)
   201  
   202  	c.Assert(ListingFilter{ATimeOlder: 1}.hasTimes(), check.Equals, true)
   203  	c.Assert(ListingFilter{ATimeYounger: 1}.hasTimes(), check.Equals, true)
   204  	c.Assert(ListingFilter{CTimeOlder: 1}.hasTimes(), check.Equals, true)
   205  	c.Assert(ListingFilter{CTimeYounger: 1}.hasTimes(), check.Equals, true)
   206  	c.Assert(ListingFilter{MTimeOlder: 1}.hasTimes(), check.Equals, true)
   207  	c.Assert(ListingFilter{MTimeYounger: 1}.hasTimes(), check.Equals, true)
   208  }
   209  
   210  func (s *FSSuite) TestListToAbsolute(c *check.C) {
   211  	list := []string{"1", "2", "3"}
   212  
   213  	ListToAbsolute("A", list)
   214  
   215  	c.Assert(list, check.DeepEquals, []string{"A/1", "A/2", "A/3"})
   216  }
   217  
   218  func (s *FSSuite) TestProperPath(c *check.C) {
   219  	tmpFile := c.MkDir() + "/test.txt"
   220  
   221  	os.OpenFile(tmpFile, os.O_CREATE, 0644)
   222  
   223  	paths := []string{"/etc/sudoers", "/etc/passwd", tmpFile}
   224  
   225  	c.Assert(ProperPath("DR", paths), check.Equals, "")
   226  	c.Assert(ProperPath("FR", paths), check.Equals, "/etc/passwd")
   227  	c.Assert(ProperPath("FRW", paths), check.Equals, tmpFile)
   228  	c.Assert(ProperPath("FRWS", paths), check.Equals, "")
   229  	c.Assert(ProperPath("F", paths), check.Equals, "/etc/sudoers")
   230  
   231  	os.Remove(tmpFile)
   232  }
   233  
   234  func (s *FSSuite) TestWalker(c *check.C) {
   235  	tmpDir := c.MkDir()
   236  
   237  	os.Chdir(tmpDir)
   238  
   239  	tmpDir, _ = os.Getwd()
   240  
   241  	os.MkdirAll(tmpDir+"/dir1/dir2/dir3/dir4", 0755)
   242  	os.Chdir(tmpDir)
   243  
   244  	c.Assert(Current(), check.Equals, tmpDir)
   245  	c.Assert(Pop(), check.Equals, tmpDir)
   246  
   247  	dirStack = nil
   248  
   249  	c.Assert(Push("dir1"), check.Equals, tmpDir+"/dir1")
   250  	c.Assert(Push("dir9"), check.Equals, "")
   251  	c.Assert(Push("dir2/dir3"), check.Equals, tmpDir+"/dir1/dir2/dir3")
   252  	c.Assert(Push("dir4"), check.Equals, tmpDir+"/dir1/dir2/dir3/dir4")
   253  	c.Assert(Push("dir9"), check.Equals, "")
   254  	c.Assert(Pop(), check.Equals, tmpDir+"/dir1/dir2/dir3")
   255  	c.Assert(Pop(), check.Equals, tmpDir+"/dir1")
   256  	c.Assert(Pop(), check.Equals, tmpDir)
   257  	c.Assert(Pop(), check.Equals, tmpDir)
   258  
   259  	c.Assert(Push("dir1"), check.Equals, tmpDir+"/dir1")
   260  	c.Assert(Push("dir2"), check.Equals, tmpDir+"/dir1/dir2")
   261  	c.Assert(Push("dir3"), check.Equals, tmpDir+"/dir1/dir2/dir3")
   262  	os.RemoveAll(tmpDir + "/dir1/dir2")
   263  	c.Assert(Pop(), check.Equals, "")
   264  }
   265  
   266  func (s *FSSuite) TestGetSize(c *check.C) {
   267  	tmpDir := c.MkDir()
   268  	tmpFile := tmpDir + "/test.file"
   269  
   270  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0644) != nil {
   271  		c.Fatal("Can't create temporary file")
   272  	}
   273  
   274  	c.Assert(GetSize(""), check.Equals, int64(-1))
   275  	c.Assert(GetSize("/not_exist"), check.Equals, int64(-1))
   276  	c.Assert(GetSize(tmpFile), check.Equals, int64(5))
   277  }
   278  
   279  func (s *FSSuite) TestGetTime(c *check.C) {
   280  	tmpDir := c.MkDir()
   281  	tmpFile := tmpDir + "/test.file"
   282  
   283  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0644) != nil {
   284  		c.Fatal("Can't create temporary file")
   285  	}
   286  
   287  	at, mt, ct, err := GetTimes(tmpFile)
   288  
   289  	c.Assert(err, check.IsNil)
   290  	c.Assert(at.IsZero(), check.Equals, false)
   291  	c.Assert(mt.IsZero(), check.Equals, false)
   292  	c.Assert(ct.IsZero(), check.Equals, false)
   293  
   294  	at, mt, ct, err = GetTimes("")
   295  
   296  	c.Assert(err, check.NotNil)
   297  	c.Assert(err, check.Equals, ErrEmptyPath)
   298  	c.Assert(at.IsZero(), check.Equals, true)
   299  	c.Assert(mt.IsZero(), check.Equals, true)
   300  	c.Assert(ct.IsZero(), check.Equals, true)
   301  
   302  	at, mt, ct, err = GetTimes("/not_exist")
   303  
   304  	c.Assert(err, check.NotNil)
   305  	c.Assert(at.IsZero(), check.Equals, true)
   306  	c.Assert(mt.IsZero(), check.Equals, true)
   307  	c.Assert(ct.IsZero(), check.Equals, true)
   308  
   309  	ats, mts, cts, err := GetTimestamps(tmpFile)
   310  
   311  	c.Assert(err, check.IsNil)
   312  	c.Assert(ats, check.Not(check.Equals), int64(-1))
   313  	c.Assert(mts, check.Not(check.Equals), int64(-1))
   314  	c.Assert(cts, check.Not(check.Equals), int64(-1))
   315  
   316  	ats, mts, cts, err = GetTimestamps("")
   317  
   318  	c.Assert(err, check.NotNil)
   319  	c.Assert(err, check.Equals, ErrEmptyPath)
   320  	c.Assert(ats, check.Equals, int64(-1))
   321  	c.Assert(mts, check.Equals, int64(-1))
   322  	c.Assert(cts, check.Equals, int64(-1))
   323  
   324  	ats, mts, cts, err = GetTimestamps("/not_exist")
   325  
   326  	c.Assert(err, check.NotNil)
   327  	c.Assert(ats, check.Equals, int64(-1))
   328  	c.Assert(mts, check.Equals, int64(-1))
   329  	c.Assert(cts, check.Equals, int64(-1))
   330  
   331  	at, err = GetATime(tmpFile)
   332  
   333  	c.Assert(err, check.IsNil)
   334  	c.Assert(at.IsZero(), check.Equals, false)
   335  
   336  	mt, err = GetMTime(tmpFile)
   337  
   338  	c.Assert(err, check.IsNil)
   339  	c.Assert(mt.IsZero(), check.Equals, false)
   340  
   341  	ct, err = GetCTime(tmpFile)
   342  
   343  	c.Assert(err, check.IsNil)
   344  	c.Assert(ct.IsZero(), check.Equals, false)
   345  
   346  	at, err = GetATime("")
   347  
   348  	c.Assert(err, check.NotNil)
   349  	c.Assert(at.IsZero(), check.Equals, true)
   350  
   351  	mt, err = GetMTime("")
   352  
   353  	c.Assert(err, check.NotNil)
   354  	c.Assert(mt.IsZero(), check.Equals, true)
   355  
   356  	ct, err = GetCTime("")
   357  
   358  	c.Assert(err, check.NotNil)
   359  	c.Assert(ct.IsZero(), check.Equals, true)
   360  }
   361  
   362  func (s *FSSuite) TestGetOwner(c *check.C) {
   363  	tmpDir := c.MkDir()
   364  	tmpFile := tmpDir + "/test.file"
   365  
   366  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0644) != nil {
   367  		c.Fatal("Can't create temporary file")
   368  	}
   369  
   370  	uid, gid, err := GetOwner(tmpFile)
   371  
   372  	c.Assert(err, check.IsNil)
   373  	c.Assert(uid, check.Not(check.Equals), -1)
   374  	c.Assert(gid, check.Not(check.Equals), -1)
   375  
   376  	uid, gid, err = GetOwner("")
   377  
   378  	c.Assert(err, check.NotNil)
   379  	c.Assert(err, check.Equals, ErrEmptyPath)
   380  	c.Assert(uid, check.Equals, -1)
   381  	c.Assert(gid, check.Equals, -1)
   382  
   383  	uid, gid, err = GetOwner("/not_exist")
   384  
   385  	c.Assert(err, check.NotNil)
   386  	c.Assert(uid, check.Equals, -1)
   387  	c.Assert(gid, check.Equals, -1)
   388  }
   389  
   390  func (s *FSSuite) TestIsEmptyDir(c *check.C) {
   391  	tmpDir1 := c.MkDir()
   392  	tmpDir2 := c.MkDir()
   393  	tmpFile := tmpDir1 + "/test.file"
   394  
   395  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0644) != nil {
   396  		c.Fatal("Can't create temporary file")
   397  	}
   398  
   399  	c.Assert(IsEmptyDir(tmpDir1), check.Equals, false)
   400  	c.Assert(IsEmptyDir(tmpDir2), check.Equals, true)
   401  	c.Assert(IsEmptyDir(""), check.Equals, false)
   402  	c.Assert(IsEmptyDir("/not_exist"), check.Equals, false)
   403  }
   404  
   405  func (s *FSSuite) TestIsNonEmpty(c *check.C) {
   406  	tmpDir := c.MkDir()
   407  	tmpFile1 := tmpDir + "/test1.file"
   408  	tmpFile2 := tmpDir + "/test2.file"
   409  
   410  	if ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644) != nil {
   411  		c.Fatal("Can't create temporary file")
   412  	}
   413  
   414  	if ioutil.WriteFile(tmpFile2, []byte(""), 0644) != nil {
   415  		c.Fatal("Can't create temporary file")
   416  	}
   417  
   418  	c.Assert(IsNonEmpty(""), check.Equals, false)
   419  	c.Assert(IsNonEmpty("/not_exist"), check.Equals, false)
   420  	c.Assert(IsNonEmpty(tmpFile2), check.Equals, false)
   421  	c.Assert(IsNonEmpty(tmpFile1), check.Equals, true)
   422  }
   423  
   424  func (s *FSSuite) TestTypeChecks(c *check.C) {
   425  	tmpDir := c.MkDir()
   426  	tmpFile := tmpDir + "/test.file"
   427  	tmpLink := tmpDir + "/test.link"
   428  
   429  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0644) != nil {
   430  		c.Fatal("Can't create temporary file")
   431  	}
   432  
   433  	if os.Symlink("123", tmpLink) != nil {
   434  		c.Fatal("Can't create link")
   435  	}
   436  
   437  	c.Assert(IsExist(""), check.Equals, false)
   438  	c.Assert(IsExist("/not_exist"), check.Equals, false)
   439  	c.Assert(IsExist(tmpFile), check.Equals, true)
   440  
   441  	c.Assert(IsRegular(""), check.Equals, false)
   442  	c.Assert(IsRegular("/not_exist"), check.Equals, false)
   443  	c.Assert(IsRegular(tmpFile), check.Equals, true)
   444  	c.Assert(IsRegular(tmpLink), check.Equals, false)
   445  
   446  	c.Assert(IsLink(""), check.Equals, false)
   447  	c.Assert(IsLink("/not_exist"), check.Equals, false)
   448  	c.Assert(IsLink(tmpFile), check.Equals, false)
   449  	c.Assert(IsLink(tmpLink), check.Equals, true)
   450  
   451  	c.Assert(IsCharacterDevice(""), check.Equals, false)
   452  	c.Assert(IsCharacterDevice("/not_exist"), check.Equals, false)
   453  	c.Assert(IsCharacterDevice(tmpFile), check.Equals, false)
   454  	c.Assert(IsCharacterDevice("/dev/tty"), check.Equals, true)
   455  
   456  	c.Assert(IsBlockDevice(""), check.Equals, false)
   457  	c.Assert(IsBlockDevice("/not_exist"), check.Equals, false)
   458  	c.Assert(IsBlockDevice(tmpFile), check.Equals, false)
   459  
   460  	switch {
   461  	case IsExist("/dev/sda"):
   462  		c.Assert(IsBlockDevice("/dev/sda"), check.Equals, true)
   463  	case IsExist("/dev/vda"):
   464  		c.Assert(IsBlockDevice("/dev/vda"), check.Equals, true)
   465  	case IsExist("/dev/hda"):
   466  		c.Assert(IsBlockDevice("/dev/hda"), check.Equals, true)
   467  	case IsExist("/dev/disk0"):
   468  		c.Assert(IsBlockDevice("/dev/disk0"), check.Equals, true)
   469  	}
   470  
   471  	c.Assert(IsDir(""), check.Equals, false)
   472  	c.Assert(IsDir("/not_exist"), check.Equals, false)
   473  	c.Assert(IsDir(tmpFile), check.Equals, false)
   474  	c.Assert(IsDir(tmpDir), check.Equals, true)
   475  
   476  	c.Assert(IsSocket(""), check.Equals, false)
   477  	c.Assert(IsSocket("/not_exist"), check.Equals, false)
   478  	c.Assert(IsSocket(tmpFile), check.Equals, false)
   479  	c.Assert(IsSocket(tmpDir), check.Equals, false)
   480  
   481  	switch {
   482  	case IsExist("/var/run/mDNSResponder"):
   483  		c.Assert(IsSocket("/var/run/mDNSResponder"), check.Equals, true)
   484  	case IsExist("/dev/log"):
   485  		c.Assert(IsSocket("/dev/log"), check.Equals, true)
   486  	}
   487  }
   488  
   489  func (s *FSSuite) TestPermChecks(c *check.C) {
   490  	tmpDir := c.MkDir()
   491  	tmpFile1 := tmpDir + "/test1.file"
   492  	tmpFile2 := tmpDir + "/test2.file"
   493  	tmpFile3 := tmpDir + "/test3.file"
   494  	tmpFile4 := tmpDir + "/test4.file"
   495  	tmpFile5 := tmpDir + "/test5.file"
   496  	tmpFile6 := tmpDir + "/test6.file"
   497  	tmpFile7 := tmpDir + "/test7.file"
   498  	tmpFile8 := tmpDir + "/test8.file"
   499  	tmpFile9 := tmpDir + "/test9.file"
   500  
   501  	for i := 1; i <= 9; i++ {
   502  		if ioutil.WriteFile(fmt.Sprintf("%s/test%d.file", tmpDir, i), []byte(""), 0644) != nil {
   503  			c.Fatal("Can't create temporary file")
   504  		}
   505  	}
   506  
   507  	os.Chmod(tmpFile1, 0400)
   508  	os.Chmod(tmpFile2, 0040)
   509  	os.Chmod(tmpFile3, 0004)
   510  	os.Chmod(tmpFile4, 0200)
   511  	os.Chmod(tmpFile5, 0020)
   512  	os.Chmod(tmpFile6, 0002)
   513  	os.Chmod(tmpFile7, 0100)
   514  	os.Chmod(tmpFile8, 0010)
   515  	os.Chmod(tmpFile9, 0001)
   516  
   517  	c.Assert(IsReadable(""), check.Equals, false)
   518  	c.Assert(IsReadable("/not_exist"), check.Equals, false)
   519  	c.Assert(IsReadable(tmpFile1), check.Equals, true)
   520  	c.Assert(IsReadable(tmpFile2), check.Equals, true)
   521  	c.Assert(IsReadable(tmpFile3), check.Equals, true)
   522  
   523  	c.Assert(IsWritable(""), check.Equals, false)
   524  	c.Assert(IsWritable("/not_exist"), check.Equals, false)
   525  	c.Assert(IsWritable(tmpFile4), check.Equals, true)
   526  	c.Assert(IsWritable(tmpFile5), check.Equals, true)
   527  	c.Assert(IsWritable(tmpFile6), check.Equals, true)
   528  
   529  	c.Assert(IsExecutable(""), check.Equals, false)
   530  	c.Assert(IsExecutable("/not_exist"), check.Equals, false)
   531  	c.Assert(IsExecutable(tmpFile7), check.Equals, true)
   532  	c.Assert(IsExecutable(tmpFile8), check.Equals, true)
   533  	c.Assert(IsExecutable(tmpFile9), check.Equals, true)
   534  	c.Assert(IsExecutable(tmpFile1), check.Equals, false)
   535  }
   536  
   537  func (s *FSSuite) TestCheckPerms(c *check.C) {
   538  	tmpDir := c.MkDir()
   539  	tmpFile := tmpDir + "/test.file"
   540  	tmpLink := tmpDir + "/test.link"
   541  
   542  	if ioutil.WriteFile(tmpFile, []byte(""), 0644) != nil {
   543  		c.Fatal("Can't create temporary file")
   544  	}
   545  
   546  	if os.Symlink("123", tmpLink) != nil {
   547  		c.Fatal("Can't create link")
   548  	}
   549  
   550  	c.Assert(CheckPerms("", tmpFile), check.Equals, false)
   551  	c.Assert(CheckPerms("FR", ""), check.Equals, false)
   552  	c.Assert(CheckPerms("FR", "/not_exist"), check.Equals, false)
   553  
   554  	c.Assert(CheckPerms("F", tmpDir), check.Equals, false)
   555  	c.Assert(CheckPerms("D", tmpFile), check.Equals, false)
   556  	c.Assert(CheckPerms("L", tmpFile), check.Equals, false)
   557  	c.Assert(CheckPerms("X", tmpFile), check.Equals, false)
   558  	c.Assert(CheckPerms("S", tmpFile), check.Equals, false)
   559  
   560  	c.Assert(CheckPerms("W", tmpFile), check.Equals, true)
   561  	c.Assert(CheckPerms("R", tmpFile), check.Equals, true)
   562  }
   563  
   564  func (s *FSSuite) TestGetPerms(c *check.C) {
   565  	tmpDir := c.MkDir()
   566  	tmpFile := tmpDir + "/test.file"
   567  
   568  	if ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0764) != nil {
   569  		c.Fatal("Can't create temporary file")
   570  	}
   571  
   572  	os.Chmod(tmpFile, 0764)
   573  
   574  	c.Assert(GetPerms(""), check.Equals, os.FileMode(0))
   575  	c.Assert(GetPerms(tmpFile), check.Equals, os.FileMode(0764))
   576  }
   577  
   578  func (s *FSSuite) TestLineCount(c *check.C) {
   579  	tmpDir := c.MkDir()
   580  	tmpFile := tmpDir + "/test.file"
   581  
   582  	if ioutil.WriteFile(tmpFile, []byte("1\n2\n3\n4\n"), 0644) != nil {
   583  		c.Fatal("Can't create temporary file")
   584  	}
   585  
   586  	c.Assert(LineCount(""), check.Equals, -1)
   587  	c.Assert(LineCount("/not_exist"), check.Equals, -1)
   588  	c.Assert(LineCount(tmpFile), check.Equals, 4)
   589  }
   590  
   591  func (s *FSSuite) TestCopyFile(c *check.C) {
   592  	tmpDir1 := c.MkDir()
   593  	tmpDir2 := c.MkDir()
   594  	tmpDir3 := c.MkDir()
   595  	tmpFile1 := tmpDir1 + "/test1.file"
   596  	tmpFile2 := tmpDir2 + "/test2.file"
   597  	tmpFile3 := tmpDir1 + "/test3.file"
   598  
   599  	if ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644) != nil {
   600  		c.Fatal("Can't create temporary file")
   601  	}
   602  
   603  	if ioutil.WriteFile(tmpFile2, []byte("TEST1234TEST\n"), 0644) != nil {
   604  		c.Fatal("Can't create temporary file")
   605  	}
   606  
   607  	if ioutil.WriteFile(tmpFile3, []byte(""), 0644) != nil {
   608  		c.Fatal("Can't create temporary file")
   609  	}
   610  
   611  	os.Chmod(tmpFile3, 0111)
   612  	os.Chmod(tmpDir3, 0500)
   613  
   614  	c.Assert(CopyFile("", tmpFile2), check.NotNil)
   615  	c.Assert(CopyFile(tmpFile1, ""), check.NotNil)
   616  	c.Assert(CopyFile("/not_exist", tmpFile2), check.NotNil)
   617  	c.Assert(CopyFile(tmpDir1, tmpFile2), check.NotNil)
   618  	c.Assert(CopyFile(tmpFile3, tmpFile2), check.NotNil)
   619  	c.Assert(CopyFile(tmpFile1, "/not_exist/test.file"), check.NotNil)
   620  	c.Assert(CopyFile(tmpFile1, tmpDir3+"/test.file"), check.NotNil)
   621  	c.Assert(CopyFile(tmpFile1, tmpDir2), check.NotNil)
   622  	c.Assert(CopyFile(tmpFile1, tmpFile3), check.NotNil)
   623  
   624  	c.Assert(CopyFile(tmpFile1, tmpFile2, 0600), check.IsNil)
   625  	c.Assert(GetSize(tmpFile2), check.Equals, int64(5))
   626  	c.Assert(GetPerms(tmpFile2), check.Equals, os.FileMode(0600))
   627  
   628  	os.Remove(tmpFile2)
   629  
   630  	c.Assert(CopyFile(tmpFile1, tmpFile2, 0600), check.IsNil)
   631  	c.Assert(GetSize(tmpFile2), check.Equals, int64(5))
   632  	c.Assert(GetPerms(tmpFile2), check.Equals, os.FileMode(0600))
   633  
   634  	_disableCopyFileChecks = true
   635  
   636  	c.Assert(CopyFile("", tmpFile2), check.NotNil)
   637  	c.Assert(CopyFile(tmpFile1, ""), check.NotNil)
   638  }
   639  
   640  func (s *FSSuite) TestMoveFile(c *check.C) {
   641  	tmpDir := c.MkDir()
   642  	tmpDir2 := c.MkDir()
   643  	tmpFile1 := tmpDir + "/test1.file"
   644  	tmpFile2 := tmpDir + "/test2.file"
   645  	tmpFile3 := tmpDir + "/test3.file"
   646  
   647  	if ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644) != nil {
   648  		c.Fatal("Can't create temporary file")
   649  	}
   650  
   651  	if ioutil.WriteFile(tmpFile3, []byte("TEST\n"), 0644) != nil {
   652  		c.Fatal("Can't create temporary file")
   653  	}
   654  
   655  	os.Chmod(tmpFile3, 0111)
   656  	os.Chmod(tmpDir2, 0500)
   657  
   658  	c.Assert(MoveFile("", tmpFile2), check.NotNil)
   659  	c.Assert(MoveFile(tmpFile1, ""), check.NotNil)
   660  	c.Assert(MoveFile("/not_exist", tmpFile2), check.NotNil)
   661  	c.Assert(MoveFile(tmpDir, tmpFile2), check.NotNil)
   662  	c.Assert(MoveFile(tmpFile3, tmpFile2), check.NotNil)
   663  	c.Assert(MoveFile(tmpFile1, "/not_exist/file.test"), check.NotNil)
   664  	c.Assert(MoveFile(tmpFile1, tmpDir2+"/file.test"), check.NotNil)
   665  
   666  	c.Assert(MoveFile(tmpFile1, tmpFile2), check.IsNil)
   667  	c.Assert(MoveFile(tmpFile2, tmpFile1, 0600), check.IsNil)
   668  
   669  	_disableMoveFileChecks = true
   670  
   671  	c.Assert(MoveFile("", tmpFile2), check.NotNil)
   672  }
   673  
   674  func (s *FSSuite) TestInternal(c *check.C) {
   675  	c.Assert(getGIDList(nil), check.IsNil)
   676  
   677  	c.Assert(isReadableStat(nil, 0, nil), check.Equals, true)
   678  	c.Assert(isWritableStat(nil, 0, nil), check.Equals, true)
   679  	c.Assert(isExecutableStat(nil, 0, nil), check.Equals, true)
   680  
   681  	n, _ := fixCount(-100, nil)
   682  
   683  	c.Assert(n, check.Equals, 0)
   684  }