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