tor  0.4.0.1-alpha
Macros
testsupport.h File Reference

Go to the source code of this file.

Macros

#define STATIC   static
 
#define EXTERN(type, name)
 
#define MOCK_DECL(rv, funcname, arglist)   rv funcname arglist
 
#define MOCK_DECL_ATTR(rv, funcname, arglist, attr)   rv funcname arglist attr
 
#define MOCK_IMPL(rv, funcname, arglist)   rv funcname arglist
 

Detailed Description

Macros to implement mocking and selective exposure for the test code.

Each Tor source file is built twice: once with TOR_UNIT_TESTS defined, and once with it undefined. The only difference between these configurations should be that when building for the tests, more functions are exposed as non-static, and a number of functions are declared as mockable.

Definition in file testsupport.h.

Macro Definition Documentation

◆ MOCK_DECL

#define MOCK_DECL (   rv,
  funcname,
  arglist 
)    rv funcname arglist

Quick and dirty macros to implement test mocking.

To use them, suppose that you have a function you'd like to mock with the signature "void writebuf(size_t n, char *buf)". You can then declare the function as:

MOCK_DECL(void, writebuf, (size_t n, char *buf));

and implement it as:

MOCK_IMPL(void,
writebuf,(size_t n, char *buf))
{
     ...
}

For the non-testing build, this will expand simply into:

void writebuf(size_t n, char *buf);
void
writebuf(size_t n, char *buf)
{
    ...
}

But for the testing case, it will expand into:

void writebuf__real(size_t n, char *buf);
extern void (*writebuf)(size_t n, char *buf);

void (*writebuf)(size_t n, char *buf) = writebuf__real;
void
writebuf__real(size_t n, char *buf)
{
    ...
}

This is not a great mocking system! It is deliberately "the simplest thing that could work", and pays for its simplicity in its lack of features, and in its uglification of the Tor code. Replacing it with something clever would be a fine thing.

Definition at line 94 of file testsupport.h.