Function pointer link stubs
Last week been test-driving some C code again and found that not much people are familiar with the "function pointer link stub". This is an excellent technique in C to dynamically replace library calls without adjusting the library.
Imagine, you are working on some embedded software. You will have a couple of libraries that you use, but you won't link to it when unit testing. Instead you stub them out. But, a link stub cannot be adjusted on run-time, so how do you handle this? With... "function pointer link stubs".
The idea is simple. You stub out the library and your stub calls a function pointer when its set. When not set, it just returns success.
Here is some example code:
.h (in a library where we cannot change the header)
int aLibraryCallWeCannotChange(int param);
----------------
aLibraryStub.h
extern int (*aLibraryCallWeCannotChangeFp)(int param);
-----------------
aLibraryStub.c
int aLibraryCallWeCannotChange(int param)
{
if (aLibraryCallWeCannotChangeFp) aLibraryCallWeCannotChangeFp(param);
return 0;
}
int (*aLibraryCallWeCannotChangeFp)(int param) = NULL;
-------------------------
TestThatUsesLibrary.cpp
TEST_GROUP(blah)
{
void setup()
{
UT_PTR_SET(aLibraryCallWeCannotChangeFp, dynamicStubOfALibraryCall);
}
}
Now it is easy to place the code of your stub close to your tests and you will never have to change the linker stub code.