Code

tests: introduce test_must_fail
authorJunio C Hamano <gitster@pobox.com>
Thu, 28 Feb 2008 21:09:30 +0000 (13:09 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Mar 2008 07:15:06 +0000 (23:15 -0800)
When we expect a git command to notice and signal errors, we
carelessly wrote in our tests:

    test_expect_success 'reject bogus request' '
        do something &&
        do something else &&
        ! git command
    '

but a non-zero exit could come from the "git command" segfaulting.

A new helper function "tset_must_fail" is introduced and it is
meant to be used to make sure the command gracefully fails (iow,
dying and exiting with non zero status is counted as a failure
to "gracefully fail").  The above example should be written as:

    test_expect_success 'reject bogus request' '
        do something &&
        do something else &&
        test_must_fail git command
    '

Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t2008-checkout-subdir.sh
t/test-lib.sh

index f78945ed8e8fe5fea3c2656460a120363c546185..3e098ab31e1944abe8e5815c0f219947620b6618 100755 (executable)
@@ -67,16 +67,16 @@ test_expect_success 'checkout with simple prefix' '
 
 '
 
-test_expect_failure 'relative path outside tree should fail' \
-       'git checkout HEAD -- ../../Makefile'
+test_expect_success 'relative path outside tree should fail' \
+       'test_must_fail git checkout HEAD -- ../../Makefile'
 
-test_expect_failure 'incorrect relative path to file should fail (1)' \
-       'git checkout HEAD -- ../file0'
+test_expect_success 'incorrect relative path to file should fail (1)' \
+       'test_must_fail git checkout HEAD -- ../file0'
 
-test_expect_failure 'incorrect relative path should fail (2)' \
-       '( cd dir1 && git checkout HEAD -- ./file0 )'
+test_expect_success 'incorrect relative path should fail (2)' \
+       '( cd dir1 && test_must_fail git checkout HEAD -- ./file0 )'
 
-test_expect_failure 'incorrect relative path should fail (3)' \
-       '( cd dir1 && git checkout HEAD -- ../../file0 )'
+test_expect_success 'incorrect relative path should fail (3)' \
+       '( cd dir1 && test_must_fail git checkout HEAD -- ../../file0 )'
 
 test_done
index 142540e1b175e44da0d6e522140d404fb5a795bf..c0c5e21adfebba8fc82a0d5308eb04c59c33aece 100644 (file)
@@ -257,6 +257,23 @@ test_expect_code () {
        echo >&3 ""
 }
 
+# This is not among top-level (test_expect_success | test_expect_failure)
+# but is a prefix that can be used in the test script, like:
+#
+#      test_expect_success 'complain and die' '
+#           do something &&
+#           do something else &&
+#          test_must_fail git checkout ../outerspace
+#      '
+#
+# Writing this as "! git checkout ../outerspace" is wrong, because
+# the failure could be due to a segv.  We want a controlled failure.
+
+test_must_fail () {
+       "$@"
+       test $? -gt 0 -a $? -le 128
+}
+
 # Most tests can use the created repository, but some may need to create more.
 # Usage: test_create_repo <directory>
 test_create_repo () {