aboutsummaryrefslogtreecommitdiffstats
path: root/test/testutil.c
diff options
context:
space:
mode:
authorEmilia Kasper <emilia@openssl.org>2016-11-07 16:53:15 +0100
committerEmilia Kasper <emilia@openssl.org>2016-11-09 16:07:16 +0100
commite364c3b24e38bd60d40487e0a532261348a9bb10 (patch)
tree82e621604899af53aebd34ced7d7dbc381678d84 /test/testutil.c
parent7380737d77e89edd17651b04e439223a47ea833e (diff)
downloadopenssl-e364c3b24e38bd60d40487e0a532261348a9bb10.tar.gz
Add main() test methods to reduce test boilerplate.
Simple tests only need to implement register_tests(). Tests that need a custom main() should implement test_main(). This will be wrapped in a main() that performs common setup/teardown (currently crypto-mdebug). Note that for normal development, enable-asan is usually sufficient for detecting leaks, and more versatile. enable-crypto-mdebug is stricter as it will also insist that all static variables be freed. This is useful for debugging library init/deinit; however, it also means that test_main() must free everything it allocates. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'test/testutil.c')
-rw-r--r--test/testutil.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/test/testutil.c b/test/testutil.c
index f1cad6450f..aab4513671 100644
--- a/test/testutil.c
+++ b/test/testutil.c
@@ -15,6 +15,8 @@
#include <string.h>
#include "e_os.h"
+#include <openssl/opensslconf.h>
+#include <openssl/crypto.h>
#include <openssl/err.h>
/*
@@ -57,6 +59,42 @@ void add_all_tests(const char *test_case_name, int(*test_fn)(int idx),
num_test_cases += num;
}
+#ifndef OPENSSL_NO_CRYPTO_MDEBUG
+static int should_report_leaks()
+{
+ /*
+ * When compiled with enable-crypto-mdebug, OPENSSL_DEBUG_MEMORY=0
+ * can be used to disable leak checking at runtime.
+ * Note this only works when running the test binary manually;
+ * the test harness always enables OPENSSL_DEBUG_MEMORY.
+ */
+ char *mem_debug_env = getenv("OPENSSL_DEBUG_MEMORY");
+
+ return mem_debug_env == NULL
+ || (strcmp(mem_debug_env, "0") && strcmp(mem_debug_env, ""));
+}
+#endif
+
+
+void setup_test()
+{
+#ifndef OPENSSL_NO_CRYPTO_MDEBUG
+ if (should_report_leaks()) {
+ CRYPTO_set_mem_debug(1);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
+ }
+#endif
+}
+
+int finish_test(int ret)
+{
+#ifndef OPENSSL_NO_CRYPTO_MDEBUG
+ if (should_report_leaks() && CRYPTO_mem_leaks_fp(stderr) <= 0)
+ return EXIT_FAILURE;
+#endif
+ return ret;
+}
+
static void finalize(int success)
{
if (success)