xref: /haiku/src/tests/kits/storage/StatableTest.cpp (revision cc868bc230be2ea503399f24feaa46ab6aa1d690)
1 // StatableTest.cpp
2 
3 #include <sys/stat.h>
4 
5 #include <cppunit/TestCaller.h>
6 #include <cppunit/TestSuite.h>
7 
8 #include <Statable.h>
9 #include <Entry.h>
10 #include <Node.h>
11 #include <Volume.h>
12 
13 #include "StatableTest.h"
14 
15 // setUp
16 void
setUp()17 StatableTest::setUp()
18 {
19 	BasicTest::setUp();
20 }
21 
22 // tearDown
23 void
tearDown()24 StatableTest::tearDown()
25 {
26 	BasicTest::tearDown();
27 }
28 
29 // GetStatTest
30 void
GetStatTest()31 StatableTest::GetStatTest()
32 {
33 	TestStatables testEntries;
34 	BStatable *statable;
35 	string entryName;
36 	// existing entries
37 	NextSubTest();
38 	CreateROStatables(testEntries);
39 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
40 		struct stat st1, st2;
41 		CPPUNIT_ASSERT( statable->GetStat(&st1) == B_OK );
42 		CPPUNIT_ASSERT( lstat(entryName.c_str(), &st2) == 0 );
43 		CPPUNIT_ASSERT( st1 == st2 );
44 	}
45 	testEntries.delete_all();
46 	// uninitialized objects
47 	NextSubTest();
48 	CreateUninitializedStatables(testEntries);
49 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
50 		struct stat st1;
51 		CPPUNIT_ASSERT( statable->GetStat(&st1) == B_NO_INIT );
52 	}
53 	testEntries.delete_all();
54 	// bad args
55 	NextSubTest();
56 	CreateROStatables(testEntries);
57 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); )
58 		CPPUNIT_ASSERT( statable->GetStat(NULL) != B_OK );
59 	testEntries.delete_all();
60 }
61 
62 // IsXYZTest
63 void
IsXYZTest()64 StatableTest::IsXYZTest()
65 {
66 	TestStatables testEntries;
67 	BStatable *statable;
68 	string entryName;
69 	// existing entries
70 	NextSubTest();
71 	CreateROStatables(testEntries);
72 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
73 		struct stat st;
74 		CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 );
75 		CPPUNIT_ASSERT( statable->IsDirectory() == S_ISDIR(st.st_mode) );
76 		CPPUNIT_ASSERT( statable->IsFile() == S_ISREG(st.st_mode) );
77 		CPPUNIT_ASSERT( statable->IsSymLink() == S_ISLNK(st.st_mode) );
78 	}
79 	testEntries.delete_all();
80 	// uninitialized objects
81 	NextSubTest();
82 	CreateUninitializedStatables(testEntries);
83 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
84 		CPPUNIT_ASSERT( statable->IsDirectory() == false );
85 		CPPUNIT_ASSERT( statable->IsFile() == false );
86 		CPPUNIT_ASSERT( statable->IsSymLink() == false );
87 	}
88 	testEntries.delete_all();
89 }
90 
91 // GetXYZTest
92 void
GetXYZTest()93 StatableTest::GetXYZTest()
94 {
95 	TestStatables testEntries;
96 	BStatable *statable;
97 	string entryName;
98 	// test with existing entries
99 	NextSubTest();
100 	CreateROStatables(testEntries);
101 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
102 		struct stat st;
103 		node_ref ref;
104 		uid_t owner;
105 		gid_t group;
106 		mode_t perms;
107 		off_t size;
108 		time_t mtime;
109 		time_t ctime;
110 // R5: access time unused
111 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
112 		time_t atime;
113 #endif
114 		BVolume volume;
115 		CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 );
116 		CPPUNIT_ASSERT( statable->GetNodeRef(&ref) == B_OK );
117 		CPPUNIT_ASSERT( statable->GetOwner(&owner) == B_OK );
118 		CPPUNIT_ASSERT( statable->GetGroup(&group) == B_OK );
119 		CPPUNIT_ASSERT( statable->GetPermissions(&perms) == B_OK );
120 		CPPUNIT_ASSERT( statable->GetSize(&size) == B_OK );
121 		CPPUNIT_ASSERT( statable->GetModificationTime(&mtime) == B_OK );
122 		CPPUNIT_ASSERT( statable->GetCreationTime(&ctime) == B_OK );
123 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
124 		CPPUNIT_ASSERT( statable->GetAccessTime(&atime) == B_OK );
125 #endif
126 		CPPUNIT_ASSERT( statable->GetVolume(&volume) == B_OK );
127 		CPPUNIT_ASSERT( ref.device == st.st_dev && ref.node == st.st_ino );
128 		CPPUNIT_ASSERT( owner == st.st_uid );
129 		CPPUNIT_ASSERT( group == st.st_gid );
130 // R5: returns not only the permission bits, so we need to filter for the test
131 //		CPPUNIT_ASSERT( perms == (st.st_mode & S_IUMSK) );
132 		CPPUNIT_ASSERT( (perms & S_IUMSK) == (st.st_mode & S_IUMSK) );
133 		CPPUNIT_ASSERT( size == st.st_size );
134 		CPPUNIT_ASSERT( mtime == st.st_mtime );
135 		CPPUNIT_ASSERT( ctime == st.st_crtime );
136 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
137 		CPPUNIT_ASSERT( atime == st.st_atime );
138 #endif
139 		CPPUNIT_ASSERT( volume == BVolume(st.st_dev) );
140 	}
141 	testEntries.delete_all();
142 	// test with uninitialized objects
143 	NextSubTest();
144 	CreateUninitializedStatables(testEntries);
145 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
146 		node_ref ref;
147 		uid_t owner;
148 		gid_t group;
149 		mode_t perms;
150 		off_t size;
151 		time_t mtime;
152 		time_t ctime;
153 		time_t atime;
154 		BVolume volume;
155 		CPPUNIT_ASSERT( statable->GetNodeRef(&ref) == B_NO_INIT );
156 		CPPUNIT_ASSERT( statable->GetOwner(&owner) == B_NO_INIT );
157 		CPPUNIT_ASSERT( statable->GetGroup(&group) == B_NO_INIT );
158 		CPPUNIT_ASSERT( statable->GetPermissions(&perms) == B_NO_INIT );
159 		CPPUNIT_ASSERT( statable->GetSize(&size) == B_NO_INIT );
160 		CPPUNIT_ASSERT( statable->GetModificationTime(&mtime) == B_NO_INIT );
161 		CPPUNIT_ASSERT( statable->GetCreationTime(&ctime) == B_NO_INIT );
162 		CPPUNIT_ASSERT( statable->GetAccessTime(&atime) == B_NO_INIT );
163 		CPPUNIT_ASSERT( statable->GetVolume(&volume) == B_NO_INIT );
164 	}
165 	testEntries.delete_all();
166 	// bad args
167 	NextSubTest();
168 	CreateROStatables(testEntries);
169 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
170 // R5: crashs, if passing NULL to any of these methods
171 #if !TEST_R5
172 		CPPUNIT_ASSERT( statable->GetNodeRef(NULL) == B_BAD_VALUE );
173 		CPPUNIT_ASSERT( statable->GetOwner(NULL)  == B_BAD_VALUE );
174 		CPPUNIT_ASSERT( statable->GetGroup(NULL)  == B_BAD_VALUE );
175 		CPPUNIT_ASSERT( statable->GetPermissions(NULL)  == B_BAD_VALUE );
176 		CPPUNIT_ASSERT( statable->GetSize(NULL)  == B_BAD_VALUE );
177 		CPPUNIT_ASSERT( statable->GetModificationTime(NULL)  == B_BAD_VALUE );
178 		CPPUNIT_ASSERT( statable->GetCreationTime(NULL)  == B_BAD_VALUE );
179 		CPPUNIT_ASSERT( statable->GetAccessTime(NULL)  == B_BAD_VALUE );
180 		CPPUNIT_ASSERT( statable->GetVolume(NULL)  == B_BAD_VALUE );
181 #endif
182 	}
183 	testEntries.delete_all();
184 }
185 
186 // SetXYZTest
187 void
SetXYZTest()188 StatableTest::SetXYZTest()
189 {
190 	TestStatables testEntries;
191 	BStatable *statable;
192 	string entryName;
193 	// test with existing entries
194 	NextSubTest();
195 	CreateRWStatables(testEntries);
196 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
197 		struct stat st;
198 		uid_t owner = 0xdad;
199 		gid_t group = 0xdee;
200 		mode_t perms = 0x0ab;	// -w- r-x -wx	-- unusual enough? ;-)
201 		time_t mtime = 1234567;
202 		time_t ctime = 654321;
203 // R5: access time unused
204 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
205 		time_t atime = 2345678;
206 #endif
207 		CPPUNIT_ASSERT( statable->SetOwner(owner) == B_OK );
208 		CPPUNIT_ASSERT( statable->SetGroup(group) == B_OK );
209 		CPPUNIT_ASSERT( statable->SetPermissions(perms) == B_OK );
210 		CPPUNIT_ASSERT( statable->SetModificationTime(mtime) == B_OK );
211 		CPPUNIT_ASSERT( statable->SetCreationTime(ctime) == B_OK );
212 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
213 		CPPUNIT_ASSERT( statable->SetAccessTime(atime) == B_OK );
214 #endif
215 		CPPUNIT_ASSERT( lstat(entryName.c_str(), &st) == 0 );
216 		CPPUNIT_ASSERT( owner == st.st_uid );
217 		CPPUNIT_ASSERT( group == st.st_gid );
218 		CPPUNIT_ASSERT( perms == (st.st_mode & S_IUMSK) );
219 		CPPUNIT_ASSERT( mtime == st.st_mtime );
220 		CPPUNIT_ASSERT( ctime == st.st_crtime );
221 #if !TEST_R5 && !TEST_OBOS /* !!!POSIX ONLY!!! */
222 		CPPUNIT_ASSERT( atime == st.st_atime );
223 #endif
224 	}
225 	testEntries.delete_all();
226 	// test with uninitialized objects
227 	NextSubTest();
228 	CreateUninitializedStatables(testEntries);
229 	for (testEntries.rewind(); testEntries.getNext(statable, entryName); ) {
230 		uid_t owner = 0xdad;
231 		gid_t group = 0xdee;
232 		mode_t perms = 0x0ab;	// -w- r-x -wx	-- unusual enough? ;-)
233 		time_t mtime = 1234567;
234 		time_t ctime = 654321;
235 		time_t atime = 2345678;
236 		CPPUNIT_ASSERT( statable->SetOwner(owner) != B_OK );
237 		CPPUNIT_ASSERT( statable->SetGroup(group) != B_OK );
238 		CPPUNIT_ASSERT( statable->SetPermissions(perms) != B_OK );
239 		CPPUNIT_ASSERT( statable->SetModificationTime(mtime) != B_OK );
240 		CPPUNIT_ASSERT( statable->SetCreationTime(ctime) != B_OK );
241 		CPPUNIT_ASSERT( statable->SetAccessTime(atime) != B_OK );
242 	}
243 	testEntries.delete_all();
244 }
245