TESTS = \
check_check_export \
check_check \
+ check_mem_leaks \
test_output.sh \
test_check_nofork.sh \
test_xml_output.sh \
check_stress \
check_thread_stress \
check_nofork \
+ check_mem_leaks \
ex_output \
ex_xml_output \
ex_log_output \
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 = \
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
--- /dev/null
+/**
+ * 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;
+}
+