X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=test%2Ftest-lib.sh;h=6ce3b3189f25c354b471c42db1730ab8fe172e89;hb=02a0f341dc364572792a8b8511048ef2cd160a4e;hp=e092231589785ddc378843aa0f4e181823b4347d;hpb=d59d9c81522d9127dde089ae9457f44de53f28e9;p=notmuch diff --git a/test/test-lib.sh b/test/test-lib.sh index e0922315..6ce3b318 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -534,8 +534,13 @@ test_expect_equal_file () # canonicalized before diff'ing. If an argument cannot be parsed, it # is used unchanged so that there's something to diff against. test_expect_equal_json () { - output=$(echo "$1" | python -mjson.tool || echo "$1") - expected=$(echo "$2" | python -mjson.tool || echo "$2") + # The test suite forces LC_ALL=C, but this causes Python 3 to + # decode stdin as ASCII. We need to read JSON in UTF-8, so + # override Python's stdio encoding defaults. + output=$(echo "$1" | PYTHONIOENCODING=utf-8 python -mjson.tool \ + || echo "$1") + expected=$(echo "$2" | PYTHONIOENCODING=utf-8 python -mjson.tool \ + || echo "$2") shift 2 test_expect_equal "$output" "$expected" "$@" } @@ -576,7 +581,7 @@ NOTMUCH_NEW () notmuch_search_sanitize () { - sed -r -e 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/' + perl -pe 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/' } NOTMUCH_SHOW_FILENAME_SQUELCH='s,filename:.*/mail,filename:/XXX/mail,' @@ -595,7 +600,7 @@ notmuch_json_show_sanitize () { sed \ -e 's|"id": "[^"]*",|"id": "XXXXX",|g' \ - -e 's|"filename": "[^"]*",|"filename": "YYYYY",|g' + -e 's|"filename": "/[^"]*",|"filename": "YYYYY",|g' } # End of notmuch helper functions @@ -625,18 +630,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 +653,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 +746,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 @@ -920,7 +929,7 @@ test_done () { GIT_EXIT_OK=t test_results_dir="$TEST_DIRECTORY/test-results" mkdir -p "$test_results_dir" - test_results_path="$test_results_dir/${0%.sh}-$$" + test_results_path="$test_results_dir/${0%.sh}" echo "total $test_count" >> $test_results_path echo "success $test_success" >> $test_results_path @@ -1022,7 +1031,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 +1073,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