app/test: new assert macros and test suite runner
authorDeclan Doherty <declan.doherty@intel.com>
Mon, 21 Jul 2014 14:52:16 +0000 (15:52 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 1 Aug 2014 15:13:46 +0000 (17:13 +0200)
- Adding common test assertion macros for unit testing
- Structs for encapsulating unit tests / test suites data.
- test suite runner method

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
app/test/test.c
app/test/test.h

index a41e43d..589a168 100644 (file)
@@ -153,3 +153,56 @@ main(int argc, char **argv)
 
        return 0;
 }
+
+
+int
+unit_test_suite_runner(struct unit_test_suite *suite)
+{
+       int retval, i = 0;
+
+       if (suite->suite_name)
+               printf("Test Suite : %s\n", suite->suite_name);
+
+       if (suite->setup)
+               if (suite->setup() != 0)
+                       return -1;
+
+       while (suite->unit_test_cases[i].testcase) {
+               /* Run test case setup */
+               if (suite->unit_test_cases[i].setup) {
+                       retval = suite->unit_test_cases[i].setup();
+                       if (retval != 0)
+                               return retval;
+               }
+
+               /* Run test case */
+               if (suite->unit_test_cases[i].testcase() == 0) {
+                       printf("TestCase %2d: %s\n", i,
+                                       suite->unit_test_cases[i].success_msg ?
+                                       suite->unit_test_cases[i].success_msg :
+                                       "passed");
+               }
+               else {
+                       printf("TestCase %2d: %s\n", i, suite->unit_test_cases[i].fail_msg ?
+                                       suite->unit_test_cases[i].fail_msg :
+                                       "failed");
+                       return -1;
+               }
+
+               /* Run test case teardown */
+               if (suite->unit_test_cases[i].teardown) {
+                       retval = suite->unit_test_cases[i].teardown();
+                       if (retval != 0)
+                               return retval;
+               }
+
+               i++;
+       }
+
+       /* Run test suite teardown */
+       if (suite->teardown)
+               if (suite->teardown() != 0)
+                       return -1;
+
+       return 0;
+}
index c00e1d6..181c38e 100644 (file)
 #ifndef _TEST_H_
 #define _TEST_H_
 
+#define TEST_ASSERT(cond, msg, ...) do {                                               \
+               if (!(cond)) {                                                                                  \
+                       printf("TestCase %s() line %d failed: "                 \
+                               msg "\n", __func__, __LINE__, ##__VA_ARGS__);   \
+                       return -1;                                                                                      \
+               }                                                                                                               \
+} 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;                                                                                      \
+               }                                                                                                               \
+} 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;                                                                                      \
+               }                                                                                                               \
+} while (0)
+
+#define TEST_ASSERT_SUCCESS(val, msg, ...) do {                                        \
+               if (!(val == 0)) {                                                                              \
+                       printf("TestCase %s() line %d failed: "                 \
+                               msg "\n", __func__, __LINE__, ##__VA_ARGS__);   \
+                       return -1;                                                                                      \
+               }                                                                                                               \
+} while (0)
+
+#define TEST_ASSERT_FAIL(val, msg, ...) do {                                   \
+               if (!(val != -1)) {                                                                             \
+                       printf("TestCase %s() line %d failed: "                 \
+                               msg "\n", __func__, __LINE__, ##__VA_ARGS__);   \
+                       return -1;                                                                                      \
+               }                                                                                                               \
+} 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;                                                                                      \
+               }                                                                                                               \
+} 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;                                                                                      \
+               }                                                                                                               \
+} while (0)
+
+struct unit_test_case {
+       int (*setup)(void);
+       int (*teardown)(void);
+       int (*testcase)(void);
+       const char *success_msg;
+       const char *fail_msg;
+};
+
+#define TEST_CASE(fn) { NULL, NULL, fn, #fn " succeeded", #fn " failed"}
+
+#define TEST_CASE_ST(setup, teardown, testcase)                \
+               { setup, teardown, testcase, #testcase " succeeded",    \
+               #testcase " failed "}
+
+#define TEST_CASES_END() { NULL, NULL, NULL, NULL, NULL }
+
+struct unit_test_suite {
+       const char *suite_name;
+       int (*setup)(void);
+       int (*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