[PATCH] test: Use associative arrays to track external prereqs

Tomi Ollila tomi.ollila at iki.fi
Wed Nov 28 00:00:25 PST 2012


On Wed, Nov 28 2012, Austin Clements <amdragon at MIT.EDU> wrote:

> 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.
> ---

That looks good and something like I once attempted
(at that time this would have make tests fail as this
speeds up the script execution so much that smtp-dummy
may not have time to start before it was used -- now
that is taken care by smtp-dummy --background feature :)

+1

Tomi



>  test/test-lib.sh |   24 ++++++++++++++----------
>  1 file changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/test/test-lib.sh b/test/test-lib.sh
> index 77063a4..f169785 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
> -- 
> 1.7.10.4
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list