X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=test%2Ftest-lib.sh;h=99b9e8b8096386484f27fea028e75292a93e1007;hb=f3254667283bc51b97a2d35aa8438420528ba9b3;hp=076f92951673ef42e7e0ed56840fc7843bf78bd4;hpb=5aeca8182f02ca3800894ed39a6677c438ab131c;p=notmuch diff --git a/test/test-lib.sh b/test/test-lib.sh index 076f9295..99b9e8b8 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -548,6 +548,19 @@ test_have_prereq () { esac } +# declare prerequisite for the given external binary +test_declare_external_prereq () { + binary="$1" + test "$#" = 2 && name=$2 || name="$binary(1)" + + hash $binary 2>/dev/null || eval " +$binary () { + echo -n \"\$test_subtest_missing_external_prereqs_\" | grep -e \" $name \" || + test_subtest_missing_external_prereqs_=\"$test_subtest_missing_external_prereqs_ $name\" + false +}" +} + # You are not expected to call test_ok_ and test_failure_ directly, use # the text_expect_* functions instead. @@ -624,18 +637,32 @@ test_skip () { fi case "$to_skip" in t) - test_reset_state_ - say_color skip >&3 "skipping test: $@" - say_color skip "%-6s" "SKIP" - echo " $1" - : true + test_report_skip_ "$@" ;; *) - false + test_check_missing_external_prereqs_ "$@" ;; esac } +test_check_missing_external_prereqs_ () { + if test -n "$test_subtest_missing_external_prereqs_"; then + say_color skip >&3 "missing prerequisites:" + echo "$test_subtest_missing_external_prereqs_" >&3 + test_report_skip_ "$@" + else + false + fi +} + +test_report_skip_ () { + test_reset_state_ + say_color skip >&3 "skipping test:" + echo " $@" >&3 + say_color skip "%-6s" "SKIP" + echo " $1" +} + test_subtest_known_broken () { test_subtest_known_broken_=t } @@ -648,7 +675,10 @@ test_expect_success () { if ! test_skip "$@" then test_run_ "$2" - if [ "$?" = 0 -a "$eval_ret" = 0 ] + run_ret="$?" + # test_run_ may update missing external prerequisites + test_check_missing_external_prereqs_ "$@" || + if [ "$run_ret" = 0 -a "$eval_ret" = 0 ] then test_ok_ "$1" else @@ -665,7 +695,10 @@ test_expect_code () { if ! test_skip "$@" then test_run_ "$3" - if [ "$?" = 0 -a "$eval_ret" = "$1" ] + run_ret="$?" + # test_run_ may update missing external prerequisites, + test_check_missing_external_prereqs_ "$@" || + if [ "$run_ret" = 0 -a "$eval_ret" = "$1" ] then test_ok_ "$2" else @@ -869,7 +902,18 @@ test_emacs () { } test_reset_state_ () { + test -z "$test_init_done_" && test_init_ + test_subtest_known_broken_= + test_subtest_missing_external_prereqs_= +} + +# called once before the first subtest +test_init_ () { + test_init_done_=t + + # skip all tests if there were external prerequisites missing during init + test_check_missing_external_prereqs_ "all tests in $this_test" && test_done }