From 8699473b65011b50766d536222329eeb3953f1cc Mon Sep 17 00:00:00 2001 From: brarcher Date: Wed, 18 Dec 2013 21:37:09 +0000 Subject: [PATCH] check_mem_leaks: add new unit test for use against valgrind 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 | 16 ++++++++++ tests/check_mem_leaks.c | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 tests/check_mem_leaks.c diff --git a/tests/Makefile.am b/tests/Makefile.am index ebe18ad..f8ad367 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 0000000..f651f39 --- /dev/null +++ b/tests/check_mem_leaks.c @@ -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 +#include +#include +#include +#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; +} + -- 2.40.0