All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
modules/mod-lua/src/test/test.h
Go to the documentation of this file.
1 #pragma once
2 #include <stdlib.h>
3 #include <stdbool.h>
4 #include <stdint.h>
5 #include <stdio.h>
6 #include <stdarg.h>
7 
8 
9 /******************************************************************************
10  * MACROS
11  *****************************************************************************/
12 
13 #define ATF_PLAN_SUITE_MAX 128
14 #define ATF_SUITE_TEST_MAX 128
15 
16 /******************************************************************************
17  * atf_test
18  *****************************************************************************/
19 
20 typedef struct atf_test_s atf_test;
21 typedef struct atf_test_result_s atf_test_result;
22 
23 struct atf_test_s {
24  const char * name;
25  const char * desc;
26  void (* run)(atf_test *, atf_test_result *);
27 };
28 
29 struct atf_test_result_s {
30  atf_test * test;
31  bool success;
32  char message[128];
33 };
34 
35 atf_test_result * atf_test_run(atf_test * test);
36 
37 atf_test_result * atf_test_result_new(atf_test * test);
38 void atf_test_result_free(atf_test_result * test_result);
39 
40 
41 #define TEST(__test_name, __test_desc) \
42  static void test_spec__##__test_name(atf_test *, atf_test_result *); \
43  static atf_test test__##__test_name = { \
44  .name = #__test_name, \
45  .desc = __test_desc, \
46  .run = test_spec__##__test_name \
47  }; \
48  atf_test * __test_name = & test__##__test_name; \
49  static void test_spec__##__test_name(atf_test * self, atf_test_result * __result__)
50 
51 /******************************************************************************
52  * atf_suite
53  *****************************************************************************/
54 
55 typedef struct atf_suite_s atf_suite;
56 typedef struct atf_suite_result_s atf_suite_result;
57 
58 struct atf_suite_s {
59  const char * name;
60  const char * desc;
61  atf_test * tests[ATF_SUITE_TEST_MAX];
62  uint32_t size;
63  void (* init)(atf_suite *);
64  bool (* before)(atf_suite *);
65  bool (* after)(atf_suite *);
66 };
67 
68 struct atf_suite_result_s {
69  atf_suite * suite;
70  atf_test_result * tests[ATF_SUITE_TEST_MAX];
71  uint32_t size;
72  uint32_t success;
73 };
74 
75 atf_suite * atf_suite_add(atf_suite * suite, atf_test * test);
76 uint32_t atf_suite_size(atf_suite * suite);
77 atf_suite_result * atf_suite_run(atf_suite * suite);
78 
79 atf_suite * atf_suite_after(atf_suite * suite, bool (* after)(atf_suite * suite));
80 atf_suite * atf_suite_before(atf_suite * suite, bool (* before)(atf_suite * suite));
81 
82 atf_suite_result * atf_suite_result_new(atf_suite * suite);
83 void atf_suite_result_free(atf_suite_result * suite_result);
84 atf_suite_result * atf_suite_result_add(atf_suite_result * suite_result, atf_test_result * test_result);
85 void atf_suite_result_print(atf_suite_result * suite_result);
86 
87 #define SUITE(__suite_name, __suite_desc) \
88  static void suite_spec__##__suite_name(atf_suite *); \
89  static atf_suite suite__##__suite_name = { \
90  .name = #__suite_name, \
91  .desc = __suite_desc, \
92  .tests = {NULL}, \
93  .size = 0, \
94  .init = suite_spec__##__suite_name, \
95  .before = NULL, \
96  .after = NULL \
97  }; \
98  atf_suite * __suite_name = & suite__##__suite_name; \
99  static void suite_spec__##__suite_name(atf_suite * self)
100 
101 #define suite_add(__test) \
102  atf_suite_add(self, __test)
103 
104 #define suite_before(__func) \
105  atf_suite_before(self, __func)
106 
107 #define suite_after(__func) \
108  atf_suite_after(self, __func)
109 
110 
111 /******************************************************************************
112  * atf_plan
113  *****************************************************************************/
114 
115 typedef struct atf_plan_s atf_plan;
116 typedef struct atf_plan_result_s atf_plan_result;
117 
118 struct atf_plan_s {
119  const char * name;
120  atf_suite * suites[ATF_PLAN_SUITE_MAX];
121  uint32_t size;
122  bool (* before)(atf_plan *);
123  bool (* after)(atf_plan *);
124 };
125 
126 struct atf_plan_result_s {
127  atf_plan * plan;
128  atf_suite_result * suites[ATF_PLAN_SUITE_MAX];
129  uint32_t size;
130 };
131 
132 atf_plan * atf_plan_add(atf_plan * self, atf_suite * suite);
133 int atf_plan_run(atf_plan * self, atf_plan_result * result);
134 
135 atf_plan * atf_plan_after(atf_plan * plan, bool (* after)(atf_plan * plan));
136 atf_plan * atf_plan_before(atf_plan * plan, bool (* before)(atf_plan * plan));
137 
138 atf_plan_result * atf_plan_result_add(atf_plan_result * plan_result, atf_suite_result * suite_result);
139 
140 #define PLAN(__plan_name)\
141  static void plan_spec__##__plan_name(atf_plan * self); \
142  static atf_plan plan__##__plan_name = { \
143  .name = #__plan_name, \
144  .suites = {NULL}, \
145  .size = 0, \
146  .before = NULL, \
147  .after = NULL \
148  }; \
149  atf_plan * __plan_name = & plan__##__plan_name; \
150  int main(int argc, char ** args) { \
151  atf_plan atfp = {#__plan_name}; \
152  atf_plan_result result = { \
153  .plan = &atfp, \
154  .suites = { NULL }, \
155  .size = 0 \
156  }; \
157  plan_spec__##__plan_name(__plan_name); \
158  return atf_plan_run(__plan_name, &result); \
159  }\
160  static void plan_spec__##__plan_name(atf_plan * self) \
161 
162 
163 #define plan_add(__suite) \
164  extern atf_suite * __suite; \
165  atf_plan_add(self, __suite)
166 
167 #define plan_before(__func) \
168  atf_plan_before(self, __func)
169 
170 #define plan_after(__func) \
171  atf_plan_after(self, __func)
172 
173 /******************************************************************************
174  * atf_assert
175  *****************************************************************************/
176 
177 void atf_assert(atf_test_result * test_result, const char * exp, const char * file, int line);
178 
179 void atf_assert_true(atf_test_result * test_result, const char * exp, const char * file, int line);
180 void atf_assert_false(atf_test_result * test_result, const char * exp, const char * file, int line);
181 
182 void atf_assert_null(atf_test_result * test_result, const char * exp, const char * file, int line);
183 void atf_assert_not_null(atf_test_result * test_result, const char * exp, const char * file, int line);
184 
185 void atf_assert_int_eq(atf_test_result * result, const char * actual_exp, int64_t actual, int64_t expected, const char * file, int line);
186 void atf_assert_int_ne(atf_test_result * result, const char * actual_exp, int64_t actual, int64_t expected, const char * file, int line);
187 
188 void atf_assert_string_eq(atf_test_result * result, const char * actual_exp, const char * actual, const char * expected, const char * file, int line);
189 
190 void atf_assert_log(atf_test_result * result, const char * exp, const char * file, int line, const char * fmt, ...);
191 
192 
193 #define assert(EXP) \
194  if ( (EXP) != true ) return atf_assert(__result__, #EXP, __FILE__, __LINE__);
195 
196 #define assert_true(EXP) \
197  if ( (EXP) != true ) return atf_assert_true(__result__, #EXP, __FILE__, __LINE__);
198 
199 #define assert_false(EXP) \
200  if ( (EXP) == true ) return atf_assert_false(__result__, #EXP, __FILE__, __LINE__);
201 
202 #define assert_null(EXP) \
203  if ( (EXP) != NULL ) return atf_assert_null(__result__, #EXP, __FILE__, __LINE__);
204 
205 #define assert_not_null(EXP) \
206  if ( (EXP) == NULL ) return atf_assert_not_null(__result__, #EXP, __FILE__, __LINE__);
207 
208 
209 #define assert_int_eq(ACTUAL, EXPECTED) \
210  if ( (ACTUAL) != (EXPECTED) ) return atf_assert_int_eq(__result__, #ACTUAL, ACTUAL, EXPECTED, __FILE__, __LINE__);
211 
212 #define assert_int_ne(ACTUAL, EXPECTED) \
213  if ( (ACTUAL) == (EXPECTED) ) return atf_assert_int_ne(__result__, #ACTUAL, ACTUAL, EXPECTED, __FILE__, __LINE__);
214 
215 
216 #define assert_string_eq(ACTUAL, EXPECTED) \
217  if ( strcmp(ACTUAL, EXPECTED) != 0 ) return atf_assert_string_eq(__result__, #ACTUAL, ACTUAL, EXPECTED, __FILE__, __LINE__);
218 
219 
220 #define assert_log(EXP, fmt, args ... ) \
221  if ( (EXP) == true ) return atf_assert_log(__result__, #EXP, __FILE__, __LINE__, fmt, ##args );
222 
223 /******************************************************************************
224  * atf_log
225  *****************************************************************************/
226 
227 #define ATF_LOG_PREFIX " "
228 
229 #define debug(fmt, args...) \
230  atf_log_line(stderr, "DEBUG", ATF_LOG_PREFIX, __FILE__, __LINE__, fmt, ## args);
231 
232 #define info(fmt, args...) \
233  atf_log(stderr, "INFO", ATF_LOG_PREFIX, __FILE__, __LINE__, fmt, ## args);
234 
235 #define warn(fmt, args...) \
236  atf_log(stderr, "WARN", ATF_LOG_PREFIX, __FILE__, __LINE__, fmt, ## args);
237 
238 #define error(fmt, args...) \
239  atf_log(stderr, "ERROR", ATF_LOG_PREFIX, __FILE__, __LINE__, fmt, ## args);
240 
241 void atf_log(FILE * f, const char * level, const char * prefix, const char * file, int line, const char * fmt, ...);
242 
243 void atf_log_line(FILE * f, const char * level, const char * prefix, const char * file, int line, const char * fmt, ...);
atf_plan_result * atf_plan_result_add(atf_plan_result *plan_result, atf_suite_result *suite_result)
void atf_test_result_free(atf_test_result *test_result)
atf_test_result * tests[ATF_SUITE_TEST_MAX]
void atf_log(FILE *f, const char *level, const char *prefix, const char *file, int line, const char *fmt,...)
uint32_t atf_suite_size(atf_suite *suite)
atf_plan * atf_plan_before(atf_plan *plan, bool(*before)(atf_plan *plan))
#define ATF_PLAN_SUITE_MAX
atf_test_result * atf_test_result_new(atf_test *test)
bool(* after)(atf_suite *)
bool(* after)(atf_plan *)
atf_suite_result * atf_suite_run(atf_suite *suite)
atf_plan * atf_plan_add(atf_plan *self, atf_suite *suite)
int atf_plan_run(atf_plan *self, atf_plan_result *result)
void atf_assert_not_null(atf_test_result *test_result, const char *exp, const char *file, int line)
void atf_assert_string_eq(atf_test_result *result, const char *actual_exp, const char *actual, const char *expected, const char *file, int line)
void(* init)(atf_suite *)
atf_suite * atf_suite_before(atf_suite *suite, bool(*before)(atf_suite *suite))
cl_msg_field f
atf_suite_result * atf_suite_result_new(atf_suite *suite)
void atf_assert_int_eq(atf_test_result *result, const char *actual_exp, int64_t actual, int64_t expected, const char *file, int line)
atf_suite * atf_suite_after(atf_suite *suite, bool(*after)(atf_suite *suite))
bool(* before)(atf_plan *)
atf_test_result * atf_test_run(atf_test *test)
void atf_assert_true(atf_test_result *test_result, const char *exp, const char *file, int line)
void atf_log_line(FILE *f, const char *level, const char *prefix, const char *file, int line, const char *fmt,...)
atf_suite * atf_suite_add(atf_suite *suite, atf_test *test)
void atf_assert_log(atf_test_result *result, const char *exp, const char *file, int line, const char *fmt,...)
void(* run)(atf_test *, atf_test_result *)
atf_plan * atf_plan_after(atf_plan *plan, bool(*after)(atf_plan *plan))
void atf_assert(atf_test_result *test_result, const char *exp, const char *file, int line)
#define ATF_SUITE_TEST_MAX
atf_suite_result * suites[ATF_PLAN_SUITE_MAX]
atf_suite_result * atf_suite_result_add(atf_suite_result *suite_result, atf_test_result *test_result)
bool(* before)(atf_suite *)
void atf_suite_result_free(atf_suite_result *suite_result)
atf_test * tests[ATF_SUITE_TEST_MAX]
void atf_assert_null(atf_test_result *test_result, const char *exp, const char *file, int line)
void atf_suite_result_print(atf_suite_result *suite_result)
atf_suite * suites[ATF_PLAN_SUITE_MAX]
void atf_assert_int_ne(atf_test_result *result, const char *actual_exp, int64_t actual, int64_t expected, const char *file, int line)
void atf_assert_false(atf_test_result *test_result, const char *exp, const char *file, int line)