pkg.re/essentialkaos/ek.v8@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 }