X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=test%2Ftest-lib.sh;h=dc2972f256a00456b0649911b56719586f553ddd;hp=168123a2c267773f6537dca8bb13e3c66da10253;hb=b596fbbcd30c82a6487231f01ba1e4d68bd98275;hpb=a09921bdfb47ff15f32bcea9f24e8399b1b8db36 diff --git a/test/test-lib.sh b/test/test-lib.sh old mode 100644 new mode 100755 index 168123a2..dc2972f2 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Copyright (c) 2005 Junio C Hamano # @@ -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-', where 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 @@ -347,8 +351,11 @@ ${additional_headers}" ${additional_headers}" fi + # Note that in the way we're setting it above and using it below, + # `additional_headers' will also serve as the header / body separator + # (empty line in between). -cat <"$gen_msg_filename" + cat <"$gen_msg_filename" From: ${template[from]} To: ${template[to]} Message-Id: <${gen_msg_id}> @@ -392,7 +399,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 + # below) + 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 +420,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" @@ -422,8 +441,33 @@ test_expect_equal () fi } +test_expect_equal_file () +{ + 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" + + output="$1" + expected="$2" + if ! test_skip "$@" + then + if diff -q "$expected" "$output" >/dev/null ; then + test_ok_ "$test_subtest_name" + else + testname=$this_test.$test_count + mv "$output" $testname.output + mv "$expected" $testname.expected + test_failure_ "$test_subtest_name" "$(diff -u $testname.expected $testname.output)" + fi + fi +} + 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" @@ -436,6 +480,9 @@ test_expect_equal_failure () test_known_broken_ok_ "$test_subtest_name" else test_known_broken_failure_ "$test_subtest_name" + testname=$this_test.$test_count + echo "$expected" > $testname.expected + echo "$output" > $testname.output fi fi } @@ -498,6 +545,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 +567,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" @@ -734,7 +783,9 @@ test_done () { echo if [ "$test_failure" = "0" ]; then - rm -rf "$remove_tmp" + if [ "$test_broken" = "0" ]; then + rm -rf "$remove_tmp" + fi exit 0 else exit 1 @@ -748,7 +799,6 @@ test_emacs () { cat < 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 +807,31 @@ 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 elisp sources are found +# +# --load Force loading of notmuch.el and test-lib.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 \ + --directory .. --load test-lib.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 +940,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 +960,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=