xref: /haiku/src/tests/kits/storage/StatableTest.cpp (revision cc868bc230be2ea503399f24feaa46ab6aa1d690)
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
setUp()1752a38012Sejakowatz StatableTest::setUp()
1852a38012Sejakowatz {
1952a38012Sejakowatz 	BasicTest::setUp();
2052a38012Sejakowatz }
2152a38012Sejakowatz 
2252a38012Sejakowatz // tearDown
2352a38012Sejakowatz void
tearDown()2452a38012Sejakowatz StatableTest::tearDown()
2552a38012Sejakowatz {
2652a38012Sejakowatz 	BasicTest::tearDown();
2752a38012Sejakowatz }
2852a38012Sejakowatz 
2952a38012Sejakowatz // GetStatTest
3052a38012Sejakowatz void
GetStatTest()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
IsXYZTest()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
GetXYZTest()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 		CPPUNIT_ASSERT( volume == BVolume(st.st_dev) );
14052a38012Sejakowatz 	}
14152a38012Sejakowatz 	testEntries.delete_all();
14252a38012Sejakowatz 	// test with uninitialized objects
143*d1f6c38fSTyler Dauwalder 	NextSubTest();
14452a38012Sejakowatz 	CreateUninitializedStatables(testEntries);
14552a38012Sejakowatz 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
14652a38012Sejakowatz 		node_ref ref;
14752a38012Sejakowatz 		uid_t owner;
14852a38012Sejakowatz 		gid_t group;
14952a38012Sejakowatz 		mode_t perms;
15052a38012Sejakowatz 		off_t size;
15152a38012Sejakowatz 		time_t mtime;
15252a38012Sejakowatz 		time_t ctime;
15352a38012Sejakowatz 		time_t atime;
15452a38012Sejakowatz 		BVolume volume;
15552a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetNodeRef(&ref) == B_NO_INIT );
15652a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetOwner(&owner) == B_NO_INIT );
15752a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetGroup(&group) == B_NO_INIT );
15852a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetPermissions(&perms) == B_NO_INIT );
15952a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetSize(&size) == B_NO_INIT );
16052a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetModificationTime(&mtime) == B_NO_INIT );
16152a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetCreationTime(&ctime) == B_NO_INIT );
16252a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetAccessTime(&atime) == B_NO_INIT );
16352a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetVolume(&volume) == B_NO_INIT );
16452a38012Sejakowatz 	}
16552a38012Sejakowatz 	testEntries.delete_all();
16652a38012Sejakowatz 	// bad args
167*d1f6c38fSTyler Dauwalder 	NextSubTest();
16852a38012Sejakowatz 	CreateROStatables(testEntries);
16952a38012Sejakowatz 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
17052a38012Sejakowatz // R5: crashs, if passing NULL to any of these methods
171*d1f6c38fSTyler Dauwalder #if !TEST_R5
17252a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetNodeRef(NULL) == B_BAD_VALUE );
17352a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetOwner(NULL)  == B_BAD_VALUE );
17452a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetGroup(NULL)  == B_BAD_VALUE );
17552a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetPermissions(NULL)  == B_BAD_VALUE );
17652a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetSize(NULL)  == B_BAD_VALUE );
17752a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetModificationTime(NULL)  == B_BAD_VALUE );
17852a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetCreationTime(NULL)  == B_BAD_VALUE );
17952a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetAccessTime(NULL)  == B_BAD_VALUE );
18052a38012Sejakowatz 		CPPUNIT_ASSERT( statable->GetVolume(NULL)  == B_BAD_VALUE );
18152a38012Sejakowatz #endif
18252a38012Sejakowatz 	}
18352a38012Sejakowatz 	testEntries.delete_all();
18452a38012Sejakowatz }
18552a38012Sejakowatz 
18652a38012Sejakowatz // SetXYZTest
18752a38012Sejakowatz void
SetXYZTest()18852a38012Sejakowatz StatableTest::SetXYZTest()
18952a38012Sejakowatz {
19052a38012Sejakowatz 	TestStatables testEntries;
19152a38012Sejakowatz 	BStatable *statable;
19252a38012Sejakowatz 	string entryName;
19352a38012Sejakowatz 	// test with existing entries
194*d1f6c38fSTyler Dauwalder 	NextSubTest();
19552a38012Sejakowatz 	CreateRWStatables(testEntries);
19652a38012Sejakowatz 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
19752a38012Sejakowatz 		struct stat st;
19852a38012Sejakowatz 		uid_t owner = 0xdad;
19952a38012Sejakowatz 		gid_t group = 0xdee;
20052a38012Sejakowatz 		mode_t perms = 0x0ab;	// -w- r-x -wx	-- unusual enough? ;-)
20152a38012Sejakowatz 		time_t mtime = 1234567;
20252a38012Sejakowatz 		time_t ctime = 654321;
20352a38012Sejakowatz // R5: access time unused
204*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
20552a38012Sejakowatz 		time_t atime = 2345678;
20652a38012Sejakowatz #endif
20752a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetOwner(owner) == B_OK );
20852a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetGroup(group) == B_OK );
20952a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetPermissions(perms) == B_OK );
21052a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetModificationTime(mtime) == B_OK );
21152a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetCreationTime(ctime) == B_OK );
212*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
21352a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetAccessTime(atime) == B_OK );
21452a38012Sejakowatz #endif
21552a38012Sejakowatz 		CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 );
21652a38012Sejakowatz 		CPPUNIT_ASSERT( owner == st.st_uid );
21752a38012Sejakowatz 		CPPUNIT_ASSERT( group == st.st_gid );
21852a38012Sejakowatz 		CPPUNIT_ASSERT( perms == (st.st_mode & S_IUMSK) );
21952a38012Sejakowatz 		CPPUNIT_ASSERT( mtime == st.st_mtime );
22052a38012Sejakowatz 		CPPUNIT_ASSERT( ctime == st.st_crtime );
221*d1f6c38fSTyler Dauwalder #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
22252a38012Sejakowatz 		CPPUNIT_ASSERT( atime == st.st_atime );
22352a38012Sejakowatz #endif
22452a38012Sejakowatz 	}
22552a38012Sejakowatz 	testEntries.delete_all();
22652a38012Sejakowatz 	// test with uninitialized objects
227*d1f6c38fSTyler Dauwalder 	NextSubTest();
22852a38012Sejakowatz 	CreateUninitializedStatables(testEntries);
22952a38012Sejakowatz 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
23052a38012Sejakowatz 		uid_t owner = 0xdad;
23152a38012Sejakowatz 		gid_t group = 0xdee;
23252a38012Sejakowatz 		mode_t perms = 0x0ab;	// -w- r-x -wx	-- unusual enough? ;-)
23352a38012Sejakowatz 		time_t mtime = 1234567;
23452a38012Sejakowatz 		time_t ctime = 654321;
23552a38012Sejakowatz 		time_t atime = 2345678;
23652a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetOwner(owner) != B_OK );
23752a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetGroup(group) != B_OK );
23852a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetPermissions(perms) != B_OK );
23952a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetModificationTime(mtime) != B_OK );
24052a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetCreationTime(ctime) != B_OK );
24152a38012Sejakowatz 		CPPUNIT_ASSERT( statable->SetAccessTime(atime) != B_OK );
24252a38012Sejakowatz 	}
24352a38012Sejakowatz 	testEntries.delete_all();
24452a38012Sejakowatz }
245