When some command in between test_begin_subtest and test_expect_equal
fails, the test suite does not detect it unless the failure leads to
difference in the strings compared by test_expect_equal.

This patch sets shell -e option which switches on the detection of
failed commands (thise with non-zero exit status). If some command fails
the test script exits with exit code of 1 and prints the failed command.
It might be better to print the line number of the failed command but it
seems that inside traps, the BASH_LINENO variable does not contain the
wanted information.
---
 test/raw         |    2 +-
 test/test-lib.sh |    5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/test/raw b/test/raw
index 4ed237c..87e18b1 100755
--- a/test/raw
+++ b/test/raw
@@ -10,7 +10,7 @@ output=$(NOTMUCH_NEW)
 test_expect_equal "$output" "Added 2 new messages to the database."

 test_begin_subtest "Attempt to show multiple raw messages"
-output=$(notmuch show --format=raw "*" 2>&1)
+output=$(notmuch show --format=raw "*" 2>&1 || :)
 test_expect_equal "$output" "Error: search term did not match precisely one 
message."

 test_begin_subtest "Show a raw message"
diff --git a/test/test-lib.sh b/test/test-lib.sh
index 04a4c14..1ad0da6 100644
--- a/test/test-lib.sh
+++ b/test/test-lib.sh
@@ -178,7 +178,7 @@ die () {
        then
                exit $code
        else
-               echo >&5 "FATAL: Unexpected exit with code $code"
+               echo >&5 "FATAL: Unexpected exit with code $code: $BASH_COMMAND"
                exit 1
        fi
 }
@@ -407,6 +407,7 @@ test_begin_subtest ()
     if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
     exec 6>&1 7>&2 >&3 2>&4
     inside_subtest=t
+    set -e
 }

 # Pass test if two arguments match
@@ -418,6 +419,7 @@ test_begin_subtest ()
 test_expect_equal ()
 {
        exec 1>&6 2>&7          # Restore stdout and stderr
+       set +e
        inside_subtest=
        test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
@@ -440,6 +442,7 @@ test_expect_equal ()

 test_expect_equal_failure ()
 {
+       set +e
        test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
        error "bug in the test script: not 2 or 3 parameters to 
test_expect_equal"
-- 
1.7.1.90.g94d6d4

Reply via email to