152a38012Sejakowatz // StatableTest.cpp 252a38012Sejakowatz 352a38012Sejakowatz #include <sys/stat.h> 452a38012Sejakowatz 552a38012Sejakowatz #include <cppunit/TestCaller.h> 652a38012Sejakowatz #include <cppunit/TestSuite.h> 752a38012Sejakowatz 852a38012Sejakowatz #include <Statable.h> 952a38012Sejakowatz #include <Entry.h> 1052a38012Sejakowatz #include <Node.h> 1152a38012Sejakowatz #include <Volume.h> 1252a38012Sejakowatz 1352a38012Sejakowatz #include "StatableTest.h" 1452a38012Sejakowatz 1552a38012Sejakowatz // setUp 1652a38012Sejakowatz void 1752a38012Sejakowatz StatableTest::setUp() 1852a38012Sejakowatz { 1952a38012Sejakowatz BasicTest::setUp(); 2052a38012Sejakowatz } 2152a38012Sejakowatz 2252a38012Sejakowatz // tearDown 2352a38012Sejakowatz void 2452a38012Sejakowatz StatableTest::tearDown() 2552a38012Sejakowatz { 2652a38012Sejakowatz BasicTest::tearDown(); 2752a38012Sejakowatz } 2852a38012Sejakowatz 2952a38012Sejakowatz // GetStatTest 3052a38012Sejakowatz void 3152a38012Sejakowatz StatableTest::GetStatTest() 3252a38012Sejakowatz { 3352a38012Sejakowatz TestStatables testEntries; 3452a38012Sejakowatz BStatable *statable; 3552a38012Sejakowatz string entryName; 3652a38012Sejakowatz // existing entries 37*d1f6c38fSTyler Dauwalder NextSubTest(); 3852a38012Sejakowatz CreateROStatables(testEntries); 3952a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 4052a38012Sejakowatz struct stat st1, st2; 4152a38012Sejakowatz CPPUNIT_ASSERT( statable->GetStat(&st1) == B_OK ); 4252a38012Sejakowatz CPPUNIT_ASSERT( lstat(entryName.c_str(), &st2) == 0 ); 4352a38012Sejakowatz CPPUNIT_ASSERT( st1 == st2 ); 4452a38012Sejakowatz } 4552a38012Sejakowatz testEntries.delete_all(); 4652a38012Sejakowatz // uninitialized objects 47*d1f6c38fSTyler Dauwalder NextSubTest(); 4852a38012Sejakowatz CreateUninitializedStatables(testEntries); 4952a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 5052a38012Sejakowatz struct stat st1; 5152a38012Sejakowatz CPPUNIT_ASSERT( statable->GetStat(&st1) == B_NO_INIT ); 5252a38012Sejakowatz } 5352a38012Sejakowatz testEntries.delete_all(); 5452a38012Sejakowatz // bad args 55*d1f6c38fSTyler Dauwalder NextSubTest(); 5652a38012Sejakowatz CreateROStatables(testEntries); 5752a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) 5852a38012Sejakowatz CPPUNIT_ASSERT( statable->GetStat(NULL) != B_OK ); 5952a38012Sejakowatz testEntries.delete_all(); 6052a38012Sejakowatz } 6152a38012Sejakowatz 6252a38012Sejakowatz // IsXYZTest 6352a38012Sejakowatz void 6452a38012Sejakowatz StatableTest::IsXYZTest() 6552a38012Sejakowatz { 6652a38012Sejakowatz TestStatables testEntries; 6752a38012Sejakowatz BStatable *statable; 6852a38012Sejakowatz string entryName; 6952a38012Sejakowatz // existing entries 70*d1f6c38fSTyler Dauwalder NextSubTest(); 7152a38012Sejakowatz CreateROStatables(testEntries); 7252a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 7352a38012Sejakowatz struct stat st; 7452a38012Sejakowatz CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 ); 7552a38012Sejakowatz CPPUNIT_ASSERT( statable->IsDirectory() == S_ISDIR(st.st_mode) ); 7652a38012Sejakowatz CPPUNIT_ASSERT( statable->IsFile() == S_ISREG(st.st_mode) ); 7752a38012Sejakowatz CPPUNIT_ASSERT( statable->IsSymLink() == S_ISLNK(st.st_mode) ); 7852a38012Sejakowatz } 7952a38012Sejakowatz testEntries.delete_all(); 8052a38012Sejakowatz // uninitialized objects 81*d1f6c38fSTyler Dauwalder NextSubTest(); 8252a38012Sejakowatz CreateUninitializedStatables(testEntries); 8352a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 8452a38012Sejakowatz CPPUNIT_ASSERT( statable->IsDirectory() == false ); 8552a38012Sejakowatz CPPUNIT_ASSERT( statable->IsFile() == false ); 8652a38012Sejakowatz CPPUNIT_ASSERT( statable->IsSymLink() == false ); 8752a38012Sejakowatz } 8852a38012Sejakowatz testEntries.delete_all(); 8952a38012Sejakowatz } 9052a38012Sejakowatz 9152a38012Sejakowatz // GetXYZTest 9252a38012Sejakowatz void 9352a38012Sejakowatz StatableTest::GetXYZTest() 9452a38012Sejakowatz { 9552a38012Sejakowatz TestStatables testEntries; 9652a38012Sejakowatz BStatable *statable; 9752a38012Sejakowatz string entryName; 9852a38012Sejakowatz // test with existing entries 99*d1f6c38fSTyler Dauwalder NextSubTest(); 10052a38012Sejakowatz CreateROStatables(testEntries); 10152a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 10252a38012Sejakowatz struct stat st; 10352a38012Sejakowatz node_ref ref; 10452a38012Sejakowatz uid_t owner; 10552a38012Sejakowatz gid_t group; 10652a38012Sejakowatz mode_t perms; 10752a38012Sejakowatz off_t size; 10852a38012Sejakowatz time_t mtime; 10952a38012Sejakowatz time_t ctime; 11052a38012Sejakowatz // R5: access time unused 111*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 11252a38012Sejakowatz time_t atime; 11352a38012Sejakowatz #endif 11452a38012Sejakowatz BVolume volume; 11552a38012Sejakowatz CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 ); 11652a38012Sejakowatz CPPUNIT_ASSERT( statable->GetNodeRef(&ref) == B_OK ); 11752a38012Sejakowatz CPPUNIT_ASSERT( statable->GetOwner(&owner) == B_OK ); 11852a38012Sejakowatz CPPUNIT_ASSERT( statable->GetGroup(&group) == B_OK ); 11952a38012Sejakowatz CPPUNIT_ASSERT( statable->GetPermissions(&perms) == B_OK ); 12052a38012Sejakowatz CPPUNIT_ASSERT( statable->GetSize(&size) == B_OK ); 12152a38012Sejakowatz CPPUNIT_ASSERT( statable->GetModificationTime(&mtime) == B_OK ); 12252a38012Sejakowatz CPPUNIT_ASSERT( statable->GetCreationTime(&ctime) == B_OK ); 123*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 12452a38012Sejakowatz CPPUNIT_ASSERT( statable->GetAccessTime(&atime) == B_OK ); 12552a38012Sejakowatz #endif 12652a38012Sejakowatz CPPUNIT_ASSERT( statable->GetVolume(&volume) == B_OK ); 12752a38012Sejakowatz CPPUNIT_ASSERT( ref.device == st.st_dev && ref.node == st.st_ino ); 12852a38012Sejakowatz CPPUNIT_ASSERT( owner == st.st_uid ); 12952a38012Sejakowatz CPPUNIT_ASSERT( group == st.st_gid ); 13052a38012Sejakowatz // R5: returns not only the permission bits, so we need to filter for the test 13152a38012Sejakowatz // CPPUNIT_ASSERT( perms == (st.st_mode & S_IUMSK) ); 13252a38012Sejakowatz CPPUNIT_ASSERT( (perms & S_IUMSK) == (st.st_mode & S_IUMSK) ); 13352a38012Sejakowatz CPPUNIT_ASSERT( size == st.st_size ); 13452a38012Sejakowatz CPPUNIT_ASSERT( mtime == st.st_mtime ); 13552a38012Sejakowatz CPPUNIT_ASSERT( ctime == st.st_crtime ); 136*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 13752a38012Sejakowatz CPPUNIT_ASSERT( atime == st.st_atime ); 13852a38012Sejakowatz #endif 13952a38012Sejakowatz // OBOS: BVolume::==() is not implemented yet 140*d1f6c38fSTyler Dauwalder #if !TEST_OBOS /* !!!POSIX ONLY!!! */ 14152a38012Sejakowatz CPPUNIT_ASSERT( volume == BVolume(st.st_dev) ); 14252a38012Sejakowatz #endif 14352a38012Sejakowatz } 14452a38012Sejakowatz testEntries.delete_all(); 14552a38012Sejakowatz // test with uninitialized objects 146*d1f6c38fSTyler Dauwalder NextSubTest(); 14752a38012Sejakowatz CreateUninitializedStatables(testEntries); 14852a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 14952a38012Sejakowatz node_ref ref; 15052a38012Sejakowatz uid_t owner; 15152a38012Sejakowatz gid_t group; 15252a38012Sejakowatz mode_t perms; 15352a38012Sejakowatz off_t size; 15452a38012Sejakowatz time_t mtime; 15552a38012Sejakowatz time_t ctime; 15652a38012Sejakowatz time_t atime; 15752a38012Sejakowatz BVolume volume; 15852a38012Sejakowatz CPPUNIT_ASSERT( statable->GetNodeRef(&ref) == B_NO_INIT ); 15952a38012Sejakowatz CPPUNIT_ASSERT( statable->GetOwner(&owner) == B_NO_INIT ); 16052a38012Sejakowatz CPPUNIT_ASSERT( statable->GetGroup(&group) == B_NO_INIT ); 16152a38012Sejakowatz CPPUNIT_ASSERT( statable->GetPermissions(&perms) == B_NO_INIT ); 16252a38012Sejakowatz CPPUNIT_ASSERT( statable->GetSize(&size) == B_NO_INIT ); 16352a38012Sejakowatz CPPUNIT_ASSERT( statable->GetModificationTime(&mtime) == B_NO_INIT ); 16452a38012Sejakowatz CPPUNIT_ASSERT( statable->GetCreationTime(&ctime) == B_NO_INIT ); 16552a38012Sejakowatz CPPUNIT_ASSERT( statable->GetAccessTime(&atime) == B_NO_INIT ); 16652a38012Sejakowatz CPPUNIT_ASSERT( statable->GetVolume(&volume) == B_NO_INIT ); 16752a38012Sejakowatz } 16852a38012Sejakowatz testEntries.delete_all(); 16952a38012Sejakowatz // bad args 170*d1f6c38fSTyler Dauwalder NextSubTest(); 17152a38012Sejakowatz CreateROStatables(testEntries); 17252a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 17352a38012Sejakowatz // R5: crashs, if passing NULL to any of these methods 174*d1f6c38fSTyler Dauwalder #if !TEST_R5 17552a38012Sejakowatz CPPUNIT_ASSERT( statable->GetNodeRef(NULL) == B_BAD_VALUE ); 17652a38012Sejakowatz CPPUNIT_ASSERT( statable->GetOwner(NULL) == B_BAD_VALUE ); 17752a38012Sejakowatz CPPUNIT_ASSERT( statable->GetGroup(NULL) == B_BAD_VALUE ); 17852a38012Sejakowatz CPPUNIT_ASSERT( statable->GetPermissions(NULL) == B_BAD_VALUE ); 17952a38012Sejakowatz CPPUNIT_ASSERT( statable->GetSize(NULL) == B_BAD_VALUE ); 18052a38012Sejakowatz CPPUNIT_ASSERT( statable->GetModificationTime(NULL) == B_BAD_VALUE ); 18152a38012Sejakowatz CPPUNIT_ASSERT( statable->GetCreationTime(NULL) == B_BAD_VALUE ); 18252a38012Sejakowatz CPPUNIT_ASSERT( statable->GetAccessTime(NULL) == B_BAD_VALUE ); 18352a38012Sejakowatz CPPUNIT_ASSERT( statable->GetVolume(NULL) == B_BAD_VALUE ); 18452a38012Sejakowatz #endif 18552a38012Sejakowatz } 18652a38012Sejakowatz testEntries.delete_all(); 18752a38012Sejakowatz } 18852a38012Sejakowatz 18952a38012Sejakowatz // SetXYZTest 19052a38012Sejakowatz void 19152a38012Sejakowatz StatableTest::SetXYZTest() 19252a38012Sejakowatz { 19352a38012Sejakowatz TestStatables testEntries; 19452a38012Sejakowatz BStatable *statable; 19552a38012Sejakowatz string entryName; 19652a38012Sejakowatz // test with existing entries 197*d1f6c38fSTyler Dauwalder NextSubTest(); 19852a38012Sejakowatz CreateRWStatables(testEntries); 19952a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 20052a38012Sejakowatz struct stat st; 20152a38012Sejakowatz uid_t owner = 0xdad; 20252a38012Sejakowatz gid_t group = 0xdee; 20352a38012Sejakowatz // OBOS: no fchmod(), no FD time setters 204*d1f6c38fSTyler Dauwalder #if !TEST_OBOS /* !!!POSIX ONLY!!! */ 20552a38012Sejakowatz mode_t perms = 0x0ab; // -w- r-x -wx -- unusual enough? ;-) 20652a38012Sejakowatz time_t mtime = 1234567; 20752a38012Sejakowatz time_t ctime = 654321; 20852a38012Sejakowatz #endif 20952a38012Sejakowatz // R5: access time unused 210*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 21152a38012Sejakowatz time_t atime = 2345678; 21252a38012Sejakowatz #endif 21352a38012Sejakowatz // OBOS: no fchmod(), no FD time setters 21452a38012Sejakowatz CPPUNIT_ASSERT( statable->SetOwner(owner) == B_OK ); 21552a38012Sejakowatz CPPUNIT_ASSERT( statable->SetGroup(group) == B_OK ); 216*d1f6c38fSTyler Dauwalder #if !TEST_OBOS /* !!!POSIX ONLY!!! */ 21752a38012Sejakowatz CPPUNIT_ASSERT( statable->SetPermissions(perms) == B_OK ); 21852a38012Sejakowatz CPPUNIT_ASSERT( statable->SetModificationTime(mtime) == B_OK ); 21952a38012Sejakowatz CPPUNIT_ASSERT( statable->SetCreationTime(ctime) == B_OK ); 22052a38012Sejakowatz #endif 221*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 22252a38012Sejakowatz CPPUNIT_ASSERT( statable->SetAccessTime(atime) == B_OK ); 22352a38012Sejakowatz #endif 22452a38012Sejakowatz CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 ); 22552a38012Sejakowatz CPPUNIT_ASSERT( owner == st.st_uid ); 22652a38012Sejakowatz CPPUNIT_ASSERT( group == st.st_gid ); 227*d1f6c38fSTyler Dauwalder #if !TEST_OBOS /* !!!POSIX ONLY!!! */ 22852a38012Sejakowatz CPPUNIT_ASSERT( perms == (st.st_mode & S_IUMSK) ); 22952a38012Sejakowatz CPPUNIT_ASSERT( mtime == st.st_mtime ); 23052a38012Sejakowatz CPPUNIT_ASSERT( ctime == st.st_crtime ); 23152a38012Sejakowatz #endif 232*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */ 23352a38012Sejakowatz CPPUNIT_ASSERT( atime == st.st_atime ); 23452a38012Sejakowatz #endif 23552a38012Sejakowatz } 23652a38012Sejakowatz testEntries.delete_all(); 23752a38012Sejakowatz // test with uninitialized objects 238*d1f6c38fSTyler Dauwalder NextSubTest(); 23952a38012Sejakowatz CreateUninitializedStatables(testEntries); 24052a38012Sejakowatz for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) { 24152a38012Sejakowatz uid_t owner = 0xdad; 24252a38012Sejakowatz gid_t group = 0xdee; 24352a38012Sejakowatz mode_t perms = 0x0ab; // -w- r-x -wx -- unusual enough? ;-) 24452a38012Sejakowatz time_t mtime = 1234567; 24552a38012Sejakowatz time_t ctime = 654321; 24652a38012Sejakowatz time_t atime = 2345678; 24752a38012Sejakowatz CPPUNIT_ASSERT( statable->SetOwner(owner) != B_OK ); 24852a38012Sejakowatz CPPUNIT_ASSERT( statable->SetGroup(group) != B_OK ); 24952a38012Sejakowatz CPPUNIT_ASSERT( statable->SetPermissions(perms) != B_OK ); 25052a38012Sejakowatz CPPUNIT_ASSERT( statable->SetModificationTime(mtime) != B_OK ); 25152a38012Sejakowatz CPPUNIT_ASSERT( statable->SetCreationTime(ctime) != B_OK ); 25252a38012Sejakowatz CPPUNIT_ASSERT( statable->SetAccessTime(atime) != B_OK ); 25352a38012Sejakowatz } 25452a38012Sejakowatz testEntries.delete_all(); 25552a38012Sejakowatz } 256