1 /*
2  * Copyright 2008 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef CMOCKERY_H_
17 #define CMOCKERY_H_
18 /*
19  * These headers or their equivalents should be included prior to including
20  * this header file.
21  *
22  * #include <stdarg.h>
23  * #include <stddef.h>
24  * #include <setjmp.h>
25  *
26  * This allows test applications to use custom definitions of C standard
27  * library functions and types.
28  */
29 
30 // For those who are used to __func__ from gcc.
31 #ifndef __func__
32 #define __func__ __FUNCTION__
33 #endif
34 
35 // Retrieves a return value for the current function.
36 #define mock() _mock(__func__, __FILE__, __LINE__)
37 
38 /* Stores a value to be returned by the specified function later.
39  * The count parameter returns the number of times the value should be returned
40  * by mock().  If count is set to -1 the value will always be returned.
41  */
42 #define will_return(function, value) \
43     _will_return(#function, __FILE__, __LINE__, (void*)value, 1)
44 #define will_return_count(function, value, count) \
45     _will_return(#function, __FILE__, __LINE__, (void*)value, count)
46 
47 /* Add a custom parameter checking function.  If the event parameter is NULL
48  * the event structure is allocated internally by this function.  If event
49  * parameter is provided it must be allocated on the heap and doesn't need to
50  * be deallocated by the caller.
51  */
52 #define expect_check(function, parameter, check_function, check_data) \
53 	_expect_check(#function, #parameter, __FILE__, __LINE__, check_function, \
54 	              check_data)
55 
56 /* Add an event to check a parameter, using check_expected(), against a set of
57  * values. See will_return() for a description of the count parameter.
58  */
59 #define expect_in_set(function, parameter, value_array) \
60 	expect_in_set_count(function, parameter, value_array, 1)
61 #define expect_in_set_count(function, parameter, value_array, count) \
62 	_expect_in_set(#function, #parameter, __FILE__, __LINE__, value_array, \
63 	               sizeof(value_array) / sizeof(value_array[0]), count)
64 #define expect_not_in_set(function, parameter, value_array) \
65 	expect_not_in_set_count(function, parameter, value_array, 1)
66 #define expect_not_in_set_count(function, parameter, value_array, count) \
67 	_expect_not_in_set( \
68 	    #function, #parameter, __FILE__, __LINE__, value_array, \
69 	    sizeof(value_array) / sizeof(value_array[0]), count)
70 
71 
72 /* Add an event to check a parameter, using check_expected(), against a
73  * signed range.  Where range is minimum <= value <= maximum.
74  * See will_return() for a description of the count parameter.
75  */
76 #define expect_in_range(function, parameter, minimum, maximum) \
77 	expect_in_range_count(function, parameter, minimum, maximum, 1)
78 #define expect_in_range_count(function, parameter, minimum, maximum, count) \
79 	_expect_in_range(#function, #parameter, __FILE__, __LINE__, minimum, \
80 	                 maximum, count)
81 
82 /* Add an event to check a parameter, using check_expected(), against a
83  * signed range.  Where range is value < minimum or value > maximum.
84  * See will_return() for a description of the count parameter.
85  */
86 #define expect_not_in_range(function, parameter, minimum, maximum) \
87 	expect_not_in_range_count(function, parameter, minimum, maximum, 1)
88 #define expect_not_in_range_count(function, parameter, minimum, maximum, \
89                                   count) \
90 	_expect_not_in_range(#function, #parameter, __FILE__, __LINE__, \
91 	                     minimum, maximum, count)
92 
93 /* Add an event to check whether a parameter, using check_expected(), is or
94  * isn't a value.  See will_return() for a description of the count parameter.
95  */
96 #define expect_value(function, parameter, value) \
97 	expect_value_count(function, parameter, value, 1)
98 #define expect_value_count(function, parameter, value, count) \
99 	_expect_value(#function, #parameter, __FILE__, __LINE__, (void*)value, \
100 	              count)
101 #define expect_not_value(function, parameter, value) \
102 	expect_not_value_count(function, parameter, value, 1)
103 #define expect_not_value_count(function, parameter, value, count) \
104 	_expect_not_value(#function, #parameter, __FILE__, __LINE__, \
105 	                  (void*)value, count)
106 
107 /* Add an event to check whether a parameter, using check_expected(),
108  * is or isn't a string.  See will_return() for a description of the count
109  * parameter.
110  */
111 #define expect_string(function, parameter, string) \
112 	expect_string_count(function, parameter, string, 1)
113 #define expect_string_count(function, parameter, string, count) \
114 	_expect_string(#function, #parameter, __FILE__, __LINE__, (void*)string, \
115 	              count)
116 #define expect_not_string(function, parameter, string) \
117 	expect_not_string_count(function, parameter, string, 1)
118 #define expect_not_string_count(function, parameter, string, count) \
119 	_expect_not_string(#function, #parameter, __FILE__, __LINE__, \
120 	                  (void*)string, count)
121 
122 /* Add an event to check whether a parameter, using check_expected() does or
123  * doesn't match an area of memory.  See will_return() for a description of
124  * the count parameter.
125  */
126 #define expect_memory(function, parameter, memory, size) \
127 	expect_memory_count(function, parameter, memory, size, 1)
128 #define expect_memory_count(function, parameter, memory, size, count)	\
129 	_expect_memory(#function, #parameter, __FILE__, __LINE__, (void*)memory, \
130 	               size, count)
131 #define expect_not_memory(function, parameter, memory, size) \
132 	expect_not_memory_count(function, parameter, memory, size, 1)
133 #define expect_not_memory_count(function, parameter, memory, size, count) \
134 	_expect_not_memory(#function, #parameter, __FILE__, __LINE__, \
135 	                   (void*)memory, size, count)
136 
137 
138 /* Add an event to allow any value for a parameter checked using
139  * check_expected().  See will_return() for a description of the count
140  * parameter.
141  */
142 #define expect_any(function, parameter) \
143 	expect_any_count(function, parameter, 1)
144 #define expect_any_count(function, parameter, count) \
145 	_expect_any(#function, #parameter, __FILE__, __LINE__, count)
146 
147 /* Determine whether a function parameter is correct.  This ensures the next
148  * value queued by one of the expect_*() macros matches the specified variable.
149  */
150 #define check_expected(parameter) \
151 	_check_expected(__func__, #parameter, __FILE__, __LINE__, (void*)parameter)
152 
153 // Assert that the given expression is true.
154 #define assert_true(c) _assert_true((int)(c), #c, __FILE__, __LINE__)
155 // Assert that the given expression is false.
156 #define assert_false(c) _assert_true(!((int)(c)), #c, __FILE__, __LINE__)
157 
158 // Assert that the two given integers are equal, otherwise fail.
159 #define assert_int_equal(a, b) _assert_int_equal(a, b, __FILE__, __LINE__)
160 // Assert that the two given integers are not equal, otherwise fail.
161 #define assert_int_not_equal(a, b) \
162 	_assert_int_not_equal(a, b, __FILE__, __LINE__)
163 
164 // Assert that the two given strings are equal, otherwise fail.
165 #define assert_string_equal(a, b) \
166 	_assert_string_equal((const char*)a, (const char*)b, __FILE__, __LINE__)
167 // Assert that the two given strings are not equal, otherwise fail.
168 #define assert_string_not_equal(a, b) \
169 	_assert_string_not_equal((const char*)a, (const char*)b, __FILE__, \
170 	                         __LINE__)
171 
172 // Assert that the two given areas of memory are equal, otherwise fail.
173 #define assert_memory_equal(a, b, size) \
174 	_assert_memory_equal((const char*)a, (const char*)b, size, __FILE__, \
175 	                     __LINE__)
176 // Assert that the two given areas of memory are not equal, otherwise fail.
177 #define assert_memory_not_equal(a, b, size) \
178 	_assert_memory_not_equal((const char*)a, (const char*)b, size, __FILE__, \
179 	                         __LINE__)
180 
181 // Assert that the specified value is >= minimum and <= maximum.
182 #define assert_in_range(value, minimum, maximum) \
183 	_assert_in_range((int)value, (int)minimum, (int)maximum, __FILE__, \
184 	                 __LINE__)
185 // Assert that the specified value is < minumum or > maximum
186 #define assert_not_in_range(value, minimum, maximum) \
187 	_assert_not_in_range((int)value, (int)minimum, (int)maximum, __FILE__, \
188 	                     __LINE__)
189 
190 // Assert that the specified value is within a set.
191 #define assert_in_set(value, values, number_of_values) \
192 	_assert_in_set(value, values, number_of_values, __FILE__, __LINE__)
193 // Assert that the specified value is not within a set.
194 #define assert_not_in_set(value, values, number_of_values) \
195 	_assert_not_in_set(value, values, number_of_values, __FILE__, __LINE__)
196 
197 
198 // Forces the test to fail immediately and quit.
199 #define fail() _fail(__FILE__, __LINE__)
200 
201 // Generic method to kick off testing
202 #define run_test(f) _run_test(#f, f, NULL, UNIT_TEST_FUNCTION_TYPE_TEST, NULL)
203 
204 // Initializes a UnitTest structure.
205 #define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }
206 #define unit_test_setup(test, setup) \
207 	{ #test "_" #setup, setup, UNIT_TEST_FUNCTION_TYPE_SETUP }
208 #define unit_test_teardown(test, teardown) \
209 	{ #test "_" #teardown, teardown, UNIT_TEST_FUNCTION_TYPE_TEARDOWN }
210 
211 /* Initialize an array of UnitTest structures with a setup function for a test
212  * and a teardown function.  Either setup or teardown can be NULL.
213  */
214 #define unit_test_setup_teardown(test, setup, teardown)	\
215 	unit_test_setup(test, setup), \
216 	unit_test(test), \
217 	unit_test_teardown(test, teardown)
218 
219 /*
220  * Run tests specified by an array of UnitTest structures.  The following
221  * example illustrates this macro's use with the unit_test macro.
222  *
223  * void Test0();
224  * void Test1();
225  *
226  * int main(int argc, char* argv[]) {
227  *     const UnitTest tests[] = {
228  *         unit_test(Test0);
229  *         unit_test(Test1);
230  *     };
231  *     return run_tests(tests);
232  * }
233  */
234 #define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
235 
236 // Dynamic allocators
237 #define test_malloc(size) _test_malloc(size, __FILE__, __LINE__)
238 #define test_calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__)
239 #define test_free(ptr) _test_free(ptr, __FILE__, __LINE__)
240 
241 // Redirect malloc, calloc and free to the unit test allocators.
242 #if UNIT_TESTING
243 #define malloc test_malloc
244 #define calloc test_calloc
245 #define free test_free
246 #endif // UNIT_TESTING
247 
248 /*
249  * Ensure mock_assert() is called.  If mock_assert() is called the assert
250  * expression string is returned.
251  * For example:
252  *
253  * #define assert mock_assert
254  *
255  * void showmessage(const char *message) {
256  *   assert(message);
257  * }
258  *
259  * int main(int argc, const char* argv[]) {
260  *   expect_assert_failure(show_message(NULL));
261  *   printf("succeeded\n");
262  *   return 0;
263  * }
264  */
265 #define expect_assert_failure(function_call) \
266   { \
267     const char* expression = (const char*)setjmp(global_expect_assert_env); \
268     global_expecting_assert = 1; \
269     if (expression) { \
270       print_message("Expected assertion %s occurred\n", expression); \
271       global_expecting_assert = 0; \
272     } else { \
273       function_call ; \
274       global_expecting_assert = 0; \
275       print_error("Expected assert in %s\n", #function_call); \
276       _fail(__FILE__, __LINE__); \
277     } \
278   }
279 
280 // Function prototype for setup, test and teardown functions.
281 typedef void (*UnitTestFunction)(void **state);
282 
283 // Function that determines whether a function parameter value is correct.
284 typedef int (*CheckParameterValue)(const void *value, void *check_value_data);
285 
286 // Type of the unit test function.
287 typedef enum UnitTestFunctionType {
288 	UNIT_TEST_FUNCTION_TYPE_TEST = 0,
289 	UNIT_TEST_FUNCTION_TYPE_SETUP,
290 	UNIT_TEST_FUNCTION_TYPE_TEARDOWN,
291 } UnitTestFunctionType;
292 
293 /* Stores a unit test function with its name and type.
294  * NOTE: Every setup function must be paired with a teardown function.  It's
295  * possible to specify NULL function pointers.
296  */
297 typedef struct UnitTest {
298 	const char* name;
299 	UnitTestFunction function;
300 	UnitTestFunctionType function_type;
301 } UnitTest;
302 
303 
304 // Location within some source code.
305 typedef struct SourceLocation {
306 	const char* file;
307 	int line;
308 } SourceLocation;
309 
310 // Event that's called to check a parameter value.
311 typedef struct CheckParameterEvent {
312 	SourceLocation location;
313 	const char *parameter_name;
314 	CheckParameterValue check_value;
315 	void *check_value_data;
316 } CheckParameterEvent;
317 
318 // Used by expect_assert_failure() and mock_assert().
319 extern int global_expecting_assert;
320 extern jmp_buf global_expect_assert_env;
321 
322 // Retrieves a value for the given function, as set by "will_return".
323 void* _mock(const char * const function, const char* const file,
324             const int line);
325 
326 void _expect_check(
327     const char* const function, const char* const parameter,
328     const char* const file, const int line,
329     const CheckParameterValue check_function, void * const check_data,
330     CheckParameterEvent * const event, const int count);
331 
332 void _expect_in_set(
333     const char* const function, const char* const parameter,
334     const char* const file, const int line, const void *values[],
335     const size_t number_of_values, const int count);
336 void _expect_not_in_set(
337     const char* const function, const char* const parameter,
338     const char* const file, const int line, const void *values[],
339     const size_t number_of_values, const int count);
340 
341 void _expect_in_range(
342     const char* const function, const char* const parameter,
343     const char* const file, const int line,
344     const int minimum, const int maximum, const int count);
345 void _expect_not_in_range(
346     const char* const function, const char* const parameter,
347     const char* const file, const int line,
348     const int minimum, const int maximum, const int count);
349 void _expect_value(
350     const char* const function, const char* const parameter,
351     const char* const file, const int line, const void* const value,
352     const int count);
353 void _expect_not_value(
354     const char* const function, const char* const parameter,
355     const char* const file, const int line, const void* const value,
356     const int count);
357 void _expect_string(
358     const char* const function, const char* const parameter,
359     const char* const file, const int line, const char* string,
360     const int count);
361 void _expect_not_string(
362     const char* const function, const char* const parameter,
363     const char* const file, const int line, const char* string,
364     const int count);
365 void _expect_memory(
366     const char* const function, const char* const parameter,
367     const char* const file, const int line, const void* const memory,
368     const size_t size, const int count);
369 void _expect_not_memory(
370     const char* const function, const char* const parameter,
371     const char* const file, const int line, const void* const memory,
372     const size_t size, const int count);
373 void _expect_any(
374     const char* const function, const char* const parameter,
375     const char* const file, const int line, const int count);
376 
377 void _check_expected(
378     const char * const function_name, const char * const parameter_name,
379     const char* file, const int line, const void* value);
380 
381 // Can be used to replace assert in tested code so that in conjuction with
382 // check_assert() it's possible to determine whether an assert condition has
383 // failed without stopping a test.
384 void mock_assert(const int result, const char* const expression,
385                  const char * const file, const int line);
386 
387 void _will_return(const char * const function_name, const char * const file,
388                   const int line, const void* const value, const int count);
389 void _assert_true(const int result, const char* const expression,
390                   const char * const file, const int line);
391 void _assert_int_equal(const int a, const int b, const char * const file,
392                        const int line);
393 void _assert_int_not_equal(const int a, const int b, const char * const file,
394                            const int line);
395 void _assert_string_equal(const char * const a, const char * const b,
396                           const char * const file, const int line);
397 void _assert_string_not_equal(const char * const a, const char * const b,
398                               const char *file, const int line);
399 void _assert_memory_equal(const void * const a, const void * const b,
400                           const size_t size, const char* const file,
401                           const int line);
402 void _assert_memory_not_equal(const void * const a, const void * const b,
403                               const size_t size, const char* const file,
404                               const int line);
405 void _assert_in_range(const int value, const int minimum, const int maximum,
406                       const char* const file, const int line);
407 void _assert_not_in_range(const int value, const int minimum,
408                           const int maximum, const char* const file,
409                           const int line);
410 void _assert_in_set(const void * const value, const void *values[],
411                     const size_t number_of_values, const char* const file,
412                     const int line);
413 void _assert_not_in_set(const void * const value, const void *values[],
414                         const size_t number_of_values, const char* const file,
415                         const int line);
416 
417 void* _test_malloc(const size_t size, const char* file, const int line);
418 void* _test_calloc(const size_t number_of_elements, const size_t size,
419                    const char* file, const int line);
420 void _test_free(void* const ptr, const char* file, const int line);
421 
422 void _fail(const char * const file, const int line);
423 int _run_test(
424     const char * const function_name, const UnitTestFunction Function,
425     void ** const state, const UnitTestFunctionType function_type,
426     const void* const heap_check_point);
427 int _run_tests(const UnitTest * const tests, const size_t number_of_tests);
428 
429 // Standard output and error print methods.
430 void print_message(const char* const format, ...);
431 void print_error(const char* const format, ...);
432 void vprint_message(const char* const format, va_list args);
433 void vprint_error(const char* const format, va_list args);
434 
435 #endif // CMOCKERY_H_
436