unit-tests: Implement registered functions without __builtin_apply()
authorTobias Brunner <tobias@strongswan.org>
Sat, 1 Mar 2014 07:35:59 +0000 (08:35 +0100)
committerTobias Brunner <tobias@strongswan.org>
Thu, 20 Mar 2014 14:37:44 +0000 (15:37 +0100)
This makes the tests work with clang, which does not implement said
builtin.

src/libstrongswan/utils/test.h

index 3888794..51362a1 100644 (file)
@@ -65,32 +65,32 @@ static void testable_function_unregister_##fn() \
 /**
  * Import a registered function so that it can be called from tests.
  *
- * The function name is prefixed with TEST_ to avoid clashes when building
- * monolithically.
- *
- * @note We allocate an arbitrary amount of stack space, hopefully enough for
- * all arguments.
- *
  * @param ns           namespace of the function
  * @param name         name of the function
  * @param ret          return type of the function
  * @param ...          arguments of the function
  */
 #define IMPORT_FUNCTION_FOR_TESTS(ns, name, ret, ...) \
-static ret TEST_##name(__VA_ARGS__) \
-{ \
-       void (*fn)() = NULL; \
-       if (testable_functions) \
+static ret (*TEST_##ns##name)(__VA_ARGS__);
+
+/**
+ * Call a registered function from tests.
+ *
+ * @param ns           namespace of the function
+ * @param name         name of the function
+ * @param ...          arguments for the function
+ */
+#define TEST_FUNCTION(ns, name, ...) \
+({ \
+       if (!TEST_##ns##name && testable_functions) \
        { \
-               fn = testable_functions->get(testable_functions, #ns "/" #name); \
+               TEST_##ns##name = testable_functions->get(testable_functions, #ns "/" #name); \
        } \
-       if (fn) \
+       if (!TEST_##ns##name) \
        { \
-               void *args = __builtin_apply_args(); \
-               __builtin_return(__builtin_apply(fn, args, 16*sizeof(void*))); \
+               test_fail_msg(__FILE__, __LINE__, "function " #name " (" #ns ") not found"); \
        } \
-       test_fail_msg(__FILE__, __LINE__, "function " #name " (" #ns ") not found"); \
-       __builtin_return(NULL); \
-}
+       TEST_##ns##name(__VA_ARGS__); \
+})
 
 #endif /** TEST_H_ @}*/