Annotation of embedaddon/strongswan/src/libstrongswan/tests/test_suite.h, revision 1.1
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: */
! 54: typedef void (*test_fixture_cb_t)(void);
! 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(); }
! 391: #define START_SETUP(name) static void name() {
! 392: #define END_SETUP test_fail_if_worker_failed(); }
! 393: #define START_TEARDOWN(name) static void name() {
! 394: #define END_TEARDOWN test_fail_if_worker_failed(); }
! 395:
! 396: #endif /** TEST_SUITE_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>