]> eyrie.org Git - kerberos/krb5-strength.git/commitdiff
Rework valgrind testing
authorRuss Allbery <eagle@eyrie.org>
Sat, 16 May 2020 23:40:36 +0000 (16:40 -0700)
committerRuss Allbery <eagle@eyrie.org>
Sat, 16 May 2020 23:40:36 +0000 (16:40 -0700)
Rework the check-valgrind target to use the new C TAP Harness valgrind
support and automatically check the valgrind log files for errors at
the end of the test suite.

Makefile.am
NEWS
configure.ac
tests/TESTS
tests/tools/wordlist-cdb-t
tests/valgrind/logs-t [new file with mode: 0755]

index 8b3ab501aee783ec458e85e6e8e823f3cd2ae8b1..c615e923baab25a6382d5cb3c943cc0d525c14d8 100644 (file)
@@ -203,21 +203,20 @@ check-cppcheck:
                --suppressions-list=tests/data/cppcheck.supp            \
                --enable=warning,performance,portability,style
 
-# Used by maintainers to run the main test suite under valgrind.  Suppress
-# the xmalloc and pod-spelling tests because the former won't work properly
-# under valgrind (due to increased memory usage) and the latter is pointless
-# to run under valgrind.  Don't try to trace several of the tests that are
-# written in Perl or shell and test Perl programs.
+# The full path to valgrind and its options, used when doing valgrind
+# testing.
+VALGRIND_COMMAND = $(PATH_VALGRIND) --leak-check=full                  \
+       --trace-children=yes --trace-children-skip=/bin/sh              \
+       --suppressions=$(abs_top_srcdir)/tests/data/valgrind.supp       \
+       --log-file=$(abs_top_builddir)/tests/tmp/valgrind/log.%p
+
+# Used by maintainers to run the main test suite under valgrind.
 check-valgrind: $(check_PROGRAMS) tests/data/dictionary.pwd
-       rm -rf $(abs_top_builddir)/tmp-valgrind
-       mkdir $(abs_top_builddir)/tmp-valgrind
-       env valgrind --leak-check=full          \
-           --show-reachable=yes --trace-children=yes                   \
-           --log-file=$(abs_top_builddir)/tmp-valgrind/log.%p          \
-           --suppressions=$(abs_top_srcdir)/tests/data/valgrind.supp   \
-           --trace-children-skip="/bin/sh,*/cat,*/diff,*/expr,*/grep,*/mkdir,*/rm,*/rmdir,*/sed,*/sleep,*/true,*/wc,*/docs/*-t,*/perl/*-t,*/data/make-krb5-conf,*/tools/heimdal-history-t,*/tools/wordlist*-t" \
-           tests/runtests -l '$(abs_top_srcdir)/tests/TESTS'
-
+       rm -rf $(abs_top_builddir)/tests/tmp
+       mkdir $(abs_top_builddir)/tests/tmp
+       mkdir $(abs_top_builddir)/tests/tmp/valgrind
+       C_TAP_VALGRIND="$(VALGRIND_COMMAND)" tests/runtests \
+           -l '$(abs_top_srcdir)/tests/TESTS'
 
 # Used by maintainers to reformat all source code using clang-format and
 # excluding some files.
diff --git a/NEWS b/NEWS
index 3c24e4ce1cc072ed05497082851fd1efea7fe57a..c93ec2c37e8c759ed98ba7dfbe2302ac53aeea01 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,10 @@ krb5-strength 3.2 (unreleased)
     copies of passwords before freeing memory.  This reduces the lifetime
     of passwords in memory.
 
+    Rework the check-valgrind target to use the new C TAP Harness valgrind
+    support and automatically check the valgrind log files for errors at
+    the end of the test suite.
+
     Add SPDX-License-Identifier headers to all substantial source files
     other than those in the bundled version of CrackLib.
 
index 49dfc84e4489331ef0b33067ef7ead49575a2402..955bc57bb0d9c2ee506b82fea2ab786f6408668c 100644 (file)
@@ -32,6 +32,9 @@ AC_PROG_INSTALL
 AM_DISABLE_STATIC
 LT_INIT
 
