1*5d3e7166SEd Maste #ifndef TEST_ALLOCATOR_H_ 2*5d3e7166SEd Maste #define TEST_ALLOCATOR_H_ 3*5d3e7166SEd Maste 4*5d3e7166SEd Maste #include "assertions.h" 5*5d3e7166SEd Maste #include "cbor.h" 6*5d3e7166SEd Maste 7*5d3e7166SEd Maste // Harness for mocking `malloc` and `realloc` 8*5d3e7166SEd Maste 9*5d3e7166SEd Maste typedef enum call_expectation { 10*5d3e7166SEd Maste MALLOC, 11*5d3e7166SEd Maste MALLOC_FAIL, 12*5d3e7166SEd Maste REALLOC, 13*5d3e7166SEd Maste REALLOC_FAIL 14*5d3e7166SEd Maste } call_expectation; 15*5d3e7166SEd Maste 16*5d3e7166SEd Maste void set_mock_malloc(int calls, ...); 17*5d3e7166SEd Maste 18*5d3e7166SEd Maste void finalize_mock_malloc(void); 19*5d3e7166SEd Maste 20*5d3e7166SEd Maste void *instrumented_malloc(size_t size); 21*5d3e7166SEd Maste 22*5d3e7166SEd Maste void *instrumented_realloc(void *ptr, size_t size); 23*5d3e7166SEd Maste 24*5d3e7166SEd Maste #define WITH_MOCK_MALLOC(block, malloc_calls, ...) \ 25*5d3e7166SEd Maste do { \ 26*5d3e7166SEd Maste cbor_set_allocs(instrumented_malloc, instrumented_realloc, free); \ 27*5d3e7166SEd Maste set_mock_malloc(malloc_calls, __VA_ARGS__); \ 28*5d3e7166SEd Maste block; \ 29*5d3e7166SEd Maste finalize_mock_malloc(); \ 30*5d3e7166SEd Maste cbor_set_allocs(malloc, realloc, free); \ 31*5d3e7166SEd Maste } while (0) 32*5d3e7166SEd Maste 33*5d3e7166SEd Maste #define WITH_FAILING_MALLOC(block) WITH_MOCK_MALLOC(block, 1, MALLOC_FAIL) 34*5d3e7166SEd Maste 35*5d3e7166SEd Maste #endif // TEST_ALLOCATOR_H_ 36