X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest%2Ftest.h;h=a2fba607e514d86c35d1f4c2eff85ec516a51f8a;hb=4e72892c3367b9fcff70868c29d1e9236ee57d04;hp=d5b6951a4c15b6650130cf50191c567831655ec2;hpb=a45b288ef21a5ab1da6bbe95a33404006c7cb051;p=dpdk.git diff --git a/app/test/test.h b/app/test/test.h index d5b6951a4c..a2fba607e5 100644 --- a/app/test/test.h +++ b/app/test/test.h @@ -33,97 +33,132 @@ #ifndef _TEST_H_ #define _TEST_H_ - +#include #include -#define TEST_ASSERT(cond, msg, ...) do { \ - if (!(cond)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ +#define TEST_SUCCESS (0) +#define TEST_FAILED (-1) + +/* Before including test.h file you can define + * TEST_TRACE_FAILURE(_file, _line, _func) macro to better trace/debug test + * failures. Mostly useful in test development phase. */ +#ifndef TEST_TRACE_FAILURE +# define TEST_TRACE_FAILURE(_file, _line, _func) +#endif + +#define TEST_ASSERT(cond, msg, ...) do { \ + if (!(cond)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) -#define TEST_ASSERT_EQUAL(a, b, msg, ...) { \ - if (!(a == b)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ +#define TEST_ASSERT_EQUAL(a, b, msg, ...) do { \ + if (!(a == b)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) -#define TEST_ASSERT_NOT_EQUAL(a, b, msg, ...) do { \ - if (!(a != b)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ + +#define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ + if (memcmp(a, b, len)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) -#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ - if (!(val == 0)) { \ - printf("TestCase %s() line %d failed (err %d): " \ - msg "\n", __func__, __LINE__, val, \ - ##__VA_ARGS__); \ - return -1; \ - } \ + +#define TEST_ASSERT_NOT_EQUAL(a, b, msg, ...) do { \ + if (!(a != b)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) -#define TEST_ASSERT_FAIL(val, msg, ...) do { \ - if (!(val != 0)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ +#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ + typeof(val) _val = (val); \ + if (!(_val == 0)) { \ + printf("TestCase %s() line %d failed (err %d): " \ + msg "\n", __func__, __LINE__, _val, \ + ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) +#define TEST_ASSERT_FAIL(val, msg, ...) do { \ + if (!(val != 0)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ +} while (0) -#define TEST_ASSERT_NULL(val, msg, ...) do { \ - if (!(val == NULL)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ +#define TEST_ASSERT_NULL(val, msg, ...) do { \ + if (!(val == NULL)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) -#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ - if (!(val != NULL)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return -1; \ - } \ +#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ + if (!(val != NULL)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ + return TEST_FAILED; \ + } \ } while (0) struct unit_test_case { int (*setup)(void); - int (*teardown)(void); + void (*teardown)(void); int (*testcase)(void); const char *success_msg; const char *fail_msg; + unsigned enabled; }; -#define TEST_CASE(fn) { NULL, NULL, fn, #fn " succeeded", #fn " failed"} +#define TEST_CASE(fn) { NULL, NULL, fn, #fn " succeeded", #fn " failed", 1 } -#define TEST_CASE_ST(setup, teardown, testcase) \ - { setup, teardown, testcase, #testcase " succeeded", \ - #testcase " failed "} +#define TEST_CASE_NAMED(name, fn) { NULL, NULL, fn, name " succeeded", \ + name " failed", 1 } -#define TEST_CASES_END() { NULL, NULL, NULL, NULL, NULL } +#define TEST_CASE_ST(setup, teardown, testcase) \ + { setup, teardown, testcase, #testcase " succeeded", \ + #testcase " failed ", 1 } + + +#define TEST_CASE_DISABLED(fn) { NULL, NULL, fn, #fn " succeeded", \ + #fn " failed", 0 } + +#define TEST_CASE_ST_DISABLED(setup, teardown, testcase) \ + { setup, teardown, testcase, #testcase " succeeded", \ + #testcase " failed ", 0 } + +#define TEST_CASES_END() { NULL, NULL, NULL, NULL, NULL, 0 } struct unit_test_suite { const char *suite_name; int (*setup)(void); - int (*teardown)(void); + void (*teardown)(void); struct unit_test_case unit_test_cases[]; }; int unit_test_suite_runner(struct unit_test_suite *suite); -/* icc on baremetal gives us troubles with function named 'main' */ -#ifdef RTE_EXEC_ENV_BAREMETAL -#define main _main -#endif - #define RECURSIVE_ENV_VAR "RTE_TEST_RECURSIVE" #include @@ -133,8 +168,6 @@ extern const char *prgname; int commands_init(void); -int main(int argc, char **argv); - int test_pci(void); int test_pci_run; @@ -156,7 +189,7 @@ struct test_command { void add_test_command(struct test_command *t); #define REGISTER_TEST_COMMAND(t) \ -static void testfn_##t(void);\ +static void __attribute__((used)) testfn_##t(void);\ void __attribute__((constructor, used)) testfn_##t(void)\ {\ add_test_command(&t);\