X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=test%2Fnotmuch-test;h=14747bdbfc44d040cc0118d3d84328a7c69e6e06;hb=4612f3eb3dbf16bf98ccbadef77d7a6f6361e692;hp=d7b85c0383d4c3a161637f219085a190237f1004;hpb=a2d919eb2f55ab503a95f5401c19cc162a7a46a0;p=notmuch diff --git a/test/notmuch-test b/test/notmuch-test index d7b85c03..14747bdb 100755 --- a/test/notmuch-test +++ b/test/notmuch-test @@ -1,220 +1,99 @@ -#!/bin/sh -set -e +#!/usr/bin/env bash -find_notmuch_binary () -{ - dir=$1 - - while [ -n "$dir" ]; do - bin=$dir/notmuch - if [ -x $bin ]; then - echo $bin - return - fi - dir=$(dirname $dir) - if [ "$dir" = "/" ]; then - break - fi - done - - echo notmuch -} - -# Generate a new message in the mail directory, with -# a unique message ID and subject. +# Run tests # -# The filename of the message generated is available as -# $gen_msg_filename -gen_msg_cnt=0 -gen_msg_filename="" -generate_message () -{ - gen_msg_cnt=$((gen_msg_cnt + 1)) - gen_msg_name=msg-$(printf "%03d" $gen_msg_cnt) - - if [ "$#" = "0" ]; then - gen_msg_filename="${MAIL_DIR}/$gen_msg_name" +# Copyright (c) 2005 Junio C Hamano +# Copyright (c) 2010 Notmuch Developers +# +# Adapted from a Makefile to a shell script by Carl Worth (2010) + +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 + +# Ensure NOTMUCH_SRCDIR and NOTMUCH_BUILDDIR are set. +. $(dirname "$0")/export-dirs.sh || exit 1 + +set -eu + +TESTS= +for test in ${NOTMUCH_TESTS-}; do + TESTS="$TESTS $NOTMUCH_SRCDIR/test/$test" +done + +if [ -z "$TESTS" ]; then + TESTS="$NOTMUCH_SRCDIR/test/T[0-9][0-9][0-9]-*.sh" +fi + +# Clean up any results from a previous run +rm -rf $NOTMUCH_BUILDDIR/test/test-results + +# Test for timeout utility +if command -v timeout >/dev/null; then + TEST_TIMEOUT=${NOTMUCH_TEST_TIMEOUT:-2m} + if [ "$TEST_TIMEOUT" = 0 ]; then + TEST_TIMEOUT_CMD="" + echo "INFO: timeout disabled" else - gen_msg_filename="${MAIL_DIR}/$1/$gen_msg_name" - mkdir -p $(dirname $gen_msg_filename) + TEST_TIMEOUT_CMD="timeout $TEST_TIMEOUT" + echo "INFO: using $TEST_TIMEOUT timeout for tests" fi +else + TEST_TIMEOUT_CMD="" +fi + +META_FAILURE= +RES=0 +# Run the tests +if test -z "${NOTMUCH_TEST_SERIALIZE-}" && command -v parallel >/dev/null ; then + test -t 1 && export COLORS_WITHOUT_TTY=t || : + if parallel --minversion 0 >/dev/null 2>&1 ; then + echo "INFO: running tests with GNU parallel" + printf '%s\n' $TESTS | $TEST_TIMEOUT_CMD parallel || RES=$? + else + echo "INFO: running tests with moreutils parallel" + $TEST_TIMEOUT_CMD parallel -- $TESTS || RES=$? + fi + if [ $RES != 0 ]; then + META_FAILURE="parallel test suite returned error code $RES" + fi +else + trap 'e=$?; trap - 0; kill ${!-}; exit $e' 0 HUP INT TERM + for test in $TESTS; do + $TEST_TIMEOUT_CMD $test "$@" & + wait $! && ev=0 || ev=$? + test $ev = 0 || RES=$ev + done + trap - 0 HUP INT TERM + if [ $RES != 0 ]; then + META_FAILURE="some tests failed; first failed returned error code $RES" + fi +fi + +# Report results +RESULT_FILES= +for file in $TESTS +do + file=${file##*/} # drop leading path components + file=${file%.sh} # drop trailing '.sh' + RESULT_FILES="$RESULT_FILES $NOTMUCH_BUILDDIR/test/test-results/$file" +done + +echo +$NOTMUCH_SRCDIR/test/aggregate-results.sh $RESULT_FILES && ev=0 || ev=$? + +if [ -n "$META_FAILURE" ]; then + printf 'ERROR: %s\n' "$META_FAILURE" + if [ $ev = 0 ]; then + ev=$RES + fi +fi -cat <$gen_msg_filename -From: Notmuch Test Suite -To: Notmuch Test Suite -Message-Id: -Subject: Test message ${gen_msg_filename} -Date: Tue, 05 Jan 2010 15:43:57 -0800 - -This is just a test message at ${gen_msg_filename} -EOF -} - -do_sleep () -{ - sleep 1 -} - -TEST_DIR=$(pwd)/test.$$ -MAIL_DIR=${TEST_DIR}/mail -export NOTMUCH_CONFIG=${TEST_DIR}/notmuch-config -NOTMUCH=$(find_notmuch_binary $(pwd)) - -rm -rf ${TEST_DIR} -mkdir ${TEST_DIR} -cd ${TEST_DIR} - -mkdir ${MAIL_DIR} - -cat < ${NOTMUCH_CONFIG} -[database] -path=${MAIL_DIR} - -[user] -name=Notmuch Test Suite -primary_email=test_suite@notmuchmail.org -EOF - -echo "### Testing \"notmuch new\" with no messages" -$NOTMUCH new - -echo "### Testing \"notmuch new\" with 1 new message" -do_sleep -generate_message -$NOTMUCH new - -echo "### Testing \"notmuch new\" with 2 new messages" -do_sleep -generate_message -generate_message -$NOTMUCH new - -echo "### Testing \"notmuch new\" with no new messages (and a non-empty database)" - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with two new directories (one mail)" -rm -rf ${MAIL_DIR}/* ${MAIL_DIR}/.notmuch -mkdir ${MAIL_DIR}/def -mkdir ${MAIL_DIR}/ghi -generate_message def - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with two new directories (one mail)---opposite inode order" - -rm -rf ${MAIL_DIR}/.notmuch -mv ${MAIL_DIR}/ghi ${MAIL_DIR}/abc -rm ${MAIL_DIR}/def/* -generate_message abc - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with 1 old message moved into the mail store" -rm -rf ${MAIL_DIR}/* ${MAIL_DIR}/.notmuch -generate_message -tmp_msg_filename=tmp/$gen_msg_filename -mkdir -p $(dirname $tmp_msg_filename) -mv $gen_msg_filename $tmp_msg_filename -do_sleep -$NOTMUCH new > /dev/null -do_sleep -mv $tmp_msg_filename $gen_msg_filename -$NOTMUCH new - -echo "### Testing \"notmuch new\" with 1 renamed message" - -do_sleep -generate_message -$NOTMUCH new > /dev/null -do_sleep -mv $gen_msg_filename ${gen_msg_filename}-renamed -$NOTMUCH new - -echo "### Testing \"notmuch new\" with 1 deleted message" - -do_sleep -rm ${gen_msg_filename}-renamed -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a new directory with 3 messages" - -do_sleep -generate_message dir -generate_message dir -generate_message dir - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a renamed directory of 3 messages" - -do_sleep -mv ${MAIL_DIR}/dir ${MAIL_DIR}/dir-renamed - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a deleted directory of 3 messages" - -do_sleep -rm -rf ${MAIL_DIR}/dir-renamed - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a new directory with 3 messages (tail of list)" - -do_sleep -generate_message zzz -generate_message zzz -generate_message zzz - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a deleted directory of 3 messages (tail of list)" - -do_sleep -rm -rf ${MAIL_DIR}/zzz - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a symlink to an external directory of 1 message" - -rm -rf ${MAIL_DIR}/.notmuch -mv ${MAIL_DIR} ${TEST_DIR}/actual_maildir - -mkdir ${MAIL_DIR} -ln -s ${TEST_DIR}/actual_maildir ${MAIL_DIR}/symlink - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a symlink to an external file" -do_sleep -generate_message -external_msg_filename=${TEST_DIR}/external/$(basename $gen_msg_filename) -mkdir -p $(dirname $external_msg_filename) -mv $gen_msg_filename $external_msg_filename -ln -s $external_msg_filename $gen_msg_filename - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with a two-level directory with 3 files" - -do_sleep -generate_message two/levels -generate_message two/levels -generate_message two/levels - -$NOTMUCH new - -echo "### Testing \"notmuch new\" with deletion of two-level directory (3 files)" - -do_sleep -rm -rf ${MAIL_DIR}/two - -$NOTMUCH new - -cat <