notmuch/test/notmuch-test
Carl Worth 5a4532860c notmuch-test: Eliminate sleeps to speed up test suite run
We were sleeping merely to ensure that our updates to the mail store
would result in the mtime of the appropriate directories being
updated. We make the test suite run faster by not sleeping, but
instead explicitly updating the mtime of the directory to a future
time with touch.

We're careful to ensure that the time is not merely in the future
compared to the current time, but also later than any previous update
to the same directory mtime.
2010-02-04 12:10:42 -08:00

294 lines
7 KiB
Bash
Executable file

#!/bin/bash
set -e
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
}
increment_mtime_amount=0
increment_mtime ()
{
dir=$1
increment_mtime_amount=$((increment_mtime_amount + 1))
touch -d "+${increment_mtime_amount} seconds" $dir
}
# Generate a new message in the mail directory, with
# a unique message ID and subject.
#
# The filename of the message generated is available as
# $gen_msg_filename
#
# This function supports named parameters with the bash syntax for
# assigning a value to an associative array ([name]=value). The
# supported parameters are:
#
# [dir]=directory/of/choice
#
# Generate the message in directory 'directory/of/choice' within
# the mail store. The directory will be created if necessary.
#
# [body]=text
#
# Text to use as the body of the email message
#
# '[from]="Some User <user@example.com>"'
# '[to]="Some User <user@example.com>"'
# '[subject]="Subject of email message"'
#
# Values for email headers. If not provided, default values will
# be generated instead.
#
# '[cc]="Some User <user@example.com>"'
# [in-reply-to]=<message-id>
#
# Additional values for email headers. If these are not provided
# then the relevant headers will simply not appear in the
# message.
gen_msg_cnt=0
gen_msg_filename=""
generate_message ()
{
# This is our (bash-specific) magic for doing named parameters
local -A template="($@)"
local additional_headers
gen_msg_cnt=$((gen_msg_cnt + 1))
gen_msg_name=msg-$(printf "%03d" $gen_msg_cnt)
if [ -z "${template[dir]}" ]; then
gen_msg_filename="${MAIL_DIR}/$gen_msg_name"
else
gen_msg_filename="${MAIL_DIR}/${template[dir]}/$gen_msg_name"
mkdir -p $(dirname $gen_msg_filename)
fi
if [ -z "${template[body]}" ]; then
template[body]="This is just a test message at ${gen_msg_filename}"
fi
if [ -z "${template[from]}" ]; then
template[from]="Notmuch Test Suite <test_suite@notmuchmail.org>"
fi
if [ -z "${template[to]}" ]; then
template[to]="Notmuch Test Suite <test_suite@notmuchmail.org>"
fi
if [ -z "${template[subject]}" ]; then
template[subject]="Test message ${gen_msg_filename}"
fi
additional_headers=""
if [ ! -z "${template[cc]}" ]; then
additional_headers="Cc: ${template[cc]}
${additional_headers}"
fi
if [ ! -z "${template[in-reply-to]}" ]; then
additional_headers="In-Reply-To: ${template[in-reply-to]}
${additional_headers}"
fi
cat <<EOF >$gen_msg_filename
From: ${template[from]}
To: ${template[to]}
Message-Id: <msg-${gen_msg_cnt}@notmuch-test-suite>
Subject: ${template[subject]}
Date: Tue, 05 Jan 2010 15:43:57 -0800
${additional_headers}
${template[body]}
EOF
}
# Ensure that the mtime of the containing directory is updated
increment_mtime $(dirname ${gen_msg_filename})
}
NOTMUCH_IGNORED_OUTPUT_REGEXP='^Processed [0-9]*( total)? file|Found [0-9]* total file'
execute_expecting ()
{
args=$1
expected=$2
output=$($NOTMUCH $args | grep -v -E -e "$NOTMUCH_IGNORED_OUTPUT_REGEXP")
if [ "$output" = "$expected" ]; then
echo " PASS"
else
echo " FAIL"
echo " Expected output: $expected"
echo " Actual output: $output"
fi
}
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 <<EOF > ${NOTMUCH_CONFIG}
[database]
path=${MAIL_DIR}
[user]
name=Notmuch Test Suite
primary_email=test_suite@notmuchmail.org
EOF
printf "Testing \"notmuch new\" in several variations:\n"
printf " No new messages...\t\t"
execute_expecting new "No new mail."
printf " Single new message...\t\t"
generate_message
execute_expecting new "Added 1 new message to the database."
printf " Multiple new messages...\t"
generate_message
generate_message
execute_expecting new "Added 2 new messages to the database."
printf " No new messages (non-empty DB)... "
execute_expecting new "No new mail."
printf " New directories...\t\t"
rm -rf ${MAIL_DIR}/* ${MAIL_DIR}/.notmuch
mkdir ${MAIL_DIR}/def
mkdir ${MAIL_DIR}/ghi
generate_message [dir]=def
execute_expecting new "Added 1 new message to the database."
printf " Alternate inode order...\t"
rm -rf ${MAIL_DIR}/.notmuch
mv ${MAIL_DIR}/ghi ${MAIL_DIR}/abc
rm ${MAIL_DIR}/def/*
generate_message [dir]=abc
execute_expecting new "Added 1 new message to the database."
printf " Message moved in...\t\t"
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
increment_mtime ${MAIL_DIR}
$NOTMUCH new > /dev/null
mv $tmp_msg_filename $gen_msg_filename
increment_mtime ${MAIL_DIR}
execute_expecting new "Added 1 new message to the database."
printf " Renamed message...\t\t"
generate_message
$NOTMUCH new > /dev/null
mv $gen_msg_filename ${gen_msg_filename}-renamed
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Detected 1 file rename."
printf " Deleted message...\t\t"
rm ${gen_msg_filename}-renamed
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Removed 1 message."
printf " Renamed directory...\t\t"
generate_message [dir]=dir
generate_message [dir]=dir
generate_message [dir]=dir
$NOTMUCH new > /dev/null
mv ${MAIL_DIR}/dir ${MAIL_DIR}/dir-renamed
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Detected 3 file renames."
printf " Deleted directory...\t\t"
rm -rf ${MAIL_DIR}/dir-renamed
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Removed 3 messages."
printf " New directory (at end of list)... "
generate_message [dir]=zzz
generate_message [dir]=zzz
generate_message [dir]=zzz
execute_expecting new "Added 3 new messages to the database."
printf " Deleted directory (end of list)... "
rm -rf ${MAIL_DIR}/zzz
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Removed 3 messages."
printf " New symlink to directory...\t"
rm -rf ${MAIL_DIR}/.notmuch
mv ${MAIL_DIR} ${TEST_DIR}/actual_maildir
mkdir ${MAIL_DIR}
ln -s ${TEST_DIR}/actual_maildir ${MAIL_DIR}/symlink
execute_expecting new "Added 1 new message to the database."
printf " New symlink to a file...\t"
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
increment_mtime ${MAIL_DIR}
execute_expecting new "Added 1 new message to the database."
printf " New two-level directory...\t"
generate_message [dir]=two/levels
generate_message [dir]=two/levels
generate_message [dir]=two/levels
execute_expecting new "Added 3 new messages to the database."
printf " Deleted two-level directory... "
rm -rf ${MAIL_DIR}/two
increment_mtime ${MAIL_DIR}
execute_expecting new "No new mail. Removed 3 messages."
cat <<EOF
Notmuch test suite complete.
Intermediate state can be examined in:
${TEST_DIR}
EOF