+dnl Only used for the test suite.
+AC_PATH_PROG([PATH_VALGRIND], [valgrind])
+
 dnl External libraries.
 RRA_LIB_CDB_OPTIONAL
 RRA_LIB_CRACKLIB
index 6d7410986c70b136a43fc9e6f6b9f98ae664d492..a596aa97015a7c2190263a069f80b800be5e9eca 100644 (file)
 docs/pod
 docs/pod-spelling
 docs/spdx-license
-plugin/heimdal
-plugin/mit
+plugin/heimdal          valgrind
+plugin/mit              valgrind
 perl/critic
 perl/minimum-version
 perl/strict
-portable/asprintf
-portable/mkstemp
-portable/snprintf
-portable/strndup
+portable/asprintf       valgrind
+portable/mkstemp        valgrind
+portable/snprintf       valgrind
+portable/strndup        valgrind
 style/obsolete-strings
 tools/heimdal-history
 tools/heimdal-strength
 tools/wordlist
 tools/wordlist-cdb
 tools/wordlist-sqlite
-util/messages
-util/messages-krb5
+util/messages           valgrind
+util/messages-krb5      valgrind
 util/xmalloc
+valgrind/logs
index 8ae42652f50cf063a8997d9b0d5fa8d59ed6a39c..9c98a2a9f2302c056249202060988c4796226dd4 100755 (executable)
@@ -87,4 +87,4 @@ ok_program 'Database does not contain password' 100 '' \
 # Clean up.
 rm -f "$tmpdir/wordlist.cdb"
 rm -f "$tmpdir/wordlist"
-rmdir "$tmpdir" 2>/dev/null
+rmdir "$tmpdir" 2>/dev/null || true
diff --git a/tests/valgrind/logs-t b/tests/valgrind/logs-t
new file mode 100755 (executable)
index 0000000..1f65902
--- /dev/null
@@ -0,0 +1,83 @@
+#!/usr/bin/perl
+#
+# Check for errors in valgrind logs.
+#
+# The canonical version of this file is maintained in the rra-c-util package,
+# which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
+#
+# Copyright 2018-2019 Russ Allbery <eagle@eyrie.org>
+#
+# 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.
+#
+# SPDX-License-Identifier: MIT
+
+use 5.008;
+use strict;
+use warnings;
+
+use lib "$ENV{C_TAP_SOURCE}/tap/perl";
+
+use Test::RRA;
+use Test::RRA::Automake qw(automake_setup);
+
+use File::Spec;
+use Test::More;
+
+# Skip this test if C_TAP_VALGRIND was not set.
+if (!exists $ENV{C_TAP_VALGRIND}) {
+    plan skip_all => 'Not testing under valgrind';
+}
+
+# Set up Automake testing.
+automake_setup({ chdir_build => 1 });
+
+# Gather the list of valgrind logs (and skip this test if there are none).
+opendir(my $logdir, File::Spec->catfile('tests', 'tmp', 'valgrind'))
+  or plan skip_all => 'No valgrind logs in tests/tmp/valgrind';
+my @logs = grep { m{ \A log [.] }xms } readdir $logdir;
+closedir($logdir) or BAIL_OUT("cannot close directory: $!");
+
+# Check each log file.
+plan tests => scalar(@logs);
+for my $file (@logs) {
+    my $path = File::Spec->catfile('tests', 'tmp', 'valgrind', $file);
+    open(my $log, '<', $path) or BAIL_OUT("cannot open $path: $!");
+    my $okay = 1;
+    my @log;
+    while (defined(my $line = <$log>)) {
+        push(@log, $line);
+        if ($line =~ m{ ERROR [ ] SUMMARY: [ ] (\d+) [ ] errors }xms) {
+            $okay = ($1 == 0);
+        }
+    }
+    close($log) or BAIL_OUT("cannot close $path: $!");
+    if ($okay) {
+        unlink($path);
+    } else {
+        for my $line (@log) {
+            print '# ', $line
+              or BAIL_OUT("cannot print to standard output: $!");
+        }
+    }
+    ok($okay, $path);
+}
+
+# Remove tests/tmp/valgrind if it's now empty.
+rmdir(File::Spec->catfile('tests', 'tmp', 'valgrind'));
+rmdir(File::Spec->catfile('tests', 'tmp'));