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 }