]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
tests/shell: fix handling failures with VALGRIND=y
authorThomas Haller <thaller@redhat.com>
Thu, 7 Sep 2023 22:07:16 +0000 (00:07 +0200)
committerFlorian Westphal <fw@strlen.de>
Fri, 8 Sep 2023 09:50:41 +0000 (11:50 +0200)
With VALGRIND=y, on memleaks the tests did not fail. Fix that by passing
"--error-exitcode=122" to valgrind.

But just returning 122 from $NFT command may not correctly fail the test.
Instead, ensure to write a "rc-failed-valrind" file, which is picked up
by "test-wrapper.sh" to properly handle the valgrind failure (and fail
with error code 122 itself).

Also, accept NFT_TEST_VALGRIND_OPTS variable to a pass additional
arguments to valgrind. For example a "--suppressions" file.

Also show the special error code [VALGRIND] in "run-test.sh".

Signed-off-by: Thomas Haller <thaller@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
tests/shell/helpers/nft-valgrind-wrapper.sh
tests/shell/helpers/test-wrapper.sh
tests/shell/run-tests.sh

index 9da50d4d9d1d0efa716ab5068627ac40f3fab444..ad8cc74bc781a321b9353d2324aed0ed1a186ea4 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/bash -e
 
-SUFFIX="$(date '+%Y%m%d-%H%M%S.%6N')"
+SUFFIX="$(date "+%Y%m%d-%H%M%S.%6N.$$")"
 
 rc=0
 libtool \
@@ -10,8 +10,21 @@ libtool \
                --trace-children=yes \
                --leak-check=full \
                --show-leak-kinds=all \
+               --num-callers=100 \
+               --error-exitcode=122 \
+               $NFT_TEST_VALGRIND_OPTS \
                "$NFT_REAL" \
                "$@" \
        || rc=$?
 
+if [ "$rc" -eq 122 ] ; then
+       shopt -s nullglob
+       FILES=( "$NFT_TEST_TESTTMPDIR/valgrind.$SUFFIX."*".log" )
+       shopt -u nullglob
+       (
+               printf '%s\n' "args: $*"
+               printf '%s\n' "${FILES[*]}"
+       ) >> "$NFT_TEST_TESTTMPDIR/rc-failed-valgrind"
+fi
+
 exit $rc
index f8b27b1e92913cb187138b0075074062cee4672a..405e70c8675163d60bdbbf9aa6c32795c8600e61 100755 (executable)
@@ -78,13 +78,18 @@ if [ "$rc_dump" -ne 0 ] ; then
        echo "$DUMPFILE" > "$NFT_TEST_TESTTMPDIR/rc-failed-dump"
 fi
 
+rc_valgrind=0
+[ -f "$NFT_TEST_TESTTMPDIR/rc-failed-valgrind" ] && rc_valgrind=122
+
 rc_tainted=0
 if [ "$tainted_before" != "$tainted_after" ] ; then
        echo "$tainted_after" > "$NFT_TEST_TESTTMPDIR/rc-failed-tainted"
        rc_tainted=123
 fi
 
-if [ "$rc_tainted" -ne 0 ] ; then
+if [ "$rc_valgrind" -ne 0 ] ; then
+       rc_exit="$rc_valgrind"
+elif [ "$rc_tainted" -ne 0 ] ; then
        rc_exit="$rc_tainted"
 elif [ "$rc_test" -ge 118 -a "$rc_test" -le 124 ] ; then
        # Special exit codes are reserved. Coerce them.
@@ -101,9 +106,9 @@ fi
 # We always write the real exit code of the test ($rc_test) to one of the files
 # rc-{ok,skipped,failed}, depending on which it is.
 #
-# Note that there might be other rc-failed-{dump,tainted} files with additional
-# errors. Note that if such files exist, the overall state will always be
-# failed too (and an "rc-failed" file exists).
+# Note that there might be other rc-failed-{dump,tainted,valgrind} files with
+# additional errors. Note that if such files exist, the overall state will
+# always be failed too (and an "rc-failed" file exists).
 #
 # On failure, we also write the combined "$rc_exit" code from "test-wrapper.sh"
 # to "rc-failed-exit" file.
index c8688587bbc4f89e2fdce78e7f83d9da5963cfb9..ab91fd4d905391768114e238ff8cb09fcb3a5e40 100755 (executable)
@@ -527,7 +527,9 @@ print_test_result() {
        else
                ((failed++))
                result_msg_level="W"
-               if [ "$rc_got" -eq 123 ] ; then
+               if [ "$rc_got" -eq 122 ] ; then
+                       result_msg_status="VALGRIND"
+               elif [ "$rc_got" -eq 123 ] ; then
                        result_msg_status="TAINTED"
                elif [ "$rc_got" -eq 124 ] ; then
                        result_msg_status="DUMP FAIL"