xref: /haiku/src/tests/system/libroot/posix/TestUnitUtils.h (revision cefb069022202b5aca22614b93cb4e3b810a8e7a)
1 /*
2  * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _UNIT_TEST_UTILS_H
6 #define _UNIT_TEST_UTILS_H
7 
8 static timespec*
absolute_timeout(timespec & timeout,bigtime_t relativeTimeout)9 absolute_timeout(timespec& timeout, bigtime_t relativeTimeout)
10 {
11 	timeval tv;
12 	gettimeofday(&tv, NULL);
13 	timeout.tv_sec = tv.tv_sec + relativeTimeout / 1000000;
14 	timeout.tv_nsec = (tv.tv_usec + relativeTimeout % 1000000) * 1000;
15 	if (timeout.tv_nsec > 1000000000) {
16 		timeout.tv_sec++;
17 		timeout.tv_nsec -= 1000000000;
18 	}
19 
20 	return &timeout;
21 }
22 
23 
24 template<typename Type>
25 static void
_assert_equals(const char * test,const Type & expected,const Type & actual,int lineNumber)26 _assert_equals(const char* test, const Type& expected, const Type& actual,
27 	int lineNumber)
28 {
29 	if (actual == expected)
30 		return;
31 
32 	fprintf(stderr, "%s FAILED in line %d\n", test, lineNumber);
33 	exit(1);
34 }
35 
36 
37 template<typename Type>
38 static void
_assert_equals_not(const char * test,const Type & unexpected,const Type & actual,int lineNumber)39 _assert_equals_not(const char* test, const Type& unexpected, const Type& actual,
40 	int lineNumber)
41 {
42 	if (actual != unexpected)
43 		return;
44 
45 	fprintf(stderr, "%s FAILED in line %d\n", test, lineNumber);
46 	exit(1);
47 }
48 
49 
50 static void
_assert_time_equals(const char * test,bigtime_t expected,bigtime_t actual,int lineNumber)51 _assert_time_equals(const char* test, bigtime_t expected,
52 	bigtime_t actual, int lineNumber)
53 {
54 	// allow 5% deviation
55 	bigtime_t diff = actual > expected ? actual - expected : expected - actual;
56 	if (diff <= expected / 20)
57 		return;
58 
59 	fprintf(stderr, "%s FAILED in line %d: expected time: %lld, actual: %lld\n",
60 		test, lineNumber, (long long)expected, (long long)actual);
61 	exit(1);
62 }
63 
64 
65 static void
_assert_posix_bool_success(const char * test,bool success,int lineNumber)66 _assert_posix_bool_success(const char* test, bool success, int lineNumber)
67 {
68 	if (success)
69 		return;
70 
71 	fprintf(stderr, "%s FAILED in line %d: %s\n", test, lineNumber,
72 		strerror(errno));
73 	exit(1);
74 }
75 
76 
77 static void
_assert_posix_bool_error(const char * test,int expectedError,bool success,int lineNumber)78 _assert_posix_bool_error(const char* test, int expectedError, bool success,
79 	int lineNumber)
80 {
81 	if (success) {
82 		fprintf(stderr, "%s FAILED in line %d: call succeeded unexpectedly\n",
83 			test, lineNumber);
84 		exit(1);
85 	}
86 
87 	if (errno != expectedError) {
88 		fprintf(stderr, "%s FAILED in line %d: call set unexpected error "
89 			"code \"%s\" (0x%x), expected: \"%s\" (0x%x)\n", test, lineNumber,
90 			strerror(errno), errno, strerror(expectedError), expectedError);
91 		exit(1);
92 	}
93 }
94 
95 
96 static void
test_set(const char * testSet)97 test_set(const char* testSet)
98 {
99 	printf("\nTEST SET: %s\n", testSet);
100 }
101 
102 
103 static void
test_ok(const char * test)104 test_ok(const char* test)
105 {
106 	if (test != NULL)
107 		printf("%s OK\n", test);
108 }
109 
110 
111 static void
_wait_for_child(const char * test,pid_t child,int lineNumber)112 _wait_for_child(const char* test, pid_t child, int lineNumber)
113 {
114 	int status;
115 	pid_t result = wait(&status);
116 	_assert_posix_bool_success(test, result >= 0, lineNumber);
117 	_assert_equals(test, child, result, lineNumber);
118 	_assert_equals(test, 0, status, lineNumber);
119 }
120 
121 
122 #define TEST_SET(testSet)	test_set(testSet)
123 #define TEST(test)	test_ok(currentTest); currentTest = (test)
124 
125 #define assert_equals(expected, actual) \
126 	_assert_equals(currentTest, (expected), (actual), __LINE__)
127 
128 #define assert_equals_not(expected, actual) \
129 	_assert_equals_not(currentTest, (expected), (actual), __LINE__)
130 
131 #define assert_time_equals(expected, actual) \
132 	_assert_time_equals(currentTest, (expected), (actual), __LINE__)
133 
134 #define assert_posix_bool_success(success) \
135 	_assert_posix_bool_success(currentTest, (success), __LINE__)
136 
137 #define assert_posix_success(result) \
138 	_assert_posix_bool_success(currentTest, (result) == 0, __LINE__)
139 
140 #define assert_posix_bool_error(expectedError, success) \
141 	_assert_posix_bool_error(currentTest, (expectedError), (success), __LINE__)
142 
143 #define assert_posix_error(expectedError, result) \
144 	_assert_posix_bool_error(currentTest, (expectedError), (result) == 0, \
145 		__LINE__)
146 
147 #define wait_for_child(child) \
148 	_wait_for_child(currentTest, (child), __LINE__)
149 
150 #endif // _UNIT_TEST_UTILS_H
151