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 #ifdef _WIN32
19 #if _MSC_VER < 1500
20 #ifdef __cplusplus
21 extern "C" {
22 #endif   // __cplusplus
23 int __stdcall IsDebuggerPresent();
24 #ifdef __cplusplus
25 } /* extern "C" */
26 #endif   // __cplusplus
27 #endif  // _MSC_VER < 1500
28 #endif  // _WIN32
29 /*
30  * These headers or their equivalents should be included prior to including
31  * this header file.
32  *
33  * #include <stdarg.h>
34  * #include <stddef.h>
35  * #include <setjmp.h>
36  * #include <inttypes.h>
37  *
38  * This allows test applications to use custom definitions of C standard
39  * library functions and types.
40  */
41 
42 // For those who are used to __func__ from gcc.
43 #ifndef __func__
44 #define __func__ __FUNCTION__
45 #endif
46 
47 /* Largest integral type.  This type should be large enough to hold any
48  * pointer or integer supported by the compiler. */
49 #ifndef _UINTMAX_T
50 #define _UINTMAX_T
51 typedef unsigned long long uintmax_t;
52 #endif /* _UINTMAX_T */
53 
54 /* Printf formats used to display uintmax_t. */
55 #ifdef _WIN32
56 
57 #ifndef PRIdMAX
58 #define PRIdMAX "I64d"
59 #endif /* PRIdMAX */
60 #ifndef PRIiMAX
61 #define PRIiMAX "I64i"
62 #endif /* PRIiMAX */
63 #ifndef PRIoMAX
64 #define PRIoMAX "I64o"
65 #endif /* PRIoMAX */
66 #ifndef PRIuMAX
67 #define PRIuMAX "I64u"
68 #endif /* PRIuMAX */
69 #ifndef PRIxMAX
70 #define PRIxMAX "I64x"
71 #endif /* PRIxMAX */
72 #ifndef PRIXMAX
73 #define PRIXMAX "I64X"
74 #endif /* PRIXMAX */
75 
76 #else /* _WIN32 */
77 
78 #ifndef PRIdMAX
79 #define PRIdMAX "lld"
80 #endif /* PRIdMAX */
81 #ifndef PRIiMAX
82 #define PRIiMAX "lli"
83 #endif /* PRIiMAX */
84 #ifndef PRIoMAX
85 #define PRIoMAX "llo"
86 #endif /* PRIoMAX */
87 #ifndef PRIuMAX
88 #define PRIuMAX "llu"
89 #endif /* PRIuMAX */
90 #ifndef PRIxMAX
91 #define PRIxMAX "llx"
92 #endif /* PRIxMAX */
93 #ifndef PRIXMAX
94 #define PRIXMAX "llX"
95 #endif /* PRIXMAX */
96 
97 #endif /* _WIN32 */
98 
99 // Perform an unsigned cast to uintmax_t.
100 #define cast_to_largest_integral_type(value) \
101     ((uintmax_t)(value))
102 
103 /* Smallest integral type capable of holding a pointer. */
104 #ifndef _UINTPTR_T
105 #define _UINTPTR_T
106 #ifdef _WIN32
107 
108 /* WIN32 is an ILP32 platform */
109 typedef unsigned long uintptr_t;
110 
111 #else /* _WIN32 */
112 
113 /* what about 64-bit windows?
114  * what's the right preprocessor symbol?
115 typedef unsigned long long uintptr_t */
116 
117 #endif /* _WIN32 */
118 #endif /* _UINTPTR_T */
119 
120 /* Perform an unsigned cast to uintptr_t. */
121 #define cast_to_pointer_integral_type(value) \
122 	((uintptr_t)(value))
123 
124 /* Perform a cast of a pointer to uintmax_t */
125 #define cast_ptr_to_largest_integral_type(value) \
126 cast_to_largest_integral_type(cast_to_pointer_integral_type(value))
127 
128 // Retrieves a return value for the current function.
129 #define mock() _mock(__func__, __FILE__, __LINE__)
130 
131 /* Stores a value to be returned by the specified function later.
132  * The count parameter returns the number of times the value should be returned
133  * by mock().  If count is set to -1 the value will always be returned.
134  */
135 #define will_return(function, value) \
136     _will_return(#function, __FILE__, __LINE__, \
137                  cast_to_largest_integral_type(value), 1)
138 #define will_return_count(function, value, count) \
139     _will_return(#function, __FILE__, __LINE__, \
140                  cast_to_largest_integral_type(value), count)
141 
142 /* Add a custom parameter checking function.  If the event parameter is NULL
143  * the event structure is allocated internally by this function.  If event
144  * parameter is provided it must be allocated on the heap and doesn't need to
145  * be deallocated by the caller.
146  */
147 #define expect_check(function, parameter, check_function, check_data) \
148     _expect_check(#function, #parameter, __FILE__, __LINE__, check_function, \
149                   cast_to_largest_integral_type(check_data), NULL, 0)
150 
151 /* Add an event to check a parameter, using check_expected(), against a set of
152  * values. See will_return() for a description of the count parameter.
153  */
154 #define expect_in_set(function, parameter, value_array) \
155     expect_in_set_count(function, parameter, value_array, 1)
156 #define expect_in_set_count(function, parameter, value_array, count) \
157     _expect_in_set(#function, #parameter, __FILE__, __LINE__, value_array, \
158                    sizeof(value_array) / sizeof((value_array)[0]), count)
159 #define expect_not_in_set(function, parameter, value_array) \
160     expect_not_in_set_count(function, parameter, value_array, 1)
161 #define expect_not_in_set_count(function, parameter, value_array, count) \
162     _expect_not_in_set( \
163         #function, #parameter, __FILE__, __LINE__, value_array, \
164         sizeof(value_array) / sizeof((value_array)[0]), count)
165 
166 
167 /* Add an event to check a parameter, using check_expected(), against a
168  * signed range.  Where range is minimum <= value <= maximum.
169  * See will_return() for a description of the count parameter.
170  */
171 #define expect_in_range(function, parameter, minimum, maximum) \
172     expect_in_range_count(function, parameter, minimum, maximum, 1)
173 #define expect_in_range_count(function, parameter, minimum, maximum, count) \
174     _expect_in_range(#function, #parameter, __FILE__, __LINE__, minimum, \
175                      maximum, count)
176 
177 /* Add an event to check a parameter, using check_expected(), against a
178  * signed range.  Where range is value < minimum or value > maximum.
179  * See will_return() for a description of the count parameter.
180  */
181 #define expect_not_in_range(function, parameter, minimum, maximum) \
182     expect_not_in_range_count(function, parameter, minimum, maximum, 1)
183 #define expect_not_in_range_count(function, parameter, minimum, maximum, \
184                                   count) \
185     _expect_not_in_range(#function, #parameter, __FILE__, __LINE__, \
186                          minimum, maximum, count)
187 
188 /* Add an event to check whether a parameter, using check_expected(), is or
189  * isn't a value.  See will_return() for a description of the count parameter.
190  */
191 #define expect_value(function, parameter, value) \
192     expect_value_count(function, parameter, value, 1)
193 #define expect_value_count(function, parameter, value, count) \
194     _expect_value(#function, #parameter, __FILE__, __LINE__, \
195                   cast_to_largest_integral_type(value), count)
196 #define expect_not_value(function, parameter, value) \
197     expect_not_value_count(function, parameter, value, 1)
198 #define expect_not_value_count(function, parameter, value, count) \
199     _expect_not_value(#function, #parameter, __FILE__, __LINE__, \
200                       cast_to_largest_integral_type(value), count)
201 
202 /* Add an event to check whether a parameter, using check_expected(),
203  * is or isn't a string.  See will_return() for a description of the count
204  * parameter.
205  */
206 #define expect_string(function, parameter, string) \
207     expect_string_count(function, parameter, string, 1)
208 #define expect_string_count(function, parameter, string, count) \
209     _expect_string(#function, #parameter, __FILE__, __LINE__, \
210                    (const char*)(string), count)
211 #define expect_not_string(function, parameter, string) \
212     expect_not_string_count(function, parameter, string, 1)
213 #define expect_not_string_count(function, parameter, string, count) \
214     _expect_not_string(#function, #parameter, __FILE__, __LINE__, \
215                        (const char*)(string), count)
216 
217 /* Add an event to check whether a parameter, using check_expected() does or
218  * doesn't match an area of memory.  See will_return() for a description of
219  * the count parameter.
220  */
221 #define expect_memory(function, parameter, memory, size) \
222     expect_memory_count(function, parameter, memory, size, 1)
223 #define expect_memory_count(function, parameter, memory, size, count) \
224     _expect_memory(#function, #parameter, __FILE__, __LINE__, \
225                    (const void*)(memory), size, count)
226 #define expect_not_memory(function, parameter, memory, size) \
227     expect_not_memory_count(function, parameter, memory, size, 1)
228 #define expect_not_memory_count(function, parameter, memory, size, count) \
229     _expect_not_memory(#function, #parameter, __FILE__, __LINE__, \
230                        (const void*)(memory), size, count)
231 
232 
233 /* Add an event to allow any value for a parameter checked using
234  * check_expected().  See will_return() for a description of the count
235  * parameter.
236  */
237 #define expect_any(function, parameter) \
238     expect_any_count(function, parameter, 1)
239 #define expect_any_count(function, parameter, count) \
240     _expect_any(#function, #parameter, __FILE__, __LINE__, count)
241 
242 /* Determine whether a function parameter is correct.  This ensures the next
243  * value queued by one of the expect_*() macros matches the specified variable.
244  */
245 #define check_expected(parameter) \
246     _check_expected(__func__, #parameter, __FILE__, __LINE__, \
247                     cast_to_largest_integral_type(parameter))
248 
249 // Assert that the given expression is true.
250 #define assert_true(c) _assert_true(cast_to_largest_integral_type(c), #c, \
251                                     __FILE__, __LINE__)
252 // Assert that the given expression is false.
253 #define assert_false(c) _assert_true(!(cast_to_largest_integral_type(c)), #c, \
254                                      __FILE__, __LINE__)
255 
256 // Assert that the given pointer is non-NULL.
257 #define assert_non_null(c) _assert_true(cast_ptr_to_largest_integral_type(c), #c, \
258 __FILE__, __LINE__)
259 // Assert that the given pointer is NULL.
260 #define assert_null(c) _assert_true(!(cast_ptr_to_largest_integral_type(c)), #c, \
261 __FILE__, __LINE__)
262 
263 // Assert that the two given integers are equal, otherwise fail.
264 #define assert_int_equal(a, b) \
265     _assert_int_equal(cast_to_largest_integral_type(a), \
266                       cast_to_largest_integral_type(b), \
267                       __FILE__, __LINE__)
268 // Assert that the two given integers are not equal, otherwise fail.
269 #define assert_int_not_equal(a, b) \
270     _assert_int_not_equal(cast_to_largest_integral_type(a), \
271                           cast_to_largest_integral_type(b), \
272                           __FILE__, __LINE__)
273 
274 // Assert that the two given strings are equal, otherwise fail.
275 #define assert_string_equal(a, b) \
276     _assert_string_equal((const char*)(a), (const char*)(b), __FILE__, \
277                          __LINE__)
278 // Assert that the two given strings are not equal, otherwise fail.
279 #define assert_string_not_equal(a, b) \
280     _assert_string_not_equal((const char*)(a), (const char*)(b), __FILE__, \
281                              __LINE__)
282 
283 // Assert that the two given areas of memory are equal, otherwise fail.
284 #define assert_memory_equal(a, b, size) \
285     _assert_memory_equal((const char*)(a), (const char*)(b), size, __FILE__, \
286                          __LINE__)
287 // Assert that the two given areas of memory are not equal, otherwise fail.
288 #define assert_memory_not_equal(a, b, size) \
289     _assert_memory_not_equal((const char*)(a), (const char*)(b), size, \
290                              __FILE__, __LINE__)
291 
292 // Assert that the specified value is >= minimum and <= maximum.
293 #define assert_in_range(value, minimum, maximum) \
294     _assert_in_range( \
295         cast_to_largest_integral_type(value), \
296         cast_to_largest_integral_type(minimum), \
297         cast_to_largest_integral_type(maximum), __FILE__, __LINE__)
298 
299 // Assert that the specified value is < minumum or > maximum
300 #define assert_not_in_range(value, minimum, maximum) \
301     _assert_not_in_range( \
302         cast_to_largest_integral_type(value), \
303         cast_to_largest_integral_type(minimum), \
304         cast_to_largest_integral_type(maximum), __FILE__, __LINE__)
305 
306 // Assert that the specified value is within a set.
307 #define assert_in_set(value, values, number_of_values) \
308     _assert_in_set(value, values, number_of_values, __FILE__, __LINE__)
309 // Assert that the specified value is not within a set.
310 #define assert_not_in_set(value, values, number_of_values) \
311     _assert_not_in_set(value, values, number_of_values, __FILE__, __LINE__)
312 
313 
314 // Forces the test to fail immediately and quit.
315 #define fail() _fail(__FILE__, __LINE__)
316 
317 // Generic method to kick off testing
318 #define run_test(f) _run_test(#f, f, NULL, UNIT_TEST_FUNCTION_TYPE_TEST, NULL)
319 
320 // Initializes a UnitTest structure.
321 #define unit_test(f) { #f, f, UNIT_TEST_FUNCTION_TYPE_TEST }
322 #define unit_test_setup(test, setup) \
323     { #test "_" #setup, setup, UNIT_TEST_FUNCTION_TYPE_SETUP }
324 #define unit_test_teardown(test, teardown) \
325     { #test "_" #teardown, teardown, UNIT_TEST_FUNCTION_TYPE_TEARDOWN }
326 
327 /* Initialize an array of UnitTest structures with a setup function for a test
328  * and a teardown function.  Either setup or teardown can be NULL.
329  */
330 #define unit_test_setup_teardown(test, setup, teardown) \
331     unit_test_setup(test, setup), \
332     unit_test(test), \
333     unit_test_teardown(test, teardown)
334 
335 /*
336  * Run tests specified by an array of UnitTest structures.  The following
337  * example illustrates this macro's use with the unit_test macro.
338  *
339  * void Test0();
340  * void Test1();
341  *
342  * int main(int argc, char* argv[]) {
343  *     const UnitTest tests[] = {
344  *         unit_test(Test0);
345  *         unit_test(Test1);
346  *     };
347  *     return run_tests(tests);
348  * }
349  */
350 #define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
351 
352 // Dynamic allocators
353 #define test_malloc(size) _test_malloc(size, __FILE__, __LINE__)
354 #define test_calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__)
355 #define test_free(ptr) _test_free(ptr, __FILE__, __LINE__)
356 
357 // Redirect malloc, calloc and free to the unit test allocators.
358 #if UNIT_TESTING
359 #define malloc test_malloc
360 #define calloc test_calloc
361 #define free test_free
362 #endif // UNIT_TESTING
363 
364 /*
365  * Ensure mock_assert() is called.  If mock_assert() is called the assert
366  * expression string is returned.
367  * For example:
368  *
369  * #define assert mock_assert
370  *
371  * void showmessage(const char *message) {
372  *   assert(message);
373  * }
374  *
375  * int main(int argc, const char* argv[]) {
376  *   expect_assert_failure(show_message(NULL));
377  *   printf("succeeded\n");
378  *   return 0;
379  * }
380  */
381 #define expect_assert_failure(function_call) \
382   { \
383     const int expression = setjmp(global_expect_assert_env); \
384     global_expecting_assert = 1; \
385     if (expression) { \
386       print_message("Expected assertion %s occurred\n", \
387                     *((const char**)&expression)); \
388       global_expecting_assert = 0; \
389     } else { \
390       function_call ; \
391       global_expecting_assert = 0; \
392       print_error("Expected assert in %s\n", #function_call); \
393       _fail(__FILE__, __LINE__); \
394     } \
395   }
396 
397 // Function prototype for setup, test and teardown functions.
398 typedef void (*UnitTestFunction)(void **state);
399 
400 // Function that determines whether a function parameter value is correct.
401 typedef int (*CheckParameterValue)(const uintmax_t value,
402                                    const uintmax_t check_value_data);
403 
404 // Type of the unit test function.
405 typedef enum UnitTestFunctionType {
406     UNIT_TEST_FUNCTION_TYPE_TEST = 0,
407     UNIT_TEST_FUNCTION_TYPE_SETUP,
408     UNIT_TEST_FUNCTION_TYPE_TEARDOWN,
409 } UnitTestFunctionType;
410 
411 /* Stores a unit test function with its name and type.
412  * NOTE: Every setup function must be paired with a teardown function.  It's
413  * possible to specify NULL function pointers.
414  */
415 typedef struct UnitTest {
416     const char* name;
417     UnitTestFunction function;
418     UnitTestFunctionType function_type;
419 } UnitTest;
420 
421 
422 // Location within some source code.
423 typedef struct SourceLocation {
424     const char* file;
425     int line;
426 } SourceLocation;
427 
428 // Event that's called to check a parameter value.
429 typedef struct CheckParameterEvent {
430     SourceLocation location;
431     const char *parameter_name;
432     CheckParameterValue check_value;
433     uintmax_t check_value_data;
434 } CheckParameterEvent;
435 
436 // Used by expect_assert_failure() and mock_assert().
437 extern int global_expecting_assert;
438 extern jmp_buf global_expect_assert_env;
439 
440 // Retrieves a value for the given function, as set by "will_return".
441 uintmax_t _mock(const char * const function, const char* const file,
442                           const int line);
443 
444 void _expect_check(
445     const char* const function, const char* const parameter,
446     const char* const file, const int line,
447     const CheckParameterValue check_function,
448     const uintmax_t check_data, CheckParameterEvent * const event,
449     const int count);
450 
451 void _expect_in_set(
452     const char* const function, const char* const parameter,
453     const char* const file, const int line, const uintmax_t values[],
454     const size_t number_of_values, const int count);
455 void _expect_not_in_set(
456     const char* const function, const char* const parameter,
457     const char* const file, const int line, const uintmax_t values[],
458     const size_t number_of_values, const int count);
459 
460 void _expect_in_range(
461     const char* const function, const char* const parameter,
462     const char* const file, const int line,
463     const uintmax_t minimum,
464     const uintmax_t maximum, const int count);
465 void _expect_not_in_range(
466     const char* const function, const char* const parameter,
467     const char* const file, const int line,
468     const uintmax_t minimum,
469     const uintmax_t maximum, const int count);
470 
471 void _expect_value(
472     const char* const function, const char* const parameter,
473     const char* const file, const int line, const uintmax_t value,
474     const int count);
475 void _expect_not_value(
476     const char* const function, const char* const parameter,
477     const char* const file, const int line, const uintmax_t value,
478     const int count);
479 
480 void _expect_string(
481     const char* const function, const char* const parameter,
482     const char* const file, const int line, const char* string,
483     const int count);
484 void _expect_not_string(
485     const char* const function, const char* const parameter,
486     const char* const file, const int line, const char* string,
487     const int count);
488 
489 void _expect_memory(
490     const char* const function, const char* const parameter,
491     const char* const file, const int line, const void* const memory,
492     const size_t size, const int count);
493 void _expect_not_memory(
494     const char* const function, const char* const parameter,
495     const char* const file, const int line, const void* const memory,
496     const size_t size, const int count);
497 
498 void _expect_any(
499     const char* const function, const char* const parameter,
500     const char* const file, const int line, const int count);
501 
502 void _check_expected(
503     const char * const function_name, const char * const parameter_name,
504     const char* file, const int line, const uintmax_t value);
505 
506 // Can be used to replace assert in tested code so that in conjuction with
507 // check_assert() it's possible to determine whether an assert condition has
508 // failed without stopping a test.
509 void mock_assert(const int result, const char* const expression,
510                  const char * const file, const int line);
511 
512 void _will_return(const char * const function_name, const char * const file,
513                   const int line, const uintmax_t value,
514                   const int count);
515 void _assert_true(const uintmax_t result,
516                   const char* const expression,
517                   const char * const file, const int line);
518 void _assert_int_equal(
519     const uintmax_t a, const uintmax_t b,
520     const char * const file, const int line);
521 void _assert_int_not_equal(
522     const uintmax_t a, const uintmax_t b,
523     const char * const file, const int line);
524 void _assert_string_equal(const char * const a, const char * const b,
525                           const char * const file, const int line);
526 void _assert_string_not_equal(const char * const a, const char * const b,
527                               const char *file, const int line);
528 void _assert_memory_equal(const void * const a, const void * const b,
529                           const size_t size, const char* const file,
530                           const int line);
531 void _assert_memory_not_equal(const void * const a, const void * const b,
532                               const size_t size, const char* const file,
533                               const int line);
534 void _assert_in_range(
535     const uintmax_t value, const uintmax_t minimum,
536     const uintmax_t maximum, const char* const file, const int line);
537 void _assert_not_in_range(
538     const uintmax_t value, const uintmax_t minimum,
539     const uintmax_t maximum, const char* const file, const int line);
540 void _assert_in_set(
541     const uintmax_t value, const uintmax_t values[],
542     const size_t number_of_values, const char* const file, const int line);
543 void _assert_not_in_set(
544     const uintmax_t value, const uintmax_t values[],
545     const size_t number_of_values, const char* const file, const int line);
546 
547 void* _test_malloc(const size_t size, const char* file, const int line);
548 void* _test_calloc(const size_t number_of_elements, const size_t size,
549                    const char* file, const int line);
550 void _test_free(void* const ptr, const char* file, const int line);
551 
552 void _fail(const char * const file, const int line);
553 int _run_test(
554     const char * const function_name, const UnitTestFunction Function,
555     void ** const volatile state, const UnitTestFunctionType function_type,
556     const void* const heap_check_point);
557 int _run_tests(const UnitTest * const tests, const size_t number_of_tests);
558 
559 // Standard output and error print methods.
560 void print_message(const char* const format, ...);
561 void print_error(const char* const format, ...);
562 void vprint_message(const char* const format, va_list args);
563 void vprint_error(const char* const format, va_list args);
564 
565 #endif // CMOCKERY_H_
566