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.
281typedef void (*UnitTestFunction)(void **state);
282
283// Function that determines whether a function parameter value is correct.
284typedef int (*CheckParameterValue)(const void *value, void *check_value_data);
285
286// Type of the unit test function.
287typedef 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 */
297typedef struct UnitTest {
298	const char* name;
299	UnitTestFunction function;
300	UnitTestFunctionType function_type;
301} UnitTest;
302
303
304// Location within some source code.
305typedef struct SourceLocation {
306	const char* file;
307	int line;
308} SourceLocation;
309
310// Event that's called to check a parameter value.
311typedef 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().
319extern int global_expecting_assert;
320extern jmp_buf global_expect_assert_env;
321
322// Retrieves a value for the given function, as set by "will_return".
323void* _mock(const char * const function, const char* const file,
324            const int line);
325
326void _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
332void _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);
336void _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
341void _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);
345void _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);
349void _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);
353void _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);
357void _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);
361void _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);
365void _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);
369void _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);
373void _expect_any(
374    const char* const function, const char* const parameter,
375    const char* const file, const int line, const int count);
376
377void _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.
384void mock_assert(const int result, const char* const expression,
385                 const char * const file, const int line);
386
387void _will_return(const char * const function_name, const char * const file,
388                  const int line, const void* const value, const int count);
389void _assert_true(const int result, const char* const expression,
390                  const char * const file, const int line);
391void _assert_int_equal(const int a, const int b, const char * const file,
392                       const int line);
393void _assert_int_not_equal(const int a, const int b, const char * const file,
394                           const int line);
395void _assert_string_equal(const char * const a, const char * const b,
396                          const char * const file, const int line);
397void _assert_string_not_equal(const char * const a, const char * const b,
398                              const char *file, const int line);
399void _assert_memory_equal(const void * const a, const void * const b,
400                          const size_t size, const char* const file,
401                          const int line);
402void _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);
405void _assert_in_range(const int value, const int minimum, const int maximum,
406                      const char* const file, const int line);
407void _assert_not_in_range(const int value, const int minimum,
408                          const int maximum, const char* const file,
409                          const int line);
410void _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);
413void _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
417void* _test_malloc(const size_t size, const char* file, const int line);
418void* _test_calloc(const size_t number_of_elements, const size_t size,
419                   const char* file, const int line);
420void _test_free(void* const ptr, const char* file, const int line);
421
422void _fail(const char * const file, const int line);
423int _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);
427int _run_tests(const UnitTest * const tests, const size_t number_of_tests);
428
429// Standard output and error print methods.
430void print_message(const char* const format, ...);
431void print_error(const char* const format, ...);
432void vprint_message(const char* const format, va_list args);
433void vprint_error(const char* const format, va_list args);
434
435#endif // CMOCKERY_H_
436