xref: /haiku/src/tests/kits/storage/BasicTest.h (revision 77aa0e2a5ef8e6d00570dbeb7a12aeb23e9e5cf0)
1 // BasicTest.h
2 
3 #ifndef __sk_basic_test_h__
4 #define __sk_basic_test_h__
5 
6 #include <SupportDefs.h>
7 #include <TestCase.h>
8 #include <TestShell.h>
9 #include <stdio.h>
10 
11 #include <set>
12 using std::set;
13 #include <string>
14 using std::string;
15 
16 
17 class BasicTest : public BTestCase
18 {
19 public:
20 	BasicTest();
21 
22 	// This function called before *each* test added in Suite()
23 	void setUp();
24 
25 	// This function called after *each* test added in Suite()
26 	void tearDown();
27 
28 	// helper functions
29 
30 //	void nextSubTest();
31 //	void nextSubTestBlock();
32 
33 	static void execCommand(const string &command);
34 
35 	static void dumpStat(struct stat &st);
36 
37 	static void createVolume(string imageFile, string mountPoint, int32 megs,
38 							 bool makeMountPoint = true);
39 	static void deleteVolume(string imageFile, string mountPoint,
40 							 bool deleteMountPoint = true);
41 
42 protected:
43 	int32 fSubTestNumber;
44 	int32 fAvailableFDs;
45 };
46 
47 
48 // Some other helpful stuff.
49 
50 // == for struct stat
51 static
52 inline
53 bool
54 operator==(const struct stat &st1, const struct stat &st2)
55 {
56 	return (
57 		st1.st_dev == st2.st_dev
58 		&& st1.st_ino == st2.st_ino
59 		&& st1.st_mode == st2.st_mode
60 		&& st1.st_nlink == st2.st_nlink
61 		&& st1.st_uid == st2.st_uid
62 		&& st1.st_gid == st2.st_gid
63 		&& st1.st_size == st2.st_size
64 		&& st1.st_blksize == st2.st_blksize
65 		&& st1.st_atime == st2.st_atime
66 		&& st1.st_mtime == st2.st_mtime
67 		&& st1.st_ctime == st2.st_ctime
68 		&& st1.st_crtime == st2.st_crtime
69 	);
70 }
71 
72 // first parameter is equal to the second or third
73 template<typename A, typename B, typename C>
74 static
75 inline
76 bool
equals(const A & a,const B & b,const C & c)77 equals(const A &a, const B &b, const C &c)
78 {
79 	return (a == b || a == c);
80 }
81 
82 // A little helper class for tests. It works like a set of strings, that
83 // are marked tested or untested.
84 class TestSet {
85 public:
86 	typedef set<string> nameset;
87 
88 public:
TestSet()89 	TestSet()
90 	{
91 	}
92 
add(string name)93 	void add(string name)
94 	{
95 		if (fTestedNames.find(name) == fTestedNames.end())
96 			fUntestedNames.insert(name);
97 	}
98 
remove(string name)99 	void remove(string name)
100 	{
101 		if (fUntestedNames.find(name) != fUntestedNames.end())
102 			fUntestedNames.erase(name);
103 		else if (fTestedNames.find(name) != fTestedNames.end())
104 			fTestedNames.erase(name);
105 	}
106 
clear()107 	void clear()
108 	{
109 		fUntestedNames.clear();
110 		fTestedNames.clear();
111 	}
112 
rewind()113 	void rewind()
114 	{
115 		fUntestedNames.insert(fTestedNames.begin(), fTestedNames.end());
116 		fTestedNames.clear();
117 	}
118 
119 	bool test(string name, bool dump = BTestShell::GlobalBeVerbose())
120 	{
121 		bool result = (fUntestedNames.find(name) != fUntestedNames.end());
122 		if (result) {
123 			fUntestedNames.erase(name);
124 			fTestedNames.insert(name);
125 		} else if (dump) {
126 			// dump untested
127 			printf("TestSet::test(`%s')\n", name.c_str());
128 			printf("untested:\n");
129 			for (nameset::iterator it = fUntestedNames.begin();
130 				 it != fUntestedNames.end();
131 				 ++it) {
132 				printf("  `%s'\n", it->c_str());
133 			}
134 		}
135 		return result;
136 	}
137 
testDone()138 	bool testDone()
139 	{
140 		return (fUntestedNames.empty());
141 	}
142 
143 private:
144 	nameset	fUntestedNames;
145 	nameset	fTestedNames;
146 };
147 
148 
149 #endif	// __sk_basic_test_h__
150