diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-06-21 13:57:13 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-06-21 13:57:13 -0400 |
commit | 8918bd90e9ddc135c0519177a07cd7a8c18859ed (patch) | |
tree | dec556e3289d121b085b620f14a68dea70786b7d /src/lib/testsupport | |
parent | 471418befb9d1b30b17acd1e07a9d3de034db261 (diff) | |
parent | 3305ae50442aaed13a9e15c392439c348e6182be (diff) | |
download | tor-8918bd90e9ddc135c0519177a07cd7a8c18859ed.tar.gz tor-8918bd90e9ddc135c0519177a07cd7a8c18859ed.zip |
Merge branch 'extract_easy_common_libs'
Diffstat (limited to 'src/lib/testsupport')
-rw-r--r-- | src/lib/testsupport/include.am | 3 | ||||
-rw-r--r-- | src/lib/testsupport/testsupport.h | 90 |
2 files changed, 93 insertions, 0 deletions
diff --git a/src/lib/testsupport/include.am b/src/lib/testsupport/include.am new file mode 100644 index 0000000000..b2aa620985 --- /dev/null +++ b/src/lib/testsupport/include.am @@ -0,0 +1,3 @@ + +noinst_HEADERS += \ + src/lib/testsupport/testsupport.h diff --git a/src/lib/testsupport/testsupport.h b/src/lib/testsupport/testsupport.h new file mode 100644 index 0000000000..9a55d306fc --- /dev/null +++ b/src/lib/testsupport/testsupport.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2013-2018, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TESTSUPPORT_H +#define TOR_TESTSUPPORT_H + +#ifdef TOR_UNIT_TESTS +#define STATIC +#define EXTERN(type, name) extern type name; +#else +#define STATIC static +#define EXTERN(type, name) +#endif /* defined(TOR_UNIT_TESTS) */ + +/** 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. + * + * @{ */ +#ifdef TOR_UNIT_TESTS +#define MOCK_DECL(rv, funcname, arglist) \ + rv funcname ##__real arglist; \ + extern rv(*funcname) arglist +#define MOCK_IMPL(rv, funcname, arglist) \ + rv(*funcname) arglist = funcname ##__real; \ + rv funcname ##__real arglist +#define MOCK_DECL_ATTR(rv, funcname, arglist, attr) \ + rv funcname ##__real arglist attr; \ + extern rv(*funcname) arglist +#define MOCK_IMPL(rv, funcname, arglist) \ + rv(*funcname) arglist = funcname ##__real; \ + rv funcname ##__real arglist +#define MOCK(func, replacement) \ + do { \ + (func) = (replacement); \ + } while (0) +#define UNMOCK(func) \ + do { \ + func = func ##__real; \ + } while (0) +#else /* !(defined(TOR_UNIT_TESTS)) */ +#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 +#endif /* defined(TOR_UNIT_TESTS) */ +/** @} */ + +#endif /* !defined(TOR_TESTSUPPORT_H) */ + |