diff options
Diffstat (limited to 'cpp/src/tests/run_test')
| -rwxr-xr-x | cpp/src/tests/run_test | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/cpp/src/tests/run_test b/cpp/src/tests/run_test new file mode 100755 index 0000000000..ef608e55ca --- /dev/null +++ b/cpp/src/tests/run_test @@ -0,0 +1,60 @@ +#!/bin/sh +# +# Run a test executable. Output nothing if test passes, +# show the output if it fails. Leave output in <test>.log for +# examination. +# +# If $VALGRIND if is set run under valgrind. If there are +# valgrind erros show valgrind output, also leave it in +# <test>.valgrind for examination. +# + +vg_failed() { + cat $VG_LOG 1>&2 + echo $1 1>&2 + exit 1 +} + +vg_check() +{ + test -f $VG_LOG || vg_failed Valgrind log file $VG_LOG missing. + # Ensure there is an ERROR SUMMARY line. + grep -E '^==[0-9]+== ERROR SUMMARY:' $VG_LOG > /dev/null || \ + vg_failed "No valgrind ERROR SUMMARY line in $$vg_failed." + # Ensure that the number of errors is 0. + grep -E '^==[0-9]+== ERROR SUMMARY: [^0] ' $VG_LOG > /dev/null && \ + vg_failed "Valgrind reported errors in $vg_out; see above." + # Check for leaks. + grep -E '^==[0-9]+== +.* lost: [^0]' $VG_LOG && \ + vg_failed "Found memory leaks (see log file, $VG_LOG); see above." + true +} + +# Export variables from makefile. +export VALGRIND srcdir + +VG_LOG="$1.vglog" +TEST_LOG="$1.log" +rm -f $VG_LOG $TEST_LOG + +if grep -l "^# Generated by .*libtool" "$1" >/dev/null 2>&1; then + # This is a libtool "executable". Valgrind it if VALGRIND specified. + test -n "$VALGRIND" && VALGRIND="$VALGRIND --log-file-exactly=$VG_LOG --" + # Hide output unless there's an error. + libtool --mode=execute $VALGRIND "$@" >$TEST_LOG 2>&1 || { + ERROR=$? + cat $TEST_LOG + } + test -n "$VALGRIND" && vg_check +else + # This is a non-libtool shell script, just execute it. + "$@" +fi + +if test -z "$ERROR"; then + # Clean up logs if there was no error. + rm -f $VG_LOG $TEST_LOG + exit 0 +else + exit $ERROR +fi |
