]> git.notmuchmail.org Git - notmuch/blobdiff - test/test-lib.sh
Fix handling of broken tests.
[notmuch] / test / test-lib.sh
old mode 100644 (file)
new mode 100755 (executable)
index 168123a..da91de8
@@ -144,7 +144,7 @@ else
 fi
 
 error () {
-       say_color error "error: $*"
+       say_color error "error: $*\n"
        GIT_EXIT_OK=t
        exit 1
 }
@@ -165,12 +165,6 @@ fi
 echo $(basename "$0"): "Testing ${test_description}"
 
 exec 5>&1
-if test "$verbose" = "t"
-then
-       exec 4>&2 3>&1
-else
-       exec 4>/dev/null 3>/dev/null
-fi
 
 test_failure=0
 test_count=0
@@ -245,6 +239,12 @@ increment_mtime ()
 #      Generate the message in directory 'directory/of/choice' within
 #      the mail store. The directory will be created if necessary.
 #
+#  [filename]=name
+#
+#      Store the message in file 'name'. The default is to store it
+#      in 'msg-<count>', where <count> is three-digit number of the
+#      message.
+#      
 #  [body]=text
 #
 #      Text to use as the body of the email message
@@ -281,10 +281,14 @@ generate_message ()
     local additional_headers
 
     gen_msg_cnt=$((gen_msg_cnt + 1))
-    gen_msg_name=msg-$(printf "%03d" $gen_msg_cnt)
+    if [ -z "${template[filename]}" ]; then
+       gen_msg_name="msg-$(printf "%03d" $gen_msg_cnt)"
+    else
+       gen_msg_name=${template[filename]}
+    fi
 
     if [ -z "${template[id]}" ]; then
-       gen_msg_id="${gen_msg_name}@notmuch-test-suite"
+       gen_msg_id="${gen_msg_name%:2,*}@notmuch-test-suite"
     else
        gen_msg_id="${template[id]}"
     fi
@@ -392,7 +396,17 @@ add_email_corpus ()
 
 test_begin_subtest ()
 {
+    if [ -n "$inside_subtest" ]; then
+       exec 1>&6 2>&7          # Restore stdout and stderr
+       error "bug in test script: Missing test_expect_equal in ${BASH_SOURCE[1]}:${BASH_LINENO[0]}"
+    fi
     test_subtest_name="$1"
+    # Remember stdout and stderr file descriptios and redirect test
+    # output to the previously prepared file descriptors 3 and 4 (see
+    # bellow)
+    if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
+    exec 6>&1 7>&2 >&3 2>&4
+    inside_subtest=t
 }
 
 # Pass test if two arguments match
@@ -403,6 +417,8 @@ test_begin_subtest ()
 # name.
 test_expect_equal ()
 {
+       exec 1>&6 2>&7          # Restore stdout and stderr
+       inside_subtest=
        test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
        error "bug in the test script: not 2 or 3 parameters to test_expect_equal"
@@ -424,6 +440,8 @@ test_expect_equal ()
 
 test_expect_equal_failure ()
 {
+       exec 1>&6 2>&7          # Restore stdout and stderr
+       inside_subtest=
        test "$#" = 3 && { prereq=$1; shift; } || prereq=
        test "$#" = 2 ||
        error "bug in the test script: not 2 or 3 parameters to test_expect_equal"
@@ -498,6 +516,7 @@ test_failure_ () {
        echo " $1"
        shift
        echo "$@" | sed -e 's/^/        /'
+       if test "$verbose" != "t"; then cat test.output; fi
        test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
 }
 
@@ -519,6 +538,7 @@ test_debug () {
 
 test_run_ () {
        test_cleanup=:
+       if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
        eval >&3 2>&4 "$1"
        eval_ret=$?
        eval >&3 2>&4 "$test_cleanup"
@@ -748,7 +768,6 @@ test_emacs () {
        cat <<EOF > run_emacs
 #!/bin/sh
 export PATH=$PATH
-export HOME=$HOME
 export NOTMUCH_CONFIG=$NOTMUCH_CONFIG
 
 # We assume that the user will give a command-line argument only if
@@ -757,10 +776,30 @@ if [ \$# -gt 0 ]; then
        BATCH=--batch
 fi
 
-emacs \$BATCH --no-site-file --directory ../../emacs --load notmuch.el \
+# 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
@@ -869,8 +908,7 @@ rm -fr "$test" || {
 }
 
 MAIL_DIR="${TMP_DIRECTORY}/mail"
-export HOME="${TMP_DIRECTORY}"
-export NOTMUCH_CONFIG="${HOME}/notmuch-config"
+export NOTMUCH_CONFIG="${TMP_DIRECTORY}/notmuch-config"
 
 mkdir -p "${test}"
 mkdir -p "${MAIL_DIR}"
@@ -890,8 +928,14 @@ EOF
 # in subprocesses like git equals our $PWD (for pathname comparisons).
 cd -P "$test" || error "Cannot setup test environment"
 
+if test "$verbose" = "t"
+then
+       exec 4>&2 3>&1
+else
+       exec 4>test.output 3>&4
+fi
+
 this_test=${0##*/}
-this_test=${this_test%%-*}
 for skp in $NOTMUCH_SKIP_TESTS
 do
        to_skip=