notmuch/test/notmuch-test
Daniel Kahn Gillmor 73cebe6e72 test: report summary even when aborting
In certain cases of test suite failure, the summary report was not
being printed.  In particular, any failure on the parallel test suite,
and any aborted test in the serialized test suite would end up hiding
the summary.

It's better to always show the summary where we can (while preserving
the return code).  If we do abort due to this high-level failure,
though, we should also announce to the user that we're doing so as
close to the end of the process as possible, to make it easier to find
the problem.

Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
2019-05-26 18:55:06 -03:00

94 lines
2.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# Run tests
#
# Copyright (c) 2005 Junio C Hamano
# Copyright (c) 2010 Notmuch Developers
#
# Adapted from a Makefile to a shell script by Carl Worth (2010)
if [ ${BASH_VERSINFO[0]} -lt 4 ]; then
echo "Error: The notmuch test suite requires a bash version >= 4.0"
echo "due to use of associative arrays within the test suite."
echo "Please try again with a newer bash (or help us fix the"
echo "test suite to be more portable). Thanks."
exit 1
fi
# Ensure NOTMUCH_SRCDIR and NOTMUCH_BUILDDIR are set.
. $(dirname "$0")/export-dirs.sh || exit 1
TESTS=
for test in $NOTMUCH_TESTS; do
TESTS="$TESTS $NOTMUCH_SRCDIR/test/$test"
done
if [[ -z "$TESTS" ]]; then
TESTS="$NOTMUCH_SRCDIR/test/T[0-9][0-9][0-9]-*.sh"
fi
# Clean up any results from a previous run
rm -rf $NOTMUCH_BUILDDIR/test/test-results
# Test for timeout utility
if command -v timeout >/dev/null; then
TEST_TIMEOUT=${NOTMUCH_TEST_TIMEOUT:-2m}
if [ "$TEST_TIMEOUT" = 0 ]; then
TEST_TIMEOUT_CMD=""
echo "INFO: timeout disabled"
else
TEST_TIMEOUT_CMD="timeout $TEST_TIMEOUT"
echo "INFO: using $TEST_TIMEOUT timeout for tests"
fi
else
TEST_TIMEOUT_CMD=""
fi
trap 'e=$?; kill $!; exit $e' HUP INT TERM
META_FAILURE=
# Run the tests
if test -z "$NOTMUCH_TEST_SERIALIZE" && command -v parallel >/dev/null ; then
test -t 1 && export COLORS_WITHOUT_TTY=t || :
if parallel -h | grep -q GNU ; then
echo "INFO: running tests with GNU parallel"
printf '%s\n' $TESTS | $TEST_TIMEOUT_CMD parallel
else
echo "INFO: running tests with moreutils parallel"
$TEST_TIMEOUT_CMD parallel -- $TESTS
fi
RES=$?
if [[ $RES != 0 ]]; then
META_FAILURE="parallel test suite returned error code $RES"
fi
else
for test in $TESTS; do
$TEST_TIMEOUT_CMD $test "$@" &
wait $!
# If the test failed without producing results, then it aborted,
# so we should abort, too.
RES=$?
testname=$(basename $test .sh)
if [[ $RES != 0 && ! -e "$NOTMUCH_BUILDDIR/test/test-results/$testname" ]]; then
META_FAILURE="Aborting on $testname (returned $RES)"
break
fi
done
fi
trap - HUP INT TERM
# Report results
echo
$NOTMUCH_SRCDIR/test/aggregate-results.sh $NOTMUCH_BUILDDIR/test/test-results/*
ev=$?
if [ -n "$META_FAILURE" ]; then
printf 'ERROR: %s\n' "$META_FAILURE"
if [ $ev = 0 ]; then
ev=$RES
fi
fi
# Clean up
rm -rf $NOTMUCH_BUILDDIR/test/test-results
exit $ev