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