]> granicus.if.org Git - check/commitdiff
check_mem_leaks: add new unit test for use against valgrind
authorbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Wed, 18 Dec 2013 21:37:09 +0000 (21:37 +0000)
committerbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Wed, 18 Dec 2013 21:37:09 +0000 (21:37 +0000)
The purpose of this test is to be used by valgrind to check for
memory leaks. Each public API that check exports is used at
least once. Tests which use non-public API, or leak intentionally,
are not included here.

The test should pass when run, and is added to the list of tests to
run with "make check".

Actually using valgrind to check for memory leaks is outside of its
running with "make check". One still would need to manually run
valgrind.

git-svn-id: svn+ssh://svn.code.sf.net/p/check/code/trunk@901 64e312b2-a51f-0410-8e61-82d0ca0eb02a

tests/Makefile.am
tests/check_mem_leaks.c [new file with mode: 0644]

index ebe18ad16c3054f74b37f7122fc3ba3d17909a5c..f8ad3673b7068c70a464df9830620aa90b115f86 100644 (file)
@@ -3,6 +3,7 @@
 TESTS = \
        check_check_export      \
        check_check             \
+       check_mem_leaks         \
        test_output.sh          \
        test_check_nofork.sh    \
        test_xml_output.sh      \
@@ -23,6 +24,7 @@ noinst_PROGRAMS =             \
        check_stress            \
        check_thread_stress     \
        check_nofork            \
+       check_mem_leaks         \
        ex_output               \
        ex_xml_output           \
        ex_log_output           \
@@ -33,6 +35,7 @@ EXTRA_DIST = test_output.sh test_check_nofork.sh test_log_output.sh test_vars.in
 if NO_TIMEOUT_TESTS
 check_check_CFLAGS = -DTIMEOUT_TESTS_ENABLED=0
 check_check_export_CFLAGS = -DTIMEOUT_TESTS_ENABLED=0
+check_mem_leaks_CFLAGS = -DTIMEOUT_TESTS_ENABLED=0
 endif
 
 check_check_export_SOURCES = \
@@ -61,6 +64,19 @@ check_check_SOURCES = \
        check_check_main.c
 check_check_LDADD = $(top_builddir)/src/libcheckinternal.la $(top_builddir)/lib/libcompat.la
 
+check_mem_leaks_SOURCES =      \
+       check_mem_leaks.c               \
+       check_check_log.c               \
+       check_check_limit.c             \
+       check_check_fixture.c   \
+       check_check_fork.c              \
+       check_check_exit.c              \
+       check_check_selective.c \
+       check_check_sub.c               \
+       check_check_master.c
+
+check_mem_leaks_LDADD = $(top_builddir)/src/libcheckinternal.la $(top_builddir)/lib/libcompat.la
+
 check_stress_SOURCES = check_stress.c
 check_stress_LDADD = $(top_builddir)/src/libcheck.la $(top_builddir)/lib/libcompat.la
 
diff --git a/tests/check_mem_leaks.c b/tests/check_mem_leaks.c
new file mode 100644 (file)
index 0000000..f651f39
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * The purpose of this test is to be used by valgrind to check for
+ * memory leaks. Each public API that check exports is used at
+ * least once. Tests which use non-public API, or leak intentionally,
+ * are not included here.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <check.h>
+#include "config.h"
+
+int main (int argc, char **argv)
+{
+    int n;
+    SRunner *sr;
+
+    /*
+     * First, the sub suite is run. This suite has failures which
+     * are intentional, as the output of the failures is checked
+     * in check_check_master.c. However, here we do not check if
+     * the failures are expected. Instead, we just want to run
+     * them and see if they leak. Because of this, the result
+     * of the suite is not checked.
+     */
+    sr = srunner_create(make_sub_suite());
+    /*
+     * Enable all logging types, just in case one of them
+     * leaks memory.
+     */
+    srunner_set_log (sr, "test_mem_leak.log");
+    srunner_set_xml (sr, "test_mem_leak.xml");
+    srunner_set_tap (sr, "test_mem_leak.tap");
+    srunner_run_all(sr, CK_NORMAL);
+    srunner_free(sr);
+
+    /* Now, the other suite is run. These are all expected to pass. */
+
+    /* The following setup is necessary for the fork suite */
+    fork_setup();
+
+    sr = srunner_create (make_log_suite());
+    srunner_add_suite(sr, make_limit_suite());
+    srunner_add_suite(sr, make_fork_suite());
+
+#if defined(HAVE_FORK)
+    srunner_add_suite(sr, make_exit_suite());
+#endif
+
+    srunner_add_suite(sr, make_selective_suite());
+
+    /*
+     * Enable all logging types, just in case one of them
+     * leaks memory.
+     */
+    srunner_set_log (sr, "test_mem_leak.log");
+    srunner_set_xml (sr, "test_mem_leak.xml");
+    srunner_set_tap (sr, "test_mem_leak.tap");
+
+    srunner_run_all(sr, CK_NORMAL);
+
+    /* Cleanup from the fork suite setup */
+    fork_teardown();
+
+    n = srunner_ntests_failed(sr);
+    srunner_free(sr);
+    return (n == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+