pkg.re/essentialkaos/ek@v12.36.0+incompatible/fsutil/fs_test.go (about)

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