aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Austin Clements <amdragon@MIT.EDU>2012-11-27 23:54:01 -0500
committerGravatar David Bremner <bremner@debian.org>2012-11-29 09:24:12 -0400
commit7a0813b72a04339581dfbe06fb9a6de9bc161025 (patch)
tree7bc8098f648bbe71849b3753dad478a9321f5dd6 /test
parentec59896de06cf76d6d7ee6ff7bc46df522c7afe3 (diff)
test: Use associative arrays to track external prereqs
Previously, the test framework generated a variable name for each external prereq as a poor man's associative array. Unfortunately, prereqs names may not be legal variable names, leading to unintelligible bash errors like test_missing_external_prereq_emacsclient.emacs24_=t: command not found Using proper associative arrays to track prereqs, in addition to being much cleaner than generating variable names and using grep to carefully construct unique string lists, removes restrictions on prereq names.
Diffstat (limited to 'test')
-rw-r--r--test/test-lib.sh24
1 files changed, 14 insertions, 10 deletions
diff --git a/test/test-lib.sh b/test/test-lib.sh
index 77063a4d..f1697856 100644
--- a/test/test-lib.sh
+++ b/test/test-lib.sh
@@ -625,18 +625,22 @@ test_have_prereq () {
esac
}
+declare -A test_missing_external_prereq_
+declare -A test_subtest_missing_external_prereq_
+
# 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 "
- test_missing_external_prereq_${binary}_=t
+ if ! hash $binary 2>/dev/null; then
+ test_missing_external_prereq_["${binary}"]=t
+ eval "
$binary () {
- echo -n \"\$test_subtest_missing_external_prereqs_ \" | grep -qe \" $name \" ||
- test_subtest_missing_external_prereqs_=\"\$test_subtest_missing_external_prereqs_ $name\"
+ test_subtest_missing_external_prereq_[\"${name}\"]=t
false
}"
+ fi
}
# Explicitly require external prerequisite. Useful when binary is
@@ -644,7 +648,7 @@ $binary () {
# Returns success if dependency is available, failure otherwise.
test_require_external_prereq () {
binary="$1"
- if [ "$(eval echo -n \$test_missing_external_prereq_${binary}_)" = t ]; then
+ if [[ ${test_missing_external_prereq_["${binary}"]} == t ]]; then
# dependency is missing, call the replacement function to note it
eval "$binary"
else
@@ -737,9 +741,9 @@ test_skip () {
}
test_check_missing_external_prereqs_ () {
- if test -n "$test_subtest_missing_external_prereqs_"; then
- say_color skip >&1 "missing prerequisites:"
- echo "$test_subtest_missing_external_prereqs_" >&1
+ if [[ ${#test_subtest_missing_external_prereq_[@]} != 0 ]]; then
+ say_color skip >&1 "missing prerequisites: "
+ echo ${!test_subtest_missing_external_prereq_[@]} >&1
test_report_skip_ "$@"
else
false
@@ -1022,7 +1026,7 @@ test_python() {
# most others as /usr/bin/python. So first try python2, and fallback to
# python if python2 doesn't exist.
cmd=python2
- [[ "$test_missing_external_prereq_python2_" = t ]] && cmd=python
+ [[ ${test_missing_external_prereq_[python2]} == t ]] && cmd=python
(echo "import sys; _orig_stdout=sys.stdout; sys.stdout=open('OUTPUT', 'w')"; cat) \
| $cmd -
@@ -1064,7 +1068,7 @@ test_reset_state_ () {
test -z "$test_init_done_" && test_init_
test_subtest_known_broken_=
- test_subtest_missing_external_prereqs_=
+ test_subtest_missing_external_prereq_=()
}
# called once before the first subtest