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>