aboutsummaryrefslogtreecommitdiff
path: root/src/lib/testsupport
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-06-21 13:57:13 -0400
committerNick Mathewson <nickm@torproject.org>2018-06-21 13:57:13 -0400
commit8918bd90e9ddc135c0519177a07cd7a8c18859ed (patch)
treedec556e3289d121b085b620f14a68dea70786b7d /src/lib/testsupport
parent471418befb9d1b30b17acd1e07a9d3de034db261 (diff)
parent3305ae50442aaed13a9e15c392439c348e6182be (diff)
downloadtor-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.am3
-rw-r--r--src/lib/testsupport/testsupport.h90
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) */
+