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

     1  package fsutil
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                         Copyright (c) 2022 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("XFR", "/_unknown_").Error(), check.Equals, "File /_unknown_ doesn't exist or not accessible")
   598  	c.Assert(ValidatePerms("XDR", "/_unknown_").Error(), check.Equals, "Directory /_unknown_ doesn't exist or not accessible")
   599  	c.Assert(ValidatePerms("XBR", "/_unknown_").Error(), check.Equals, "Block device /_unknown_ doesn't exist or not accessible")
   600  	c.Assert(ValidatePerms("XCR", "/_unknown_").Error(), check.Equals, "Character device /_unknown_ doesn't exist or not accessible")
   601  	c.Assert(ValidatePerms("XLR", "/_unknown_").Error(), check.Equals, "Link /_unknown_ doesn't exist or not accessible")
   602  	c.Assert(ValidatePerms("XR", "/_unknown_").Error(), check.Equals, "Object /_unknown_ doesn't exist or not accessible")
   603  
   604  	c.Assert(ValidatePerms("W", tmpFile), check.IsNil)
   605  	c.Assert(ValidatePerms("R", tmpFile), check.IsNil)
   606  
   607  	useFakeUser = true
   608  	c.Assert(CheckPerms("W", tmpFile), check.Equals, false)
   609  	c.Assert(CheckPerms("R", tmpFile), check.Equals, false)
   610  	c.Assert(ValidatePerms("W", tmpFile), check.NotNil)
   611  	c.Assert(ValidatePerms("R", tmpFile), check.NotNil)
   612  	useFakeUser = false
   613  }
   614  
   615  func (s *FSSuite) TestGetMode(c *check.C) {
   616  	tmpDir := c.MkDir()
   617  	tmpFile := tmpDir + "/test.file"
   618  
   619  	c.Assert(ioutil.WriteFile(tmpFile, []byte("TEST\n"), 0764), check.IsNil)
   620  
   621  	os.Chmod(tmpFile, 0764)
   622  
   623  	c.Assert(GetMode(""), check.Equals, os.FileMode(0))
   624  	c.Assert(GetMode(tmpFile), check.Equals, os.FileMode(0764))
   625  }
   626  
   627  func (s *FSSuite) TestCountLines(c *check.C) {
   628  	tmpDir := c.MkDir()
   629  	tmpFile := tmpDir + "/test.file"
   630  
   631  	c.Assert(ioutil.WriteFile(tmpFile, []byte("1\n2\n3\n4\n"), 0644), check.IsNil)
   632  
   633  	n, err := CountLines("")
   634  
   635  	c.Assert(err, check.NotNil)
   636  	c.Assert(n, check.Equals, 0)
   637  
   638  	n, err = CountLines("/not_exist")
   639  
   640  	c.Assert(err, check.NotNil)
   641  	c.Assert(n, check.Equals, 0)
   642  
   643  	n, err = CountLines(tmpFile)
   644  
   645  	c.Assert(err, check.IsNil)
   646  	c.Assert(n, check.Equals, 4)
   647  }
   648  
   649  func (s *FSSuite) TestCopyFile(c *check.C) {
   650  	tmpDir1 := c.MkDir()
   651  	tmpDir2 := c.MkDir()
   652  	tmpDir3 := c.MkDir()
   653  	tmpFile1 := tmpDir1 + "/test1.file"
   654  	tmpFile2 := tmpDir2 + "/test2.file"
   655  	tmpFile3 := tmpDir1 + "/test3.file"
   656  
   657  	c.Assert(ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644), check.IsNil)
   658  	c.Assert(ioutil.WriteFile(tmpFile2, []byte("TEST1234TEST\n"), 0644), check.IsNil)
   659  	c.Assert(ioutil.WriteFile(tmpFile3, []byte(""), 0644), check.IsNil)
   660  
   661  	os.Chmod(tmpFile3, 0111)
   662  	os.Chmod(tmpDir3, 0500)
   663  
   664  	c.Assert(CopyFile("", tmpFile2), check.NotNil)
   665  	c.Assert(CopyFile(tmpFile1, ""), check.NotNil)
   666  	c.Assert(CopyFile("/not_exist", tmpFile2), check.NotNil)
   667  	c.Assert(CopyFile(tmpDir1, tmpFile2), check.NotNil)
   668  	c.Assert(CopyFile(tmpFile3, tmpFile2), check.NotNil)
   669  	c.Assert(CopyFile(tmpFile1, "/not_exist/test.file"), check.NotNil)
   670  	c.Assert(CopyFile(tmpFile1, tmpDir3+"/test.file"), check.NotNil)
   671  	c.Assert(CopyFile(tmpFile1, tmpDir2), check.NotNil)
   672  	c.Assert(CopyFile(tmpFile1, tmpFile3), check.NotNil)
   673  
   674  	c.Assert(CopyFile(tmpFile1, tmpFile2, 0600), check.IsNil)
   675  	c.Assert(GetSize(tmpFile2), check.Equals, int64(5))
   676  	c.Assert(GetMode(tmpFile2), check.Equals, os.FileMode(0600))
   677  
   678  	os.Remove(tmpFile2)
   679  
   680  	c.Assert(CopyFile(tmpFile1, tmpFile2, 0600), check.IsNil)
   681  	c.Assert(GetSize(tmpFile2), check.Equals, int64(5))
   682  	c.Assert(GetMode(tmpFile2), check.Equals, os.FileMode(0600))
   683  
   684  	_disableCopyFileChecks = true
   685  
   686  	c.Assert(CopyFile("", tmpFile2), check.NotNil)
   687  	c.Assert(CopyFile(tmpFile1, ""), check.NotNil)
   688  }
   689  
   690  func (s *FSSuite) TestMoveFile(c *check.C) {
   691  	tmpDir := c.MkDir()
   692  	tmpDir2 := c.MkDir()
   693  	tmpFile1 := tmpDir + "/test1.file"
   694  	tmpFile2 := tmpDir + "/test2.file"
   695  	tmpFile3 := tmpDir + "/test3.file"
   696  
   697  	c.Assert(ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644), check.IsNil)
   698  	c.Assert(ioutil.WriteFile(tmpFile3, []byte("TEST\n"), 0644), check.IsNil)
   699  
   700  	os.Chmod(tmpFile3, 0111)
   701  	os.Chmod(tmpDir2, 0500)
   702  
   703  	c.Assert(MoveFile("", tmpFile2), check.NotNil)
   704  	c.Assert(MoveFile(tmpFile1, ""), check.NotNil)
   705  	c.Assert(MoveFile("/not_exist", tmpFile2), check.NotNil)
   706  	c.Assert(MoveFile(tmpDir, tmpFile2), check.NotNil)
   707  	c.Assert(MoveFile(tmpFile3, tmpFile2), check.NotNil)
   708  	c.Assert(MoveFile(tmpFile1, "/not_exist/file.test"), check.NotNil)
   709  	c.Assert(MoveFile(tmpFile1, tmpDir2+"/file.test"), check.NotNil)
   710  
   711  	c.Assert(MoveFile(tmpFile1, tmpFile2), check.IsNil)
   712  	c.Assert(MoveFile(tmpFile2, tmpFile1, 0600), check.IsNil)
   713  
   714  	_disableMoveFileChecks = true
   715  
   716  	c.Assert(MoveFile("", tmpFile2), check.NotNil)
   717  }
   718  
   719  func (s *FSSuite) TestCopyDir(c *check.C) {
   720  	sourceDir := c.MkDir()
   721  	targetDir := c.MkDir() + "/data"
   722  
   723  	tmpDir1 := sourceDir + "/test1"
   724  	tmpDir2 := sourceDir + "/test2"
   725  	tmpDir3 := sourceDir + "/.test3"
   726  	tmpDir4 := tmpDir2 + "/test4"
   727  	tmpFile1 := sourceDir + "/test1.file"
   728  	tmpFile2 := tmpDir2 + "/test2.file"
   729  	tmpFile3 := tmpDir2 + "/.test3.file"
   730  
   731  	tmpDir5 := c.MkDir() + "/test5"
   732  	tmpDir6 := c.MkDir() + "/test6"
   733  
   734  	c.Assert(os.Mkdir(tmpDir1, 0775), check.IsNil)
   735  	c.Assert(os.Mkdir(tmpDir2, 0770), check.IsNil)
   736  	c.Assert(os.Mkdir(tmpDir3, 0770), check.IsNil)
   737  	c.Assert(os.Mkdir(tmpDir4, 0775), check.IsNil)
   738  	c.Assert(os.Mkdir(tmpDir5, 0200), check.IsNil)
   739  	c.Assert(os.Mkdir(tmpDir6, 0400), check.IsNil)
   740  
   741  	c.Assert(ioutil.WriteFile(tmpFile1, []byte("TEST\n"), 0644), check.IsNil)
   742  	c.Assert(ioutil.WriteFile(tmpFile2, []byte("TEST\n"), 0660), check.IsNil)
   743  	c.Assert(ioutil.WriteFile(tmpFile3, []byte("TEST\n"), 0600), check.IsNil)
   744  
   745  	c.Assert(CopyDir(sourceDir, targetDir), check.IsNil)
   746  
   747  	list1 := ListAll(sourceDir, false)
   748  	list2 := ListAll(targetDir, false)
   749  
   750  	sort.Strings(list1)
   751  	sort.Strings(list2)
   752  
   753  	c.Assert(list1, check.DeepEquals, list2)
   754  
   755  	c.Assert(CopyDir("", targetDir), check.NotNil)
   756  	c.Assert(CopyDir(sourceDir, ""), check.NotNil)
   757  	c.Assert(CopyDir(sourceDir+"1", targetDir), check.NotNil)
   758  	c.Assert(CopyDir(tmpFile1, targetDir), check.NotNil)
   759  	c.Assert(CopyDir(tmpDir5, targetDir), check.NotNil)
   760  	c.Assert(CopyDir(tmpDir1, tmpFile2), check.NotNil)
   761  	c.Assert(CopyDir(tmpDir1, tmpDir6), check.NotNil)
   762  
   763  	_disableCopyDirChecks = true
   764  
   765  	c.Assert(CopyDir(tmpDir1, "/root/abcd"), check.NotNil)
   766  }
   767  
   768  func (s *FSSuite) TestTouchFile(c *check.C) {
   769  	err := TouchFile("/__unknown__", 0600)
   770  
   771  	c.Assert(err, check.NotNil)
   772  
   773  	testDir := c.MkDir()
   774  	testFile := testDir + "/test.txt"
   775  
   776  	err = TouchFile(testFile, 0600)
   777  
   778  	c.Assert(err, check.IsNil)
   779  	c.Assert(IsExist(testFile), check.Equals, true)
   780  	c.Assert(IsEmpty(testFile), check.Equals, true)
   781  	c.Assert(GetMode(testFile), check.Equals, os.FileMode(0600))
   782  }
   783  
   784  func (s *FSSuite) TestInternal(c *check.C) {
   785  	c.Assert(getGIDList(nil), check.IsNil)
   786  
   787  	c.Assert(isReadableStat(nil, 0, nil), check.Equals, true)
   788  	c.Assert(isWritableStat(nil, 0, nil), check.Equals, true)
   789  	c.Assert(isExecutableStat(nil, 0, nil), check.Equals, true)
   790  
   791  	n, _ := fixCount(-100, nil)
   792  
   793  	c.Assert(n, check.Equals, 0)
   794  }