We test the following cases:
1 - Are return values set with fake.return_val saved in history?
2 - Are return values of a RETURN_SEQ saved in history?
3 - Are return values return by a CUSTOM_FAKE_SEQ saved in history?
On some contexts, we need to call one function to free some resource
allocated by another function based on the return value of the second
function. For example, every time pthread_mutex_trylock suceeds, you
need to unlock it, and only in those cases. While this could be done
with the return value sequence, it does not really work for a sequence
of custom fakes. Now we save the return values in the member
return_val_history, which works pretty much like arg_history, only
for the return values.
The fff.h file now supports setting a sequence of custom fakes for
non-variadic functions using the SET_CUSTOM_FAKE_SEQ macro, with
works much like the SET_RETURN_SEQ macro.
Using a function that sets a value on a variable via a char pointer, we
test the following:
1 - Does the custom fakes are called in the expected order?
2 - When the sequence length is exhausted, do we only call the last
custom fake in the sequence from then on?
This makes it possible to set a sequence of custom fakes for a function
using the macro SET_CUSTOM_FAKE_SEQ. Very useful for functions with out
parameters. Now we don't have to count the number of calls to implement
different behaviours on custom fakes.
Custom fake support for variadic functions was limited. The variable
parameters were not passed to the custom fake.
Now a va_list is passed to the custom fake, so it is possible to access
all the arguments. For instance, a custom fake for fprintf() could call
the real fprintf() like this:
int fprintf_custom(FILE *stream, const char *format, va_list ap) {
if (fprintf0_fake.return_val < 0) // should we fail?
return fprintf0_fake.return_val;
return vfprintf(stream, format, ap);
}