X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=test%2Ftest-lib.sh;h=e4729a61cd8ec634847eabca8fa37609cf7b7bde;hp=62e123d65aba8deae1f6e461ac8c4442562f608a;hb=1db3244bf1b271633976cb74952367e530d27d3d;hpb=b183f2635eaf323066f26c7ca22d931d4f4ccd3a diff --git a/test/test-lib.sh b/test/test-lib.sh index 62e123d6..e4729a61 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -13,7 +13,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . if [ ${BASH_VERSINFO[0]} -lt 4 ]; then echo "Error: The notmuch test suite requires a bash version >= 4.0" @@ -39,7 +39,7 @@ done,*) *' --tee '*|*' --va'*) mkdir -p test-results BASE=test-results/$this_test - (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1; + (GIT_TEST_TEE_STARTED=done "$BASH" "$0" "$@" 2>&1; echo $? > $BASE.exit) | tee $BASE.out test "$(cat $BASE.exit)" = 0 exit @@ -55,9 +55,15 @@ export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' # Keep the original TERM for say_color and test_emacs ORIGINAL_TERM=$TERM -# dtach(1) provides more capable terminal environment to anything -# that requires more than dumb terminal... -[ x"${TERM:-dumb}" = xdumb ] && DTACH_TERM=vt100 || DTACH_TERM=$TERM +# Set SMART_TERM to vt100 for known dumb/unknown terminal. +# Otherwise use whatever TERM is currently used so that +# users' actual TERM environments are being used in tests. +case ${TERM-} in + '' | dumb | unknown ) + SMART_TERM=vt100 ;; + *) + SMART_TERM=$TERM ;; +esac # For repeatability, reset the environment to known value. LANG=C @@ -74,6 +80,7 @@ if [[ ( -n "$TEST_EMACS" && -z "$TEST_EMACSCLIENT" ) || \ fi TEST_EMACS=${TEST_EMACS:-${EMACS:-emacs}} TEST_EMACSCLIENT=${TEST_EMACSCLIENT:-emacsclient} +TEST_GDB=${TEST_GDB:-gdb} TEST_CC=${TEST_CC:-cc} TEST_CFLAGS=${TEST_CFLAGS:-"-g -O0"} @@ -86,15 +93,6 @@ unset GREP_OPTIONS # For emacsclient unset ALTERNATE_EDITOR -# Convenience -# -# A regexp to match 5 and 40 hexdigits -_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' -_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" - -_x04='[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' -_x32="$_x04$_x04$_x04$_x04$_x04$_x04$_x04$_x04" - # Each test should start with something like this, after copyright notices: # # test_description='Description of this test... @@ -223,15 +221,15 @@ test_fixed=0 test_broken=0 test_success=0 -_die_common () { +_exit_common () { code=$? trap - EXIT set +ex rm -rf "$TEST_TMPDIR" } -die () { - _die_common +trap_exit () { + _exit_common if test -n "$GIT_EXIT_OK" then exit $code @@ -245,17 +243,29 @@ die () { fi } -die_signal () { - _die_common +trap_signal () { + _exit_common echo >&6 "FATAL: $0: interrupted by signal" $((code - 128)) exit $code } +die () { + _exit_common + exec >&6 + say_color error '%-6s' FATAL + echo " $*" + echo + echo "Unexpected exit while executing $0." + exit 1 +} + GIT_EXIT_OK= # Note: TEST_TMPDIR *NOT* exported! TEST_TMPDIR=$(mktemp -d "${TMPDIR:-/tmp}/notmuch-test-$$.XXXXXX") -trap 'die' EXIT -trap 'die_signal' HUP INT TERM +# Put GNUPGHOME in TMPDIR to avoid problems with long paths. +export GNUPGHOME="${TEST_TMPDIR}/gnupg" +trap 'trap_exit' EXIT +trap 'trap_signal' HUP INT TERM test_decode_color () { sed -e 's/.\[1m//g' \ @@ -531,21 +541,26 @@ emacs_fcc_message () notmuch new >/dev/null } -# Generate a corpus of email and add it to the database. +# Add an existing, fixed corpus of email to the database. +# +# $1 is the corpus dir under corpora to add, using "default" if unset. # -# This corpus is fixed, (it happens to be 50 messages from early in -# the history of the notmuch mailing list), which allows for reliably +# The default corpus is based on about 50 messages from early in the +# history of the notmuch mailing list, which allows for reliably # testing commands that need to operate on a not-totally-trivial # number of messages. add_email_corpus () { + corpus=${1:-default} + rm -rf ${MAIL_DIR} - if [ -d $TEST_DIRECTORY/corpus.mail ]; then - cp -a $TEST_DIRECTORY/corpus.mail ${MAIL_DIR} + if [ -d $TEST_DIRECTORY/corpora.mail/$corpus ]; then + cp -a $TEST_DIRECTORY/corpora.mail/$corpus ${MAIL_DIR} else - cp -a $TEST_DIRECTORY/corpus ${MAIL_DIR} - notmuch new >/dev/null - cp -a ${MAIL_DIR} $TEST_DIRECTORY/corpus.mail + cp -a $TEST_DIRECTORY/corpora/$corpus ${MAIL_DIR} + notmuch new >/dev/null || die "'notmuch new' failed while adding email corpus" + mkdir -p $TEST_DIRECTORY/corpora.mail + cp -a ${MAIL_DIR} $TEST_DIRECTORY/corpora.mail/$corpus fi } @@ -603,15 +618,15 @@ test_expect_equal_file () error "bug in the test script: not 2 or 3 parameters to test_expect_equal" file1="$1" - basename1=`basename "$file1"` file2="$2" - basename2=`basename "$file2"` if ! test_skip "$test_subtest_name" then if diff -q "$file1" "$file2" >/dev/null ; then test_ok_ else testname=$this_test.$test_count + basename1=`basename "$file1"` + basename2=`basename "$file2"` cp "$file1" "$testname.$basename1" cp "$file2" "$testname.$basename2" test_failure_ "$(diff -u "$testname.$basename1" "$testname.$basename2")" @@ -636,7 +651,7 @@ test_expect_equal_json () { # Sort the top-level list of JSON data from stdin. test_sort_json () { - PYTHONIOENCODING=utf-8 python -c \ + PYTHONIOENCODING=utf-8 $NOTMUCH_PYTHON -c \ "import sys, json; json.dump(sorted(json.load(sys.stdin)),sys.stdout)" } @@ -674,6 +689,12 @@ NOTMUCH_NEW () notmuch new "${@}" | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file' } +NOTMUCH_DUMP_TAGS () +{ + # this relies on the default format being batch-tag, otherwise some tests will break + notmuch dump --include=tags "${@}" | sed '/^#/d' | sort +} + notmuch_search_sanitize () { perl -pe 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/' @@ -708,8 +729,9 @@ notmuch_json_show_sanitize () -e 's|"id": "[^"]*",|"id": "XXXXX",|g' \ -e 's|"Date": "Fri, 05 Jan 2001 [^"]*0000"|"Date": "GENERATED_DATE"|g' \ -e 's|"filename": "signature.asc",||g' \ - -e 's|"filename": "/[^"]*",|"filename": "YYYYY",|g' \ - -e 's|"timestamp": 97.......|"timestamp": 42|g' + -e 's|"filename": \["/[^"]*"\],|"filename": \["YYYYY"\],|g' \ + -e 's|"timestamp": 97.......|"timestamp": 42|g' \ + -e 's|"content-length": [1-9][0-9]*|"content-length": "NONZERO"|g' } notmuch_emacs_error_sanitize () @@ -740,6 +762,11 @@ notmuch_built_with_sanitize () sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/' } +notmuch_config_sanitize () +{ + notmuch_dir_sanitize | notmuch_built_with_sanitize +} + # End of notmuch helper functions # Use test_set_prereq to tell that a particular prerequisite is available. @@ -815,12 +842,12 @@ test_ok_ () { } test_failure_ () { + print_test_description if test "$test_subtest_known_broken_" = "t"; then test_known_broken_failure_ "$@" return fi test_failure=$(($test_failure + 1)) - print_test_description test_failure_message_ "FAIL" "$test_subtest_name" "$@" test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; } return 1 @@ -830,7 +857,9 @@ test_failure_message_ () { say_color error "%-6s" "$1" echo " $2" shift 2 - echo "$@" | sed -e 's/^/ /' + if [ "$#" != "0" ]; then + echo "$@" | sed -e 's/^/ /' + fi if test "$verbose" != "t"; then cat test.output; fi } @@ -844,7 +873,11 @@ test_known_broken_ok_ () { test_known_broken_failure_ () { test_reset_state_ test_broken=$(($test_broken+1)) - test_failure_message_ "BROKEN" "$test_subtest_name" "$@" + if [ -z "$NOTMUCH_TEST_QUIET" ]; then + test_failure_message_ "BROKEN" "$test_subtest_name" "$@" + else + test_failure_message_ "BROKEN" "$test_subtest_name" + fi return 1 } @@ -1142,10 +1175,10 @@ test_emacs () { fi server_name="notmuch-test-suite-$$" # start a detached session with an emacs server - # user's TERM (or 'vt100' in case user's TERM is unset, empty - # or 'dumb') is given to dtach which assumes a minimally + # user's TERM (or 'vt100' in case user's TERM is known dumb + # or unknown) is given to dtach which assumes a minimally # VT100-compatible terminal -- and emacs inherits that - TERM=$DTACH_TERM dtach -n "$TEST_TMPDIR/emacs-dtach-socket.$$" \ + TERM=$SMART_TERM dtach -n "$TEST_TMPDIR/emacs-dtach-socket.$$" \ sh -c "stty rows 24 cols 80; exec '$TMP_DIRECTORY/run_emacs' \ --no-window-system \ $load_emacs_tests \ @@ -1171,15 +1204,13 @@ test_emacs () { } test_python() { - export LD_LIBRARY_PATH=$TEST_DIRECTORY/../lib - export PYTHONPATH=$TEST_DIRECTORY/../bindings/python - - (echo "import sys; _orig_stdout=sys.stdout; sys.stdout=open('OUTPUT', 'w')"; cat) \ - | $NOTMUCH_PYTHON - + # Note: if there is need to print debug information from python program, + # use stdout = os.fdopen(6, 'w') or stderr = os.fdopen(7, 'w') + PYTHONPATH="$TEST_DIRECTORY/../bindings/python${PYTHONPATH:+:$PYTHONPATH}" \ + $NOTMUCH_PYTHON -B - > OUTPUT } test_ruby() { - export LD_LIBRARY_PATH=$TEST_DIRECTORY/../lib MAIL_DIR=$MAIL_DIR ruby -I $TEST_DIRECTORY/../bindings/ruby> OUTPUT } @@ -1187,8 +1218,7 @@ test_C () { exec_file="test${test_count}" test_file="${exec_file}.c" cat > ${test_file} - export LD_LIBRARY_PATH=${TEST_DIRECTORY}/../lib - ${TEST_CC} ${TEST_CFLAGS} -I${TEST_DIRECTORY}/../lib -o ${exec_file} ${test_file} -L${TEST_DIRECTORY}/../lib/ -lnotmuch -ltalloc + ${TEST_CC} ${TEST_CFLAGS} -I${TEST_DIRECTORY} -I${TEST_DIRECTORY}/../lib -o ${exec_file} ${test_file} -L${TEST_DIRECTORY}/../lib/ -lnotmuch -ltalloc echo "== stdout ==" > OUTPUT.stdout echo "== stderr ==" > OUTPUT.stderr ./${exec_file} "$@" 1>>OUTPUT.stdout 2>>OUTPUT.stderr @@ -1349,7 +1379,7 @@ esac test_declare_external_prereq dtach test_declare_external_prereq emacs test_declare_external_prereq ${TEST_EMACSCLIENT} -test_declare_external_prereq gdb +test_declare_external_prereq ${TEST_GDB} test_declare_external_prereq gpg test_declare_external_prereq openssl test_declare_external_prereq gpgsm