summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-11-12 19:52:24 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2013-11-12 19:52:24 +0100
commit0cc9a74f28c357323628fb9a372b9ba071c9a778 (patch)
tree31e6282c79de3d02dd67f48febd2d4ea53a88142
parentdad436ba290143f130412d43f17e19f6ddd314c1 (diff)
build: add automated memleak tests
We now use valgrind to perform automated mem-leak tests on selected test-programs. We also add a separate test_valgrind program which is used to verify that the memcheck actually works. We don't run these tests as part of the normal test-suite, however, we require them for distcheck. Thus, you can avoid using valgrind if you're not about to do dist-releases. Every developer should have it installed, anyway, so it's fine. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r--.gitignore2
-rw-r--r--Makefile.am37
-rw-r--r--test/test_valgrind.c48
3 files changed, 86 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index ed1bfa3..485c182 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
*.la
*.lo
*.log
+*.memlog
*.o
*.swp
*.tar.xz
@@ -25,3 +26,4 @@ m4/
stamp-h1
test-suite.log
test_htable
+test_valgrind
diff --git a/Makefile.am b/Makefile.am
index 2c5388b..311e933 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -40,6 +40,7 @@ pkgconfig_DATA =
TPHONY =
TESTS =
+MEMTESTS =
check_PROGRAMS =
lib_LTLIBRARIES =
noinst_LTLIBRARIES =
@@ -136,12 +137,22 @@ endif
#
# Tests
+# We add a separate "memcheck" target which runs valgrind on all tests in
+# MEMTESTS. Note that we fail if _any_ leak is detected by valgrind. Thus, you
+# need to have valgrind installed and libcheck running properly (without leaks)
+# to make memcheck succeed.
+# A separate memcheck-verify actually runs a faulty test and verifies the
+# valgrind tests work properly.
#
if BUILD_HAVE_CHECK
check_PROGRAMS += \
- test_htable
+ test_htable \
+ test_valgrind
TESTS += \
+ test_htable \
+ test_valgrind
+MEMTESTS += \
test_htable
endif
@@ -161,6 +172,30 @@ test_htable_CPPFLAGS = $(test_cflags)
test_htable_LDADD = $(test_libs)
test_htable_LDFLAGS = $(test_lflags)
+test_valgrind_SOURCES = test/test_valgrind.c $(test_sources)
+test_valgrind_CPPFLAGS = $(test_cflags)
+test_valgrind_LDADD = $(test_libs)
+test_valgrind_LDFLAGS = $(test_lflags)
+
+VALGRIND = CK_FORK=no valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --leak-resolution=high --error-exitcode=1
+
+# verify that test_valgrind actually leaks data
+memcheck-verify: check
+ $(AM_V_GEN)$(VALGRIND) --log-file=/dev/null ./test_valgrind >/dev/null ; test 1 = $$?
+
+TPHONY += memcheck-verify
+
+# run memcheck tests via valgrind
+memcheck: memcheck-verify
+ $(AM_V_GEN)for i in $(MEMTESTS) ; do \
+ $(VALGRIND) --log-file=$(top_builddir)/$$i.memlog \
+ $(top_builddir)/$$i >/dev/null || (echo "memcheck failed on: $$i" ; exit 1) ; \
+ done
+
+TPHONY += memcheck memcheck-verify
+
+distcheck-hook: memcheck
+
#
# Phony targets
#
diff --git a/test/test_valgrind.c b/test/test_valgrind.c
new file mode 100644
index 0000000..18156b9
--- /dev/null
+++ b/test/test_valgrind.c
@@ -0,0 +1,48 @@
+/*
+ * TSM - Valgrind Verification
+ *
+ * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* Dummy which just leaks memory. Used to verify valgrind memcheck. */
+
+#include "test_common.h"
+
+START_TEST(test_valgrind)
+{
+ void *p;
+
+ p = malloc(0x100);
+ ck_assert(!!p);
+}
+END_TEST
+
+TEST_DEFINE_CASE(misc)
+ TEST(test_valgrind)
+TEST_END_CASE
+
+TEST_DEFINE(
+ TEST_SUITE(valgrind,
+ TEST_CASE(misc),
+ TEST_END
+ )
+)