- 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 at intel.com>
---
 app/test/test.c |   53 +++++++++++++++++++++++++++++++++++
 app/test/test.h |   82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+), 0 deletions(-)

diff --git a/app/test/test.c b/app/test/test.c
index a41e43d..589a168 100644
--- a/app/test/test.c
+++ b/app/test/test.c
@@ -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;
+}
diff --git a/app/test/test.h b/app/test/test.h
index c00e1d6..181c38e 100644
--- a/app/test/test.h
+++ b/app/test/test.h
@@ -34,6 +34,88 @@
 #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
-- 
1.7.0.7

Reply via email to