X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=test%2Ftest-lib.sh;h=133fbe4025143ffebf68ddaab47ff582a275dafe;hb=76f8498df61577c2f2e8f22e34a93a37ea532a03;hp=34e0db68d36cf08e286570cc6e71e75cf4f58287;hpb=f05e7f3ce50b5762a56406b29012b25e2d1329b2;p=notmuch diff --git a/test/test-lib.sh b/test/test-lib.sh index 34e0db68..133fbe40 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -27,6 +27,7 @@ shopt -u xpg_echo this_test=${0##*/} this_test=${this_test%.sh} +this_test_bare=${this_test#T[0-9][0-9][0-9]-} # if --tee was passed, write the output not only to the terminal, but # additionally to the file test-results/$BASENAME.out, too. @@ -44,6 +45,12 @@ done,*) ;; esac +# Save STDOUT to fd 6 and STDERR to fd 7. +exec 6>&1 7>&2 +# Make xtrace debugging (when used) use redirected STDERR, with verbose lead: +BASH_XTRACEFD=7 +export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + # Keep the original TERM for say_color and test_emacs ORIGINAL_TERM=$TERM @@ -198,9 +205,10 @@ print_test_description () echo $this_test: "Testing ${test_description}" test_description_printed=1 } -print_test_description - -exec 5>&1 +if [ -z "$NOTMUCH_TEST_QUIET" ] +then + print_test_description +fi test_failure=0 test_count=0 @@ -221,7 +229,7 @@ die () { then exit $code else - exec >&5 + exec >&6 say_color error '%-6s' FATAL echo " $test_subtest_name" echo @@ -232,7 +240,7 @@ die () { die_signal () { _die_common - echo >&5 "FATAL: $0: interrupted by signal" $((code - 128)) + echo >&6 "FATAL: $0: interrupted by signal" $((code - 128)) exit $code } @@ -364,10 +372,20 @@ generate_message () else template[subject]="Test message #${gen_msg_cnt}" fi + elif [ "${template[subject]}" = "@FORCE_EMPTY" ]; then + template[subject]="" fi if [ -z "${template[date]}" ]; then - template[date]="Fri, 05 Jan 2001 15:43:57 +0000" + # we use decreasing timestamps here for historical reasons; + # the existing test suite when we converted to unique timestamps just + # happened to have signicantly fewer failures with that choice. + local date_secs=$((978709437 - gen_msg_cnt)) + # printf %(..)T is bash 4.2+ feature. use perl fallback if needed... + TZ=UTC printf -v template[date] "%(%a, %d %b %Y %T %z)T" $date_secs 2>/dev/null || + template[date]=`perl -le 'use POSIX "strftime"; + @time = gmtime '"$date_secs"'; + print strftime "%a, %d %b %Y %T +0000", @time'` fi additional_headers="" @@ -459,7 +477,6 @@ emacs_deliver_message () (mail-host-address \"example.com\") (smtpmail-smtp-server \"localhost\") (smtpmail-smtp-service \"25025\")) - (notmuch-hello) (notmuch-mua-mail) (message-goto-to) (insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\") @@ -477,6 +494,36 @@ emacs_deliver_message () notmuch new >/dev/null } +# Pretend to deliver a message with emacs. Really save it to a file +# and add it to the database +# +# Uses emacs to generate and deliver a message to the mail store. +# Accepts arbitrary extra emacs/elisp functions to modify the message +# before sending, which is useful to doing things like attaching files +# to the message and encrypting/signing. +emacs_fcc_message () +{ + local subject="$1" + local body="$2" + shift 2 + # before we can send a message, we have to prepare the FCC maildir + mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp} + + test_emacs \ + "(let ((message-send-mail-function (lambda () t)) + (mail-host-address \"example.com\")) + (notmuch-mua-mail) + (message-goto-to) + (insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\") + (message-goto-subject) + (insert \"${subject}\") + (message-goto-body) + (insert \"${body}\") + $@ + (message-send-and-exit))" || return 1 + 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 @@ -503,11 +550,10 @@ test_begin_subtest () fi test_subtest_name="$1" test_reset_state_ - # Remember stdout and stderr file descriptors and redirect test - # output to the previously prepared file descriptors 3 and 4 (see - # below) + # 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 + exec >&3 2>&4 inside_subtest=t } @@ -581,6 +627,12 @@ test_expect_equal_json () { test_expect_equal "$output" "$expected" "$@" } +# Sort the top-level list of JSON data from stdin. +test_sort_json () { + PYTHONIOENCODING=utf-8 python -c \ + "import sys, json; json.dump(sorted(json.load(sys.stdin)),sys.stdout)" +} + test_emacs_expect_t () { test "$#" = 2 && { prereq=$1; shift; } || prereq= test "$#" = 1 || @@ -620,6 +672,11 @@ notmuch_search_sanitize () perl -pe 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/' } +notmuch_search_files_sanitize() +{ + sed -e "s,$MAIL_DIR,MAIL_DIR," +} + NOTMUCH_SHOW_FILENAME_SQUELCH='s,filename:.*/mail,filename:/XXX/mail,' notmuch_show_sanitize () { @@ -629,14 +686,18 @@ notmuch_show_sanitize_all () { sed \ -e 's| filename:.*| filename:XXXXX|' \ - -e 's| id:[^ ]* | id:XXXXX |' + -e 's| id:[^ ]* | id:XXXXX |' | \ + notmuch_date_sanitize } notmuch_json_show_sanitize () { sed \ -e 's|"id": "[^"]*",|"id": "XXXXX",|g' \ - -e 's|"filename": "/[^"]*",|"filename": "YYYYY",|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' } notmuch_emacs_error_sanitize () @@ -650,6 +711,12 @@ notmuch_emacs_error_sanitize () -e 's/^\[.*\]$/[XXX]/' \ -e "s|^\(command: \)\{0,1\}/.*/$command|\1YYY/$command|" } + +notmuch_date_sanitize () +{ + sed \ + -e 's/^Date: Fri, 05 Jan 2001 .*0000/Date: GENERATED_DATE/' +} # End of notmuch helper functions # Use test_set_prereq to tell that a particular prerequisite is available. @@ -717,6 +784,9 @@ test_ok_ () { return fi test_success=$(($test_success + 1)) + if test -n "$NOTMUCH_TEST_QUIET"; then + return 0 + fi say_color pass "%-6s" "PASS" echo " $test_subtest_name" } @@ -727,6 +797,7 @@ test_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 @@ -775,6 +846,12 @@ test_skip () { case $this_test.$test_count in $skp) to_skip=t + break + esac + case $this_test_bare.$test_count in + $skp) + to_skip=t + break esac done if test -z "$to_skip" && test -n "$prereq" && @@ -867,7 +944,7 @@ test_expect_code () { test_external () { test "$#" = 4 && { prereq=$1; shift; } || prereq= test "$#" = 3 || - error >&5 "bug in the test script: not 3 or 4 parameters to test_external" + error >&6 "bug in the test script: not 3 or 4 parameters to test_external" test_subtest_name="$1" shift test_reset_state_ @@ -1010,15 +1087,14 @@ export NOTMUCH_CONFIG=$NOTMUCH_CONFIG # Here's what we are using here: # -# --no-init-file Don't load users ~/.emacs -# -# --no-site-file Don't load the site-wide startup stuff +# --quick Use minimal customization. This implies --no-init-file, +# --no-site-file and (emacs 24) --no-site-lisp # # --directory Ensure that the local elisp sources are found # # --load Force loading of notmuch.el and test-lib.el -exec ${TEST_EMACS} --no-init-file --no-site-file \ +exec ${TEST_EMACS} --quick \ --directory "$TEST_DIRECTORY/../emacs" --load notmuch.el \ --directory "$TEST_DIRECTORY" --load test-lib.el \ "\$@" @@ -1035,7 +1111,7 @@ test_emacs () { test -z "$missing_dependencies" || return if [ -z "$EMACS_SERVER" ]; then - emacs_tests="${this_test}.el" + emacs_tests="${this_test_bare}.el" if [ -f "$TEST_DIRECTORY/$emacs_tests" ]; then load_emacs_tests="--eval '(load \"$emacs_tests\")'" else @@ -1068,7 +1144,7 @@ test_emacs () { rm -f OUTPUT touch OUTPUT - ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(progn $@)" + ${TEST_EMACSCLIENT} --socket-name="$EMACS_SERVER" --eval "(notmuch-test-progn $@)" } test_python() { @@ -1157,6 +1233,12 @@ do case "$this_test" in $skp) to_skip=t + break + esac + case "$this_test_bare" in + $skp) + to_skip=t + break esac done case "$to_skip" in