Annotation of embedaddon/strongswan/src/libstrongswan/tests/test_suite.h, revision 1.1.1.2
1.1 misho 1: /*
2: * Copyright (C) 2013 Tobias Brunner
3: * HSR Hochschule fuer Technik Rapperswil
4: * Copyright (C) 2013 Martin Willi
5: * Copyright (C) 2013 revosec AG
6: *
7: * This program is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2 of the License, or (at your
10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11: *
12: * This program is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15: * for more details.
16: */
17:
18: /**
19: * @defgroup test_suite test_suite
20: * @{ @ingroup libtest
21: */
22:
23: #ifndef TEST_SUITE_H_
24: #define TEST_SUITE_H_
25:
26: #define _GNU_SOURCE
27: #include <setjmp.h>
28:
29: #include <library.h>
30: #include <utils/debug.h>
31: #include <utils/backtrace.h>
32: #include <collections/array.h>
33:
34: typedef struct test_suite_t test_suite_t;
35: typedef struct test_case_t test_case_t;
36: typedef struct test_function_t test_function_t;
37: typedef struct test_fixture_t test_fixture_t;
38:
39: /**
40: * Default timeout for a single test function
41: */
42: #ifndef TEST_FUNCTION_DEFAULT_TIMEOUT
43: #define TEST_FUNCTION_DEFAULT_TIMEOUT 2
44: #endif
45:
46: /**
47: * Test function implementation
48: */
49: typedef void (*test_function_cb_t)(int);
50:
51: /**
52: * Fixture for a test case.
53: */
1.1.1.2 ! misho 54: typedef void (*test_fixture_cb_t)(int);
1.1 misho 55:
56: /**
57: * A test suite; a collection of test cases with fixtures
58: */
59: struct test_suite_t {
60: /** name of the test suite */
61: const char *name;
62: /** test cases registered, as test_case_t* */
63: array_t *tcases;
64: };
65:
66: /**
67: * A test case; multiple test functions using the same fixtures
68: */
69: struct test_case_t {
70: /** name of the test case */
71: const char *name;
72: /** tests registered, as test_function_t */
73: array_t *functions;
74: /** fixture for tests, as test_fixture_t */
75: array_t *fixtures;
76: /** timeout for each function, in s */
77: int timeout;
78: };
79:
80: /**
81: * A test function, with optional loop setup
82: */
83: struct test_function_t {
84: /** name of test function */
85: char *name;
86: /** tests function registered, test_function_t* */
87: test_function_cb_t cb;
88: /** start for loop test */
89: int start;
90: /** end for loop test */
91: int end;
92: };
93:
94: /**
95: * Registered fixture for a test case
96: */
97: struct test_fixture_t {
98: test_fixture_cb_t setup;
99: test_fixture_cb_t teardown;
100: };
101:
102: /**
103: * Create a new test suite
104: *
105: * @param name name of the test suite
106: * @return test suite
107: */
108: test_suite_t* test_suite_create(const char *name);
109:
110: /**
111: * Create a new test case
112: *
113: * @param name name of test case
114: * @return test case
115: */
116: test_case_t* test_case_create(const char *name);
117:
118: /**
119: * Add a setup/teardown function to the test case
120: *
121: * @param tcase test case to add a fixture to
122: * @param setup setup function called before each test
123: * @param teardown cleanup function called after each test
124: */
125: void test_case_add_checked_fixture(test_case_t *tcase, test_fixture_cb_t setup,
126: test_fixture_cb_t teardown);
127:
128: /**
129: * Add a test function to a test case, with a name, looped several times
130: *
131: * @param name name of the test case
132: * @param tcase test case to add test function to
133: * @param cb callback function to invoke for test
134: * @param start start of loop counter
135: * @param end end of loop counter
136: */
137: void test_case_add_test_name(test_case_t *tcase, char *name,
138: test_function_cb_t cb, int start, int end);
139:
140: /**
141: * Add a test function to a test case
142: *
143: * @param tcase test case to add test function to
144: * @param cb callback function to invoke for test
145: */
146: #define test_case_add_test(tcase, cb) \
147: test_case_add_test_name(tcase, #cb, cb, 0, 1)
148:
149: /**
150: * Add a test function to a test case, looped several times
151: *
152: * @param tcase test case to add test function to
153: * @param cb callback function to invoke for test
154: * @param start start of loop counter
155: * @param end end of loop counter
156: */
157: #define test_case_add_loop_test(tcase, cb, start, end) \
158: test_case_add_test_name(tcase, #cb, cb, start, end)
159:
160: /**
161: * Set a custom timeout for test functions in a test case
162: *
163: * @param tcase test case to set timeout for
164: * @param s test timeout in s
165: */
166: void test_case_set_timeout(test_case_t *tcase, int s);
167:
168: /**
169: * Add a test function to a test case, looped several times
170: *
171: * @param suite test suite to add test case to
172: * @param tcase test case to add
173: */
174: void test_suite_add_case(test_suite_t *suite, test_case_t *tcase);
175:
176: /**
177: * sigjmp restore point used by test_restore_point
178: */
179: #ifdef WIN32
180: extern jmp_buf test_restore_point_env;
181: #else
182: extern sigjmp_buf test_restore_point_env;
183: #endif
184:
185: /**
186: * Set or return from an execution restore point
187: *
188: * This call sets a restore execution point and returns TRUE after it has
189: * been set up. On test failure, the execution is returned to the restore point
190: * and FALSE is returned to indicate test failure.
191: *
192: * @return TRUE if restore point set, FALSE when restored
193: */
194: #ifdef WIN32
195: # define test_restore_point() (setjmp(test_restore_point_env) == 0)
196: #else
197: # define test_restore_point() (sigsetjmp(test_restore_point_env, 1) == 0)
198: #endif
199:
200: /**
201: * Set up signal handlers for test cases
202: */
203: void test_setup_handler();
204:
205: /**
206: * Set up a timeout to let a test fail
207: *
208: * @param s timeout, 0 to disable timeout
209: */
210: void test_setup_timeout(int s);
211:
212: /**
213: * Get info about a test failure
214: *
215: * @param msg buffer receiving failure info
216: * @param len size of msg buffer
217: * @param file pointer receiving source code file
218: * @return source code line number
219: */
220: int test_failure_get(char *msg, int len, const char **file);
221:
222: /**
223: * Get info about a warning if one was issued during the test. Resets the
224: * warning state.
225: *
226: * @param msg buffer receiving warning
227: * @param len size of msg buffer
228: * @param file pointer receiving source code file
229: * @return source code line number, 0 if no warning issued
230: */
231: int test_warning_get(char *msg, int len, const char **file);
232:
233: /**
234: * Get a backtrace for a failure.
235: *
236: * @return allocated backtrace of test failure, if any
237: */
238: backtrace_t *test_failure_backtrace();
239:
240: /**
241: * Let a test fail and set a message using vprintf style arguments.
242: *
243: * @param file source code file name
244: * @param line source code line number
245: * @param fmt printf format string
246: * @param args argument list for fmt
247: */
248: void test_fail_vmsg(const char *file, int line, char *fmt, va_list args);
249:
250: /**
251: * Let a test fail and set a message using printf style arguments.
252: *
253: * @param file source code file name
254: * @param line source code line number
255: * @param fmt printf format string
256: * @param ... arguments for fmt
257: */
258: void test_fail_msg(const char *file, int line, char *fmt, ...);
259:
260: /**
261: * Issue a warning for a particular test with a message using printf style
262: * arguments. This does not fail the test, and only the last warning for each
263: * test is kept.
264: *
265: * @param file source code file name
266: * @param line source code line number
267: * @param fmt printf format string
268: * @param ... arguments for fmt
269: */
270: void test_warn_msg(const char *file, int line, char *fmt, ...);
271:
272: /**
273: * Let a test fail if one of the worker threads has failed (only if called from
274: * the main thread).
275: */
276: void test_fail_if_worker_failed();
277:
278: /**
279: * Check if two integers equal, fail test if not
280: *
281: * @param a first integer
282: * @param b second integer
283: */
284: #define test_int_eq(a, b) \
285: ({ \
286: typeof(a) _a = a; \
287: typeof(b) _b = b; \
288: test_fail_if_worker_failed(); \
289: if (_a != _b) \
290: { \
291: test_fail_msg(__FILE__, __LINE__, #a " != " #b " (%d != %d)", _a, _b); \
292: } \
293: })
294:
295: /**
296: * Check if two strings equal, fail test if not
297: *
298: * @param a first string
299: * @param b second string
300: */
301: #define test_str_eq(a, b) \
302: ({ \
303: char* _a = (char*)a; \
304: char* _b = (char*)b; \
305: test_fail_if_worker_failed(); \
306: if (!_a || !_b || !streq(_a, _b)) \
307: { \
308: test_fail_msg(__FILE__, __LINE__, \
309: #a " != " #b " (\"%s\" != \"%s\")", _a, _b); \
310: } \
311: })
312:
313: /**
314: * Check if two chunks are equal, fail test if not
315: *
316: * @param a first chunk
317: * @param b second chunk
318: */
319: #define test_chunk_eq(a, b) \
320: ({ \
321: chunk_t _a = (chunk_t)a; \
322: chunk_t _b = (chunk_t)b; \
323: test_fail_if_worker_failed(); \
324: if (_a.len != _b.len || !memeq(_a.ptr, _b.ptr, _a.len)) \
325: { \
326: test_fail_msg(__FILE__, __LINE__, \
327: #a " != " #b " (\"%#B\" != \"%#B\")", &_a, &_b); \
328: } \
329: })
330:
331: /**
332: * Check if a statement evaluates to TRUE, fail test if not
333: *
334: * @param x statement to evaluate
335: */
336: #define test_assert(x) \
337: ({ \
338: test_fail_if_worker_failed(); \
339: if (!(x)) \
340: { \
341: test_fail_msg(__FILE__, __LINE__, "%s", #x); \
342: } \
343: })
344:
345: /**
346: * Check if a statement evaluates to TRUE, fail and print a message if not
347: *
348: * @param x statement to evaluate
349: * @param fmt message format string
350: * @param ... fmt printf arguments
351: */
352: #define test_assert_msg(x, fmt, ...) \
353: ({ \
354: test_fail_if_worker_failed(); \
355: if (!(x)) \
356: { \
357: test_fail_msg(__FILE__, __LINE__, "%s: " fmt, #x, ##__VA_ARGS__); \
358: } \
359: })
360:
361:
362:
363: /* "check unit testing" compatibility */
364: #define Suite test_suite_t
365: #define TCase test_case_t
366: #define ck_assert_int_eq test_int_eq
367: #define ck_assert test_assert
368: #define ck_assert_msg test_assert_msg
369: #define ck_assert_str_eq test_str_eq
370: #define ck_assert_chunk_eq test_chunk_eq
371: #define warn(fmt, ...) test_warn_msg(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
372: #define fail(fmt, ...) test_fail_msg(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
373: #define fail_if(x, fmt, ...) \
374: ({ \
375: test_fail_if_worker_failed(); \
376: if (x) \
377: { \
378: test_fail_msg(__FILE__, __LINE__, "%s : " fmt, #x, ##__VA_ARGS__); \
379: } \
380: })
381: #define fail_unless test_assert_msg
382: #define suite_create test_suite_create
383: #define tcase_create test_case_create
384: #define tcase_add_checked_fixture test_case_add_checked_fixture
385: #define tcase_add_test test_case_add_test
386: #define tcase_add_loop_test test_case_add_loop_test
387: #define tcase_set_timeout test_case_set_timeout
388: #define suite_add_tcase test_suite_add_case
389: #define START_TEST(name) static void name (int _i) {
390: #define END_TEST test_fail_if_worker_failed(); }
1.1.1.2 ! misho 391: #define START_SETUP(name) static void name(int _i) {
1.1 misho 392: #define END_SETUP test_fail_if_worker_failed(); }
1.1.1.2 ! misho 393: #define START_TEARDOWN(name) static void name(int _i) {
1.1 misho 394: #define END_TEARDOWN test_fail_if_worker_failed(); }
395:
396: #endif /** TEST_SUITE_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>