X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=test%2Ftest-lib.sh;h=8ecc9a08cbcb92a84e23f4779d2fda6b00a61ae0;hp=d5d61e4e81634092b1c4394774a902694e04447b;hb=fd16b37dc1b59dac765d459459ce00907506d559;hpb=16a6301adecb125ef8f5486fa0d1510712f06c21 diff --git a/test/test-lib.sh b/test/test-lib.sh index d5d61e4e..8ecc9a08 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -15,6 +15,14 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/ . +if [ ${BASH_VERSINFO[0]} -lt 4 ]; then + echo "Error: The notmuch test suite requires a bash version >= 4.0" + echo "due to use of associative arrays within the test suite." + echo "Please try again with a newer bash (or help us fix the" + echo "test suite to be more portable). Thanks." + exit 1 +fi + # if --tee was passed, write the output not only to the terminal, but # additionally to the file test-results/$BASENAME.out, too. case "$GIT_TEST_TEE_STARTED, $* " in @@ -154,7 +162,7 @@ then exit 0 fi -echo "Testing ${test_description}" +echo $(basename "$0"): "Testing ${test_description}" exec 5>&1 if test "$verbose" = "t" @@ -354,7 +362,7 @@ EOF increment_mtime "$(dirname "${gen_msg_filename}")" } -# Generate a new message and add it to the index. +# Generate a new message and add it to the database. # # All of the arguments and return values supported by generate_message # are also supported here, so see that function for details. @@ -364,6 +372,24 @@ add_message () notmuch new > /dev/null } +# Generate a corpus of email and add it to the database. +# +# This corpus is fixed, (it happens to be 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 () +{ + rm -rf ${MAIL_DIR} + if [ -d ../corpus.mail ]; then + cp -a ../corpus.mail ${MAIL_DIR} + else + cp -a ../corpus ${MAIL_DIR} + notmuch new >/dev/null + cp -a ${MAIL_DIR} ../corpus.mail + fi +} + test_begin_subtest () { test_subtest_name="$1" @@ -385,7 +411,6 @@ test_expect_equal () expected="$2" if ! test_skip "$@" then - say >&3 "expecting success: diff $output $expected" if [ "$output" = "$expected" ]; then test_ok_ "$test_subtest_name" else @@ -394,14 +419,26 @@ test_expect_equal () echo "$output" > $testname.output test_failure_ "$test_subtest_name" "$(diff -u $testname.expected $testname.output)" fi - echo >&3 "" fi } -TEST_DIR=$(pwd)/test.$$ -MAIL_DIR=${TEST_DIR}/mail -export NOTMUCH_CONFIG=${TEST_DIR}/notmuch-config -NOTMUCH=notmuch +test_expect_equal_failure () +{ + test "$#" = 3 && { prereq=$1; shift; } || prereq= + test "$#" = 2 || + error "bug in the test script: not 2 or 3 parameters to test_expect_equal" + + output="$1" + expected="$2" + if ! test_skip "$@" + then + if [ "$output" = "$expected" ]; then + test_known_broken_ok_ "$test_subtest_name" + else + test_known_broken_failure_ "$test_subtest_name" + fi + fi +} NOTMUCH_NEW () { @@ -522,7 +559,6 @@ test_expect_failure () { error "bug in the test script: not 2 or 3 parameters to test-expect-failure" if ! test_skip "$@" then - say >&3 "checking known breakage: $2" test_run_ "$2" if [ "$?" = 0 -a "$eval_ret" = 0 ] then @@ -531,7 +567,6 @@ test_expect_failure () { test_known_broken_failure_ "$1" fi fi - echo >&3 "" } test_expect_success () { @@ -540,7 +575,6 @@ test_expect_success () { error "bug in the test script: not 2 or 3 parameters to test-expect-success" if ! test_skip "$@" then - say >&3 "expecting success: $2" test_run_ "$2" if [ "$?" = 0 -a "$eval_ret" = 0 ] then @@ -549,7 +583,6 @@ test_expect_success () { test_failure_ "$@" fi fi - echo >&3 "" } test_expect_code () { @@ -558,7 +591,6 @@ test_expect_code () { error "bug in the test script: not 3 or 4 parameters to test-expect-code" if ! test_skip "$@" then - say >&3 "expecting exit code $1: $3" test_run_ "$3" if [ "$?" = 0 -a "$eval_ret" = "$1" ] then @@ -567,7 +599,6 @@ test_expect_code () { test_failure_ "$@" fi fi - echo >&3 "" } # test_external runs external test scripts that provide continuous @@ -613,7 +644,6 @@ test_external_without_stderr () { [ -f "$stderr" ] || error "Internal error: $stderr disappeared." descr="no stderr: $1" shift - say >&3 "expecting no stderr from previous command" if [ ! -s "$stderr" ]; then rm "$stderr" test_ok_ "$descr" @@ -711,6 +741,52 @@ test_done () { fi } +test_emacs () { + # Construct a little test script here for the benefit of the user, + # (who can easily run "run_emacs" to get the same emacs environment + # for investigating any failures). + cat < run_emacs +#!/bin/sh +export PATH=$PATH +export NOTMUCH_CONFIG=$NOTMUCH_CONFIG + +# We assume that the user will give a command-line argument only if +# wanting to run in batch mode. +if [ \$# -gt 0 ]; then + BATCH=--batch +fi + +# Here's what we are using here: +# +# --batch: Quit after given commands and print all (messages) +# +# --no-init-file Don't load users ~/.emacs +# +# --no-site-file Don't load the site-wide startup stuff +# +# --directory Ensure that the local notmuch.el source is found +# +# --load Force loading of notmuch.el +# +# notmuch-test-wait Function for tests to use to wait for process completion +# +# message-signature Avoiding appending user's signature on messages +# +# set-frame-width 80 columns (avoids crazy 10-column default of --batch) + +emacs \$BATCH --no-init-file --no-site-file \ + --directory ../../emacs --load notmuch.el \ + --eval "(defun notmuch-test-wait () + (while (get-buffer-process (current-buffer)) + (sleep-for 0.1)))" \ + --eval "(setq message-signature nil)" \ + --eval "(progn (set-frame-width (window-frame (get-buffer-window)) 80) \$@)" +EOF + chmod a+x ./run_emacs + ./run_emacs "$@" +} + + find_notmuch_path () { dir="$1" @@ -815,7 +891,7 @@ MAIL_DIR="${TMP_DIRECTORY}/mail" export NOTMUCH_CONFIG="${TMP_DIRECTORY}/notmuch-config" mkdir -p "${test}" -mkdir "$MAIL_DIR" +mkdir -p "${MAIL_DIR}" cat <"${NOTMUCH_CONFIG}" [database]