I want to create mock functions for C code testing and get to know that in target_link_libraries() have option to wrap the function which work similar to mock, But not understand how it will work?
target_link_libraries(IntegrationTests crypto-testutils mbedcrypto mbedtls sodium cmocka-static
"-Wl,\
--wrap=ExportCTRKeys,\
--wrap=malloc,\
--wrap=GenRandom)
How do I write this wrap functionality and how it will work?
When target_link_libraries
gets arguments which start with -
, it treats them as linker command-line options and passes them untouched to the linker. This therefore has nothing to do with CMake and everything to do with ld. You can study this in ld reference documentation, such as this one:
--wrap=
symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to"__wrap_
symbol
"
. Any undefined reference to"__real_
symbol
"
will be resolved to symbol.This can be used to provide a wrapper for a system function. The wrapper function should be called
"__wrap_
symbol
"
. If it wishes to call the system function, it should call"__real_
symbol
"
.Here is a trivial example:
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }
If you link other code with this file using --wrap malloc, then all calls to
"malloc"
will call the function"__wrap_malloc"
instead. The call to"__real_malloc"
in"__wrap_malloc"
will call the real"malloc"
function.You may wish to provide a
"__real_malloc"
function as well, so that links without the --wrap option will succeed. If you do this, you should not put the definition of"__real_malloc"
in the same file as"__wrap_malloc"
; if you do, the assembler may resolve the call before the linker has a chance to wrap it to"malloc"
.