1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2017 Intel Corporation 3d30ea906Sjfb8856606 */ 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606 #ifndef _MAIN_H_ 6d30ea906Sjfb8856606 #define _MAIN_H_ 7d30ea906Sjfb8856606 8d30ea906Sjfb8856606 #include <stddef.h> 9d30ea906Sjfb8856606 #include <sys/queue.h> 10d30ea906Sjfb8856606 11d30ea906Sjfb8856606 #include <rte_common.h> 12d30ea906Sjfb8856606 #include <rte_hexdump.h> 13d30ea906Sjfb8856606 #include <rte_log.h> 14d30ea906Sjfb8856606 15d30ea906Sjfb8856606 #define TEST_SUCCESS 0 16d30ea906Sjfb8856606 #define TEST_FAILED -1 17d30ea906Sjfb8856606 #define TEST_SKIPPED 1 18d30ea906Sjfb8856606 19d30ea906Sjfb8856606 #define MAX_BURST 512U 20*2d9fd380Sjfb8856606 #define MAX_OPS 1024U 21d30ea906Sjfb8856606 #define DEFAULT_BURST 32U 22d30ea906Sjfb8856606 #define DEFAULT_OPS 64U 23*2d9fd380Sjfb8856606 #define DEFAULT_ITER 6U 24*2d9fd380Sjfb8856606 25d30ea906Sjfb8856606 264418919fSjohnjiang 27d30ea906Sjfb8856606 #define TEST_ASSERT(cond, msg, ...) do { \ 28d30ea906Sjfb8856606 if (!(cond)) { \ 29d30ea906Sjfb8856606 printf("TestCase %s() line %d failed: " \ 30d30ea906Sjfb8856606 msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ 31d30ea906Sjfb8856606 return TEST_FAILED; \ 32d30ea906Sjfb8856606 } \ 33d30ea906Sjfb8856606 } while (0) 34d30ea906Sjfb8856606 35d30ea906Sjfb8856606 /* Compare two buffers (length in bytes) */ 36d30ea906Sjfb8856606 #define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ 37d30ea906Sjfb8856606 if (memcmp((a), (b), len)) { \ 38d30ea906Sjfb8856606 printf("TestCase %s() line %d failed: " \ 39d30ea906Sjfb8856606 msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ 40d30ea906Sjfb8856606 rte_memdump(stdout, "Buffer A", (a), len); \ 41d30ea906Sjfb8856606 rte_memdump(stdout, "Buffer B", (b), len); \ 42d30ea906Sjfb8856606 return TEST_FAILED; \ 43d30ea906Sjfb8856606 } \ 44d30ea906Sjfb8856606 } while (0) 45d30ea906Sjfb8856606 46d30ea906Sjfb8856606 #define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ 47d30ea906Sjfb8856606 typeof(val) _val = (val); \ 48d30ea906Sjfb8856606 if (!(_val == 0)) { \ 49d30ea906Sjfb8856606 printf("TestCase %s() line %d failed (err %d): " \ 50d30ea906Sjfb8856606 msg "\n", __func__, __LINE__, _val, \ 51d30ea906Sjfb8856606 ##__VA_ARGS__); \ 52d30ea906Sjfb8856606 return TEST_FAILED; \ 53d30ea906Sjfb8856606 } \ 54d30ea906Sjfb8856606 } while (0) 55d30ea906Sjfb8856606 56d30ea906Sjfb8856606 #define TEST_ASSERT_FAIL(val, msg, ...) \ 57d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(!(val), msg, ##__VA_ARGS__) 58d30ea906Sjfb8856606 59d30ea906Sjfb8856606 #define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ 60d30ea906Sjfb8856606 if ((val) == NULL) { \ 61d30ea906Sjfb8856606 printf("TestCase %s() line %d failed (null): " \ 62d30ea906Sjfb8856606 msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ 63d30ea906Sjfb8856606 return TEST_FAILED; \ 64d30ea906Sjfb8856606 } \ 65d30ea906Sjfb8856606 } while (0) 66d30ea906Sjfb8856606 67d30ea906Sjfb8856606 struct unit_test_case { 68d30ea906Sjfb8856606 int (*setup)(void); 69d30ea906Sjfb8856606 void (*teardown)(void); 70d30ea906Sjfb8856606 int (*testcase)(void); 71d30ea906Sjfb8856606 const char *name; 72d30ea906Sjfb8856606 }; 73d30ea906Sjfb8856606 74d30ea906Sjfb8856606 #define TEST_CASE(testcase) {NULL, NULL, testcase, #testcase} 75d30ea906Sjfb8856606 76d30ea906Sjfb8856606 #define TEST_CASE_ST(setup, teardown, testcase) \ 77d30ea906Sjfb8856606 {setup, teardown, testcase, #testcase} 78d30ea906Sjfb8856606 79d30ea906Sjfb8856606 #define TEST_CASES_END() {NULL, NULL, NULL, NULL} 80d30ea906Sjfb8856606 81d30ea906Sjfb8856606 struct unit_test_suite { 82d30ea906Sjfb8856606 const char *suite_name; 83d30ea906Sjfb8856606 int (*setup)(void); 84d30ea906Sjfb8856606 void (*teardown)(void); 85d30ea906Sjfb8856606 struct unit_test_case unit_test_cases[]; 86d30ea906Sjfb8856606 }; 87d30ea906Sjfb8856606 88d30ea906Sjfb8856606 int unit_test_suite_runner(struct unit_test_suite *suite); 89d30ea906Sjfb8856606 90d30ea906Sjfb8856606 typedef int (test_callback)(void); 91d30ea906Sjfb8856606 TAILQ_HEAD(test_commands_list, test_command); 92d30ea906Sjfb8856606 struct test_command { 93d30ea906Sjfb8856606 TAILQ_ENTRY(test_command) next; 94d30ea906Sjfb8856606 const char *command; 95d30ea906Sjfb8856606 test_callback *callback; 96d30ea906Sjfb8856606 }; 97d30ea906Sjfb8856606 98d30ea906Sjfb8856606 void add_test_command(struct test_command *t); 99d30ea906Sjfb8856606 100d30ea906Sjfb8856606 /* Register a test function */ 101d30ea906Sjfb8856606 #define REGISTER_TEST_COMMAND(name, testsuite) \ 102d30ea906Sjfb8856606 static int test_func_##name(void) \ 103d30ea906Sjfb8856606 { \ 104d30ea906Sjfb8856606 return unit_test_suite_runner(&testsuite); \ 105d30ea906Sjfb8856606 } \ 106d30ea906Sjfb8856606 static struct test_command test_struct_##name = { \ 107d30ea906Sjfb8856606 .command = RTE_STR(name), \ 108d30ea906Sjfb8856606 .callback = test_func_##name, \ 109d30ea906Sjfb8856606 }; \ 110*2d9fd380Sjfb8856606 RTE_INIT(test_register_##name) \ 111d30ea906Sjfb8856606 { \ 112d30ea906Sjfb8856606 add_test_command(&test_struct_##name); \ 113d30ea906Sjfb8856606 } 114d30ea906Sjfb8856606 115d30ea906Sjfb8856606 const char *get_vector_filename(void); 116d30ea906Sjfb8856606 117d30ea906Sjfb8856606 unsigned int get_num_ops(void); 118d30ea906Sjfb8856606 119d30ea906Sjfb8856606 unsigned int get_burst_sz(void); 120d30ea906Sjfb8856606 121d30ea906Sjfb8856606 unsigned int get_num_lcores(void); 122d30ea906Sjfb8856606 123*2d9fd380Sjfb8856606 double get_snr(void); 124*2d9fd380Sjfb8856606 125*2d9fd380Sjfb8856606 unsigned int get_iter_max(void); 126*2d9fd380Sjfb8856606 1274418919fSjohnjiang bool get_init_device(void); 1284418919fSjohnjiang 129d30ea906Sjfb8856606 #endif 130