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