test: add support for external executable dependencies

There is existing support for general prerequisites in the test suite.
But it is not very convenient to use: every test case has to keep
track for it's dependencies and they have to be explicitly listed.

The patch aims to add better support for a particular type of external
dependencies: external executables.  The main idea is to replace
missing external binaries with shell functions that have the same
name.  These functions always fail and keep track of missing
dependencies for a subtest.  The result reporting functions later can
check that an external binaries are missing and correctly report SKIP
result instead of FAIL.  The primary benefit is that the test cases do
not need to declare their dependencies or be changed in any way.
This commit is contained in:
Dmitry Kurochkin 2011-11-27 22:36:13 +04:00 committed by David Bremner
parent 5aeca8182f
commit 66158d5e40

View file

@ -548,6 +548,19 @@ test_have_prereq () {
esac 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 # You are not expected to call test_ok_ and test_failure_ directly, use
# the text_expect_* functions instead. # the text_expect_* functions instead.
@ -624,18 +637,31 @@ test_skip () {
fi fi
case "$to_skip" in case "$to_skip" in
t) t)
test_reset_state_ test_report_skip_ "$@"
say_color skip >&3 "skipping test: $@"
say_color skip "%-6s" "SKIP"
echo " $1"
: true
;; ;;
*) *)
false test_check_missing_external_prereqs_ "$@"
;; ;;
esac 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: $@"
say_color skip "%-6s" "SKIP"
echo " $1"
}
test_subtest_known_broken () { test_subtest_known_broken () {
test_subtest_known_broken_=t test_subtest_known_broken_=t
} }
@ -648,7 +674,10 @@ test_expect_success () {
if ! test_skip "$@" if ! test_skip "$@"
then then
test_run_ "$2" 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 then
test_ok_ "$1" test_ok_ "$1"
else else
@ -665,7 +694,10 @@ test_expect_code () {
if ! test_skip "$@" if ! test_skip "$@"
then then
test_run_ "$3" 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 then
test_ok_ "$2" test_ok_ "$2"
else else
@ -870,6 +902,7 @@ test_emacs () {
test_reset_state_ () { test_reset_state_ () {
test_subtest_known_broken_= test_subtest_known_broken_=
test_subtest_missing_external_prereqs_=
} }