[PATCH v2 4/5] Convert the actual tests to the new framework

Michal Sojka sojkam1 at fel.cvut.cz
Mon May 10 09:48:03 PDT 2010


The changes are:
- The notmuch-test was split into several files (t000?-*.sh).
- Removed helper functions which were moved to test-lib.sh
- Replaced every printf with test_expect_success.
- Test commands chained with && (test-lib.sh doesn't use "set -e" in
  order to complete the test suite even if something fails)
- Many variables such as ${MAIL_DIR} were properly quoted as they
  contain spaces.
- Changed quoting patterns in add_message and generate_message (single
  quotes are already used by the test framework).
- ${TEST_DIR} replaced by ${PWD}

QUICK HOWTO:

To run the whole test suite
    make

To run only a single test
   ./t0001-new.sh

To stop on the first error
   ./t0001-new.sh -i
then mail store and database can be inspected in
"trash directory.t0001-new"

To see the output of tests
   ./t0001-new.sh -v

To not remove trash directory at the end:
   ./t0001-new.sh -d

To run all tests verbosely:
   make GIT_TEST_OPTS="-v"

Signed-off-by: Michal Sojka <sojkam1 at fel.cvut.cz>
---
 test/notmuch-test                    | 1114 +---------------------------------
 test/t0000-basic.sh                  |    2 +-
 test/t0001-new.sh                    |  164 +++++
 test/t0002-search.sh                 |  111 ++++
 test/t0003-json.sh                   |   46 ++
 test/t0004-thread-naming.sh          |  191 ++++++
 test/t0005-reply.sh                  |  122 ++++
 test/t0006-dump-restore.sh           |   30 +
 test/t0007-uuencode.sh               |   36 ++
 test/t0008-threading-out-of-order.sh |   31 +
 test/t0009-author-reordering.sh      |   35 ++
 test/t0010-from-line-heuristics.sh   |  214 +++++++
 12 files changed, 983 insertions(+), 1113 deletions(-)
 create mode 100755 test/t0001-new.sh
 create mode 100755 test/t0002-search.sh
 create mode 100755 test/t0003-json.sh
 create mode 100755 test/t0004-thread-naming.sh
 create mode 100755 test/t0005-reply.sh
 create mode 100755 test/t0006-dump-restore.sh
 create mode 100755 test/t0007-uuencode.sh
 create mode 100755 test/t0008-threading-out-of-order.sh
 create mode 100755 test/t0009-author-reordering.sh
 create mode 100755 test/t0010-from-line-heuristics.sh

diff --git a/test/notmuch-test b/test/notmuch-test
index a861df1..5c066ed 100755
--- a/test/notmuch-test
+++ b/test/notmuch-test
@@ -1,1114 +1,4 @@
 #!/bin/bash
-set -e
 
-# Messages contain time/date values with time zone and notmuch
-# displays them converted to the local time zone. We need to set fixed
-# timezone here so that the output of the tests is always the same
-# without regard to the time zone of where the test suite is run.
-export TZ=UTC+8
-
-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 message is not added to the index.
-#
-# After this function returns, the filename of the generated message
-# is available as $gen_msg_filename and the message ID is available as
-# $gen_msg_id .
-#
-# 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 at example.com>"'
-#  '[to]="Some User <user at example.com>"'
-#  '[subject]="Subject of email message"'
-#  '[date]="RFC 822 Date"'
-#
-#	Values for email headers. If not provided, default values will
-#	be generated instead.
-#
-#  '[cc]="Some User <user at example.com>"'
-#  [reply-to]=some-address
-#  [in-reply-to]=<message-id>
-#  '[header]=full header line, including keyword'
-#
-#	Additional values for email headers. If these are not provided
-#	then the relevant headers will simply not appear in the
-#	message.
-#
-#  '[id]=<message-id>'
-#
-#	Controls the message-id of the created message.
-gen_msg_cnt=0
-gen_msg_filename=""
-gen_msg_id=""
-generate_message ()
-{
-    # This is our (bash-specific) magic for doing named parameters
-    local -A template="($@)"
-    local additional_headers
-
-    if [ -z "${template[id]}" ]; then
-	gen_msg_cnt=$((gen_msg_cnt + 1))
-	gen_msg_name=msg-$(printf "%03d" $gen_msg_cnt)
-	gen_msg_id="${gen_msg_name}@notmuch-test-suite"
-    else
-	gen_msg_name="msg-${template[id]}"
-	gen_msg_id="${template[id]}"
-    fi
-
-    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 (#${gen_msg_cnt})"
-    fi
-
-    if [ -z "${template[from]}" ]; then
-	template[from]="Notmuch Test Suite <test_suite at notmuchmail.org>"
-    fi
-
-    if [ -z "${template[to]}" ]; then
-	template[to]="Notmuch Test Suite <test_suite at notmuchmail.org>"
-    fi
-
-    if [ -z "${template[subject]}" ]; then
-	template[subject]="Test message #${gen_msg_cnt}"
-    fi
-
-    if [ -z "${template[date]}" ]; then
-	template[date]="Tue, 05 Jan 2001 15:43:57 -0800"
-    fi
-
-    additional_headers=""
-    if [ ! -z "${template[header]}" ]; then
-	additional_headers="${template[header]}
-${additional_headers}"
-    fi
-
-    if [ ! -z "${template[reply-to]}" ]; then
-	additional_headers="Reply-To: ${template[reply-to]}
-${additional_headers}"
-    fi
-
-    if [ ! -z "${template[in-reply-to]}" ]; then
-	additional_headers="In-Reply-To: ${template[in-reply-to]}
-${additional_headers}"
-    fi
-
-    if [ ! -z "${template[cc]}" ]; then
-	additional_headers="Cc: ${template[cc]}
-${additional_headers}"
-    fi
-
-
-cat <<EOF >$gen_msg_filename
-From: ${template[from]}
-To: ${template[to]}
-Message-Id: <${gen_msg_id}>
-Subject: ${template[subject]}
-Date: ${template[date]}
-${additional_headers}
-${template[body]}
-EOF
-
-    # Ensure that the mtime of the containing directory is updated
-    increment_mtime $(dirname ${gen_msg_filename})
-}
-
-# Generate a new message and add it to the index.
-#
-# All of the arguments and return values supported by generate_message
-# are also supported here, so see that function for details.
-add_message ()
-{
-    generate_message "$@"
-
-    $NOTMUCH new > /dev/null
-}
-
-tests=0
-test_failures=0
-
-pass_if_equal ()
-{
-    output=$1
-    expected=$2
-
-    tests=$((tests + 1))
-
-    if [ "$output" = "$expected" ]; then
-	echo "	PASS"
-    else
-	echo "	FAIL"
-	testname=test-$(printf "%03d" $tests)
-	echo "$expected" > $testname.expected
-	echo "$output" > $testname.output
-	diff -u $testname.expected $testname.output || true
-	test_failures=$((test_failures + 1))
-    fi
-}
-
-TEST_DIR=$(pwd)/test.$$
-MAIL_DIR=${TEST_DIR}/mail
-export NOTMUCH_CONFIG=${TEST_DIR}/notmuch-config
-NOTMUCH=$(find_notmuch_binary $(pwd))
-
-NOTMUCH_NEW ()
-{
-    $NOTMUCH new | grep -v -E -e '^Processed [0-9]*( total)? file|Found [0-9]* total file'
-}
-
-notmuch_search_sanitize ()
-{
-    sed -r -e 's/("?thread"?: ?)("?)................("?)/\1\2XXX\3/'
-}
-
-NOTMUCH_SHOW_FILENAME_SQUELCH='s,filename:.*/mail,filename:/XXX/mail,'
-notmuch_show_sanitize ()
-{
-    sed -e "$NOTMUCH_SHOW_FILENAME_SQUELCH"
-}
-
-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 at notmuchmail.org
-other_email=test_suite_other at notmuchmail.org;test_suite at otherdomain.org
-EOF
-
-printf "Testing \"notmuch new\" in several variations:\n"
-printf " No new messages...\t\t\t\t"
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail."
-
-printf " Single new message...\t\t\t\t"
-generate_message
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " Multiple new messages...\t\t\t"
-generate_message
-generate_message
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 2 new messages to the database."
-
-printf " No new messages (non-empty DB)...\t\t"
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail."
-
-printf " New directories...\t\t\t\t"
-rm -rf ${MAIL_DIR}/* ${MAIL_DIR}/.notmuch
-mkdir ${MAIL_DIR}/def
-mkdir ${MAIL_DIR}/ghi
-generate_message [dir]=def
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " Alternate inode order...\t\t\t"
-
-rm -rf ${MAIL_DIR}/.notmuch
-mv ${MAIL_DIR}/ghi ${MAIL_DIR}/abc
-rm ${MAIL_DIR}/def/*
-generate_message [dir]=abc
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " Message moved in...\t\t\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}
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " Renamed message...\t\t\t\t"
-
-generate_message
-$NOTMUCH new > /dev/null
-mv $gen_msg_filename ${gen_msg_filename}-renamed
-increment_mtime ${MAIL_DIR}
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Detected 1 file rename."
-
-printf " Deleted message...\t\t\t\t"
-
-rm ${gen_msg_filename}-renamed
-increment_mtime ${MAIL_DIR}
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Removed 1 message."
-
-printf " Renamed directory...\t\t\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}
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Detected 3 file renames."
-
-printf " Deleted directory...\t\t\t\t"
-
-rm -rf ${MAIL_DIR}/dir-renamed
-increment_mtime ${MAIL_DIR}
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Removed 3 messages."
-
-printf " New directory (at end of list)...\t\t"
-
-generate_message [dir]=zzz
-generate_message [dir]=zzz
-generate_message [dir]=zzz
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 3 new messages to the database."
-
-printf " Deleted directory (end of list)...\t\t"
-
-rm -rf ${MAIL_DIR}/zzz
-increment_mtime ${MAIL_DIR}
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Removed 3 messages."
-
-printf " New symlink to directory...\t\t\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
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " New symlink to a file...\t\t\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}
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-
-printf " New two-level directory...\t\t\t"
-
-generate_message [dir]=two/levels
-generate_message [dir]=two/levels
-generate_message [dir]=two/levels
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 3 new messages to the database."
-
-printf " Deleted two-level directory...\t\t\t"
-
-rm -rf ${MAIL_DIR}/two
-increment_mtime ${MAIL_DIR}
-
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "No new mail. Removed 3 messages."
-
-printf "\nTesting \"notmuch search\" in several variations:\n"
-
-printf " Search body...\t\t\t\t\t"
-add_message '[subject]="body search"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [body]=bodysearchtest
-output=$($NOTMUCH search bodysearchtest | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)"
-
-printf " Search by from:...\t\t\t\t"
-add_message '[subject]="search by from"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [from]=searchbyfrom
-output=$($NOTMUCH search from:searchbyfrom | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] searchbyfrom; search by from (inbox unread)"
-
-printf " Search by to:...\t\t\t\t"
-add_message '[subject]="search by to"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [to]=searchbyto
-output=$($NOTMUCH search to:searchbyto | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (inbox unread)"
-
-printf " Search by subject:...\t\t\t\t"
-add_message [subject]=subjectsearchtest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$($NOTMUCH search subject:subjectsearchtest | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subjectsearchtest (inbox unread)"
-
-printf " Search by id:...\t\t\t\t"
-add_message '[subject]="search by id"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$($NOTMUCH search id:${gen_msg_id} | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by id (inbox unread)"
-
-printf " Search by tag:...\t\t\t\t"
-add_message '[subject]="search by tag"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-$NOTMUCH tag +searchbytag id:${gen_msg_id}
-output=$($NOTMUCH search tag:searchbytag | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by tag (inbox searchbytag unread)"
-
-printf " Search by thread:...\t\t\t\t"
-add_message '[subject]="search by thread"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-thread_id=$($NOTMUCH search id:${gen_msg_id} | sed -e 's/thread:\([a-f0-9]*\).*/\1/')
-output=$($NOTMUCH search thread:${thread_id} | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by thread (inbox unread)"
-
-printf " Search body (phrase)...\t\t\t"
-add_message '[subject]="body search (phrase)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="body search (phrase)"'
-add_message '[subject]="negative result"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="This phrase should not match the body search"'
-output=$($NOTMUCH search '\"body search (phrase)\"' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (phrase) (inbox unread)"
-
-printf " Search by from: (address)...\t\t\t"
-add_message '[subject]="search by from (address)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [from]=searchbyfrom at example.com
-output=$($NOTMUCH search from:searchbyfrom at example.com | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] searchbyfrom at example.com; search by from (address) (inbox unread)"
-
-printf " Search by from: (name)...\t\t\t"
-add_message '[subject]="search by from (name)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[from]="Search By From Name <test at example.com>"'
-output=$($NOTMUCH search from:'Search By From Name' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Search By From Name; search by from (name) (inbox unread)"
-
-printf " Search by to: (address)...\t\t\t"
-add_message '[subject]="search by to (address)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' [to]=searchbyto at example.com
-output=$($NOTMUCH search to:searchbyto at example.com | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (address) (inbox unread)"
-
-printf " Search by to: (name)...\t\t\t"
-add_message '[subject]="search by to (name)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[to]="Search By To Name <test at example.com>"'
-output=$($NOTMUCH search to:'Search By To Name' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (name) (inbox unread)"
-
-printf " Search by subject: (phrase)...\t\t\t"
-add_message '[subject]="subject search test (phrase)"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-add_message '[subject]="this phrase should not match the subject search test"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$($NOTMUCH search 'subject:\"subject search test (phrase)\"' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subject search test (phrase) (inbox unread)"
-
-printf " Search for all messages (\"*\"):...\t\t"
-output=$($NOTMUCH search '*' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-05 [1/1] Notmuch Test Suite; Test message #6 (inbox unread)
-thread:XXX   2001-01-05 [1/1] Notmuch Test Suite; Test message #14 (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)
-thread:XXX   2000-01-01 [1/1] searchbyfrom; search by from (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subjectsearchtest (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by id (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by tag (inbox searchbytag unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by thread (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (phrase) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; negative result (inbox unread)
-thread:XXX   2000-01-01 [1/1] searchbyfrom at example.com; search by from (address) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Search By From Name; search by from (name) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (address) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (name) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subject search test (phrase) (inbox unread)
-thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; this phrase should not match the subject search test (inbox unread)"
-
-printf " Search body (utf-8):...\t\t\t"
-add_message '[subject]="utf8-message-body-subject"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="message body utf8: bödý"'
-output=$($NOTMUCH search 'bödý' | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; utf8-message-body-subject (inbox unread)"
-
-printf "\nTesting --format=json output:\n"
-
-printf " Show message: json...\t\t\t\t"
-add_message '[subject]="json-show-subject"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="json-show-message"'
-output=$($NOTMUCH show --format=json 'json-show-message')
-pass_if_equal "$output" '[[[{"id": "'${gen_msg_id}'", "match": true, "filename": "'${gen_msg_filename}'", "timestamp": 946728000, "date_relative": "2000-01-01", "tags": ["inbox","unread"], "headers": {"Subject": "json-show-subject", "From": "Notmuch Test Suite <test_suite at notmuchmail.org>", "To": "Notmuch Test Suite <test_suite at notmuchmail.org>", "Cc": "", "Bcc": "", "Date": "Sat, 01 Jan 2000 12:00:00 -0000"}, "body": [{"id": 1, "content-type": "text/plain", "content": "json-show-message\n"}]}, []]]]'
-
-printf " Search message: json...\t\t\t"
-add_message '[subject]="json-search-subject"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="json-search-message"'
-output=$($NOTMUCH search --format=json 'json-search-message' | notmuch_search_sanitize)
-pass_if_equal "$output" '[{"thread": "XXX",
-"timestamp": 946728000,
-"matched": 1,
-"total": 1,
-"authors": "Notmuch Test Suite",
-"subject": "json-search-subject",
-"tags": ["inbox", "unread"]}]'
-
-printf " Search by subject (utf-8):...\t\t\t"
-add_message [subject]=utf8-sübjéct '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$($NOTMUCH search subject:utf8-sübjéct | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; utf8-sübjéct (inbox unread)"
-
-printf " Show message: json, utf-8...\t\t\t"
-add_message '[subject]="json-show-utf8-body-sübjéct"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="jsön-show-méssage"'
-output=$($NOTMUCH show --format=json 'jsön-show-méssage')
-pass_if_equal "$output" '[[[{"id": "'${gen_msg_id}'", "match": true, "filename": "'${gen_msg_filename}'", "timestamp": 946728000, "date_relative": "2000-01-01", "tags": ["inbox","unread"], "headers": {"Subject": "json-show-utf8-body-sübjéct", "From": "Notmuch Test Suite <test_suite at notmuchmail.org>", "To": "Notmuch Test Suite <test_suite at notmuchmail.org>", "Cc": "", "Bcc": "", "Date": "Sat, 01 Jan 2000 12:00:00 -0000"}, "body": [{"id": 1, "content-type": "text/plain", "content": "jsön-show-méssage\n"}]}, []]]]'
-
-printf " Search message: json, utf-8...\t\t\t"
-add_message '[subject]="json-search-utf8-body-sübjéct"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' '[body]="jsön-search-méssage"'
-output=$($NOTMUCH search --format=json 'jsön-search-méssage' | notmuch_search_sanitize)
-pass_if_equal "$output" '[{"thread": "XXX",
-"timestamp": 946728000,
-"matched": 1,
-"total": 1,
-"authors": "Notmuch Test Suite",
-"subject": "json-search-utf8-body-sübjéct",
-"tags": ["inbox", "unread"]}]'
-
-printf "\nTesting naming of threads with changing subject:\n"
-add_message '[subject]="thread-naming: Initial thread subject"' \
-            '[date]="Fri, 05 Jan 2001 15:43:56 -0800"'
-first=${gen_msg_cnt}
-parent=${gen_msg_id}
-add_message '[subject]="thread-naming: Older changed subject"' \
-            '[date]="Sat, 06 Jan 2001 15:43:56 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-add_message '[subject]="thread-naming: Newer changed subject"' \
-            '[date]="Sun, 07 Jan 2001 15:43:56 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-add_message '[subject]="thread-naming: Final thread subject"' \
-            '[date]="Mon, 08 Jan 2001 15:43:56 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-final=${gen_msg_id}
-
-printf " Initial thread name (oldest-first search)...\t"
-output=$($NOTMUCH search --sort=oldest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-05 [4/4] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
-
-printf " Initial thread name (newest-first search)...\t"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-08 [4/4] Notmuch Test Suite; thread-naming: Final thread subject (inbox unread)"
-
-# Remove oldest and newest messages from search results
-$NOTMUCH tag -inbox id:$parent or id:$final
-
-printf " Changed thread name (oldest-first search)...\t"
-output=$($NOTMUCH search --sort=oldest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-06 [2/4] Notmuch Test Suite; thread-naming: Older changed subject (inbox unread)"
-
-printf " Changed thread name (newest-first search)...\t"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-07 [2/4] Notmuch Test Suite; thread-naming: Newer changed subject (inbox unread)"
-
-printf " Ignore added reply prefix (Re:)...\t\t"
-add_message '[subject]="Re: thread-naming: Initial thread subject"' \
-            '[date]="Tue, 09 Jan 2001 15:43:45 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-09 [3/5] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
-
-printf " Ignore added reply prefix (Aw:)...\t\t"
-add_message '[subject]="Aw: thread-naming: Initial thread subject"' \
-            '[date]="Wed, 10 Jan 2001 15:43:45 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-10 [4/6] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
-
-printf " Ignore added reply prefix (Vs:)...\t\t"
-add_message '[subject]="Vs: thread-naming: Initial thread subject"' \
-            '[date]="Thu, 11 Jan 2001 15:43:45 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-11 [5/7] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
-
-printf " Ignore added reply prefix (Sv:)...\t\t"
-add_message '[subject]="Sv: thread-naming: Initial thread subject"' \
-            '[date]="Fri, 12 Jan 2001 15:43:45 -0800"' \
-            "[in-reply-to]=\<$parent\>"
-output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2001-01-12 [6/8] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
-
-printf " Test order of messages in \"notmuch show\"\t"
-output=$($NOTMUCH show thread-naming | notmuch_show_sanitize)
-pass_if_equal "$output" "message{ id:msg-$(printf "%03d" $first)@notmuch-test-suite depth:0 match:1 filename:/XXX/mail/msg-$(printf "%03d" $first)
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-05) (unread)
-Subject: thread-naming: Initial thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Fri, 05 Jan 2001 15:43:56 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$first)
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 1)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 1)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-06) (inbox unread)
-Subject: thread-naming: Older changed subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Sat, 06 Jan 2001 15:43:56 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 1)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 2)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 2)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-07) (inbox unread)
-Subject: thread-naming: Newer changed subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Sun, 07 Jan 2001 15:43:56 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 2)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 3)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 3)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-08) (unread)
-Subject: thread-naming: Final thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Mon, 08 Jan 2001 15:43:56 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 3)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 4)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 4)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-09) (inbox unread)
-Subject: Re: thread-naming: Initial thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Tue, 09 Jan 2001 15:43:45 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 4)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 5)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 5)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-10) (inbox unread)
-Subject: Aw: thread-naming: Initial thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Wed, 10 Jan 2001 15:43:45 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 5)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 6)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 6)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-11) (inbox unread)
-Subject: Vs: thread-naming: Initial thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Thu, 11 Jan 2001 15:43:45 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 6)))
-part}
-body}
-message}
-message{ id:msg-$(printf "%03d" $((first + 7)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 7)))
-header{
-Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-12) (inbox unread)
-Subject: Sv: thread-naming: Initial thread subject
-From: Notmuch Test Suite <test_suite at notmuchmail.org>
-To: Notmuch Test Suite <test_suite at notmuchmail.org>
-Date: Fri, 12 Jan 2001 15:43:45 -0800
-header}
-body{
-part{ ID: 1, Content-type: text/plain
-This is just a test message (#$((first + 7)))
-part}
-body}
-message}"
-
-printf "\nTesting \"notmuch reply\" in several variations:\n"
-
-printf " Basic reply...\t\t\t\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=test_suite at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="basic reply test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> basic reply test"
-
-printf " Multiple recipients...\t\t\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-            '[to]="test_suite at notmuchmail.org, Someone Else <someone at example.com>"' \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="Multiple recipients"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, Someone Else <someone at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> Multiple recipients"
-
-printf " Reply with CC...\t\t\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=test_suite at notmuchmail.org \
-            '[cc]="Other Parties <cc at example.com>"' \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="reply with CC"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>
-Cc: Other Parties <cc at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> reply with CC"
-
-printf " Reply from alternate address...\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=test_suite_other at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="reply from alternate address"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> reply from alternate address"
-
-printf " Support for Reply-To...\t\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=test_suite at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="support for reply-to"' \
-            '[reply-to]="Sender <elsewhere at example.com>"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <elsewhere at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> support for reply-to"
-
-printf " Un-munging Reply-To...\t\t\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-            '[to]="Some List <list at example.com>"' \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="Un-munging Reply-To"' \
-            '[reply-to]="Evil Munging List <list at example.com>"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, Some List <list at example.com>
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> Un-munging Reply-To"
-
-printf "\nTesting handling of uuencoded data:\n"
-
-add_message [subject]=uuencodetest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' \
-'[body]="This message is used to ensure that notmuch correctly handles a
-message containing a block of uuencoded data. First, we have a marker
-this content beforeuudata . Then we beging the uunencoded data itself:
-
-begin 644 bogus-uuencoded-data
-M0123456789012345678901234567890123456789012345678901234567890
-MOBVIOUSLY, THIS IS NOT ANY SORT OF USEFUL UUNECODED DATA.    
-MINSTEAD THIS IS JUST A WAY TO ENSURE THAT THIS BLOCK OF DATA 
-MIS CORRECTLY IGNORED WHEN NOTMUCH CREATES ITS INDEX. SO WE   
-MINCLUDE A DURINGUUDATA MARKER THAT SHOULD NOT RESULT IN ANY  
-MSEARCH RESULT.                                               
-\`
-end
-
-Finally, we have our afteruudata marker as well."'
-
-printf " Ensure content before uu data is indexed...\t"
-output=$($NOTMUCH search beforeuudata | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; uuencodetest (inbox unread)"
-printf " Ensure uu data is not indexed...\t\t"
-output=$($NOTMUCH search DURINGUUDATA | notmuch_search_sanitize)
-pass_if_equal "$output" ""
-printf " Ensure content after uu data is indexed...\t"
-output=$($NOTMUCH search afteruudata | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; uuencodetest (inbox unread)"
-
-printf "\nTesting \"notmuch dump\" and \"notmuch restore\":\n"
-
-printf " Dumping all tags...\t\t\t\t"
-$NOTMUCH dump dump.expected
-pass_if_equal "$?" "0"
-
-printf " Clearing all tags...\t\t\t\t"
-sed -e 's/(\([^(]*\))$/()/' < dump.expected > clear.expected
-$NOTMUCH restore clear.expected
-$NOTMUCH dump clear.actual
-pass_if_equal "$(< clear.actual)" "$(< clear.expected)"
-
-printf " Restoring original tags...\t\t\t"
-$NOTMUCH restore dump.expected
-$NOTMUCH dump dump.actual
-pass_if_equal "$(< dump.actual)" "$(< dump.expected)"
-
-printf " Restore with nothing to do...\t\t\t"
-$NOTMUCH restore dump.expected
-pass_if_equal "$?" "0"
-
-printf "\nTesting threading when messages received out of order:\n"
-printf " Adding initial child message...\t\t"
-generate_message [body]=foo '[in-reply-to]=\<parent-id\>' [subject]=brokenthreadtest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Searching returns the message...\t\t"
-output=$($NOTMUCH search foo | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; brokenthreadtest (inbox unread)"
-printf " Adding second child message...\t\t\t"
-generate_message [body]=foo '[in-reply-to]=\<parent-id\>' [subject]=brokenthreadtest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Searching returns both messages in one thread..."
-output=$($NOTMUCH search foo | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [2/2] Notmuch Test Suite; brokenthreadtest (inbox unread)"
-printf " Adding parent message...\t\t\t"
-generate_message [body]=foo [id]=parent-id [subject]=brokenthreadtest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Searching returns all three messages in one thread..."
-output=$($NOTMUCH search foo | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [3/3] Notmuch Test Suite; brokenthreadtest (inbox unread)"
-
-printf "\nTesting author reordering;\n"
-printf " Adding parent message...\t\t\t"
-generate_message [body]=findme [id]=new-parent-id [subject]=author-reorder-threadtest '[from]="User <user at example.com>"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Adding initial child message...\t\t"
-generate_message [body]=findme '[in-reply-to]=\<new-parent-id\>' [subject]=author-reorder-threadtest '[from]="User1 <user1 at example.com>"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Adding second child message...\t\t\t"
-generate_message [body]=findme '[in-reply-to]=\<new-parent-id\>' [subject]=author-reorder-threadtest '[from]="User2 <user2 at example.com>"' '[date]="Sat, 01 Jan 2000 12:00:00 -0000"'
-output=$(NOTMUCH_NEW)
-pass_if_equal "$output" "Added 1 new message to the database."
-printf " Searching when all three messages match...\t"
-output=$($NOTMUCH search findme | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [3/3] User, User1, User2; author-reorder-threadtest (inbox unread)"
-printf " Searching when two messages match...\t\t"
-output=$($NOTMUCH search User1 or User2 | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [2/3] User1, User2| User; author-reorder-threadtest (inbox unread)"
-printf " Searching when only one message matches...\t"
-output=$($NOTMUCH search User2 | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/3] User2| User, User1; author-reorder-threadtest (inbox unread)"
-printf " Searching when only first message matches...\t"
-output=$($NOTMUCH search User | notmuch_search_sanitize)
-pass_if_equal "$output" "thread:XXX   2000-01-01 [1/3] User| User1, User2; author-reorder-threadtest (inbox unread)"
-
-printf "\nTesting From line heuristics (with multiple configured addresses):\n"
-printf " Magic from guessing (nothing to go on)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Envelope-to:)...\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Envelope-To: test_suite_other at notmuchmail.org"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (X-Original-To:)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="X-Original-To: test_suite_other at notmuchmail.org"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Received: .. for ..)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Received: from mail.example.com (mail.example.com [1.1.1.1])\
-        by mail.notmuchmail.org (some MTA) with ESMTP id 12345678\
-        for <test_suite_other at notmuchmail.org>; Sat, 10 Apr 2010 07:54:51 -0400 (EDT)"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Received: domain)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Received: from mail.example.com (mail.example.com [1.1.1.1])\
-        by mail.otherdomain.org (some MTA) with ESMTP id 12345678\
-        Sat, 10 Apr 2010 07:54:51 -0400 (EDT)"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at otherdomain.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-
-printf "\nTesting From line heuristics (with single configured address):\n"
-sed -i -e 's/^other_email.*//' ${NOTMUCH_CONFIG}
-
-printf " Magic from guessing (nothing to go on)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Envelope-to:)...\t\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Envelope-To: test_suite_other at notmuchmail.org"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (X-Original-To:)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="X-Original-To: test_suite_other at notmuchmail.org"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Received: .. for ..)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Received: from mail.example.com (mail.example.com [1.1.1.1])\
-        by mail.notmuchmail.org (some MTA) with ESMTP id 12345678\
-        for <test_suite_other at notmuchmail.org>; Sat, 10 Apr 2010 07:54:51 -0400 (EDT)"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-printf " Magic from guessing (Received: domain)...\t"
-add_message '[from]="Sender <sender at example.com>"' \
-             [to]=mailinglist at notmuchmail.org \
-             [subject]=notmuch-reply-test \
-            '[header]="Received: from mail.example.com (mail.example.com [1.1.1.1])\
-        by mail.otherdomain.org (some MTA) with ESMTP id 12345678\
-        Sat, 10 Apr 2010 07:54:51 -0400 (EDT)"' \
-            '[date]="Tue, 05 Jan 2010 15:43:56 -0800"' \
-            '[body]="from guessing test"'
-
-output=$($NOTMUCH reply id:${gen_msg_id})
-pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
-Subject: Re: notmuch-reply-test
-To: Sender <sender at example.com>, mailinglist at notmuchmail.org
-Bcc: test_suite at notmuchmail.org
-In-Reply-To: <${gen_msg_id}>
-References: <${gen_msg_id}>
-
-On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
-> from guessing test"
-
-echo ""
-echo "Notmuch test suite complete."
-
-if [ "$test_failures" = "0" ]; then
-    echo "All $tests tests passed."
-    rm -rf ${TEST_DIR}
-else
-    echo "$test_failures/$tests tests failed. The failures can be investigated in:"
-    echo "${TEST_DIR}"
-fi
-
-echo ""
-
-exit $test_failures
+cd $(dirname $0)
+make
diff --git a/test/t0000-basic.sh b/test/t0000-basic.sh
index caade68..511e200 100755
--- a/test/t0000-basic.sh
+++ b/test/t0000-basic.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Copyright (c) 2005 Junio C Hamano
 #
diff --git a/test/t0001-new.sh b/test/t0001-new.sh
new file mode 100755
index 0000000..97726e7
--- /dev/null
+++ b/test/t0001-new.sh
@@ -0,0 +1,164 @@
+#!/bin/bash
+test_description="\"notmuch new\" in several variations"
+. ./test-lib.sh
+test_expect_success "No new messages" '
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail."
+
+'
+test_expect_success "Single new message" '
+generate_message &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "Multiple new messages" '
+generate_message &&
+generate_message &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 2 new messages to the database."
+
+'
+test_expect_success "No new messages (non-empty DB)" '
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail."
+
+'
+test_expect_success "New directories" '
+rm -rf "${MAIL_DIR}"/* "${MAIL_DIR}"/.notmuch &&
+mkdir "${MAIL_DIR}"/def &&
+mkdir "${MAIL_DIR}"/ghi &&
+generate_message [dir]=def &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "Alternate inode order" '
+
+rm -rf "${MAIL_DIR}"/.notmuch &&
+mv "${MAIL_DIR}"/ghi "${MAIL_DIR}"/abc &&
+rm "${MAIL_DIR}"/def/* &&
+generate_message [dir]=abc &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "Message moved in" '
+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}" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "Renamed message" '
+
+generate_message &&
+$NOTMUCH new > /dev/null &&
+mv "$gen_msg_filename" "${gen_msg_filename}"-renamed &&
+increment_mtime "${MAIL_DIR}" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Detected 1 file rename."
+
+'
+test_expect_success "Deleted message" '
+
+rm "${gen_msg_filename}"-renamed &&
+increment_mtime "${MAIL_DIR}" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Removed 1 message."
+
+'
+test_expect_success "Renamed directory" '
+
+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}" &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Detected 3 file renames."
+
+'
+test_expect_success "Deleted directory" '
+
+rm -rf "${MAIL_DIR}"/dir-renamed &&
+increment_mtime "${MAIL_DIR}" &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Removed 3 messages."
+
+'
+test_expect_success "New directory (at end of list)" '
+
+generate_message [dir]=zzz &&
+generate_message [dir]=zzz &&
+generate_message [dir]=zzz &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 3 new messages to the database."
+
+'
+test_expect_success "Deleted directory (end of list)" '
+
+rm -rf "${MAIL_DIR}"/zzz &&
+increment_mtime "${MAIL_DIR}" &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Removed 3 messages."
+
+'
+test_expect_success "New symlink to directory" '
+
+rm -rf "${MAIL_DIR}"/.notmuch &&
+mv "${MAIL_DIR}" "$PWD"/actual_maildir &&
+
+mkdir "${MAIL_DIR}" &&
+ln -s "$PWD"/actual_maildir "${MAIL_DIR}"/symlink &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "New symlink to a file" '
+generate_message &&
+external_msg_filename="$PWD"/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}" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+
+'
+test_expect_success "New two-level directory" '
+
+generate_message [dir]=two/levels &&
+generate_message [dir]=two/levels &&
+generate_message [dir]=two/levels &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 3 new messages to the database."
+
+'
+test_expect_success "Deleted two-level directory" '
+
+rm -rf "${MAIL_DIR}"/two &&
+increment_mtime "${MAIL_DIR}" &&
+
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "No new mail. Removed 3 messages."
+'
+test_done
diff --git a/test/t0002-search.sh b/test/t0002-search.sh
new file mode 100755
index 0000000..7de4d47
--- /dev/null
+++ b/test/t0002-search.sh
@@ -0,0 +1,111 @@
+#!/bin/bash
+test_description="\"notmuch search\" in several variations"
+. ./test-lib.sh
+
+test_expect_success "Search body" '
+add_message "[subject]=\"body search\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" [body]=bodysearchtest &&
+output=$($NOTMUCH search bodysearchtest | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)"
+
+'
+test_expect_success "Search by from:" '
+add_message "[subject]=\"search by from\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" [from]=searchbyfrom &&
+output=$($NOTMUCH search from:searchbyfrom | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] searchbyfrom; search by from (inbox unread)"
+
+'
+test_expect_success "Search by to:" '
+add_message "[subject]=\"search by to\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" [to]=searchbyto &&
+output=$($NOTMUCH search to:searchbyto | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (inbox unread)"
+
+'
+test_expect_success "Search by subject:" '
+add_message [subject]=subjectsearchtest "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$($NOTMUCH search subject:subjectsearchtest | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subjectsearchtest (inbox unread)"
+
+'
+test_expect_success "Search by id:" '
+add_message "[subject]=\"search by id\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$($NOTMUCH search id:${gen_msg_id} | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by id (inbox unread)"
+
+'
+test_expect_success "Search by tag:" '
+add_message "[subject]=\"search by tag\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+$NOTMUCH tag +searchbytag id:${gen_msg_id} &&
+output=$($NOTMUCH search tag:searchbytag | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by tag (inbox searchbytag unread)"
+
+'
+test_expect_success "Search by thread:" '
+add_message "[subject]=\"search by thread\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+thread_id=$($NOTMUCH search id:${gen_msg_id} | sed -e "s/thread:\([a-f0-9]*\).*/\1/") &&
+output=$($NOTMUCH search thread:${thread_id} | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by thread (inbox unread)"
+
+'
+test_expect_success "Search body (phrase)" '
+add_message "[subject]=\"body search (phrase)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"body search (phrase)\"" &&
+add_message "[subject]=\"negative result\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"This phrase should not match the body search\"" &&
+output=$($NOTMUCH search "\"body search (phrase)\"" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (phrase) (inbox unread)"
+
+'
+test_expect_success "Search by from: (address)" '
+add_message "[subject]=\"search by from (address)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" [from]=searchbyfrom at example.com &&
+output=$($NOTMUCH search from:searchbyfrom at example.com | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] searchbyfrom at example.com; search by from (address) (inbox unread)"
+
+'
+test_expect_success "Search by from: (name)" '
+add_message "[subject]=\"search by from (name)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[from]=\"Search By From Name <test at example.com>\"" &&
+output=$($NOTMUCH search from:"Search By From Name" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Search By From Name; search by from (name) (inbox unread)"
+
+'
+test_expect_success "Search by to: (address)" '
+add_message "[subject]=\"search by to (address)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" [to]=searchbyto at example.com &&
+output=$($NOTMUCH search to:searchbyto at example.com | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (address) (inbox unread)"
+
+'
+test_expect_success "Search by to: (name)" '
+add_message "[subject]=\"search by to (name)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[to]=\"Search By To Name <test at example.com>\"" &&
+output=$($NOTMUCH search to:"Search By To Name" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (name) (inbox unread)"
+
+'
+test_expect_success "Search by subject: (phrase)" '
+add_message "[subject]=\"subject search test (phrase)\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+add_message "[subject]=\"this phrase should not match the subject search test\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$($NOTMUCH search "subject:\"subject search test (phrase)\"" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subject search test (phrase) (inbox unread)"
+
+'
+test_expect_success "Search for all messages (\"*\"):" '
+output=$($NOTMUCH search "*" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (inbox unread)
+thread:XXX   2000-01-01 [1/1] searchbyfrom; search by from (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subjectsearchtest (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by id (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by tag (inbox searchbytag unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by thread (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; body search (phrase) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; negative result (inbox unread)
+thread:XXX   2000-01-01 [1/1] searchbyfrom at example.com; search by from (address) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Search By From Name; search by from (name) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (address) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; search by to (name) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; subject search test (phrase) (inbox unread)
+thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; this phrase should not match the subject search test (inbox unread)"
+
+'
+test_expect_success "Search body (utf-8):" '
+add_message "[subject]=\"utf8-message-body-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"message body utf8: bödý\"" &&
+output=$($NOTMUCH search "bödý" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; utf8-message-body-subject (inbox unread)"
+'
+test_done
diff --git a/test/t0003-json.sh b/test/t0003-json.sh
new file mode 100755
index 0000000..810262c
--- /dev/null
+++ b/test/t0003-json.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+test_description="--format=json output"
+. ./test-lib.sh
+
+test_expect_success "Show message: json" '
+add_message "[subject]=\"json-show-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"json-show-message\"" &&
+output=$($NOTMUCH show --format=json "json-show-message") &&
+pass_if_equal "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true, \"filename\": \"${gen_msg_filename}\", \"timestamp\": 946728000, \"date_relative\": \"2000-01-01\", \"tags\": [\"inbox\",\"unread\"], \"headers\": {\"Subject\": \"json-show-subject\", \"From\": \"Notmuch Test Suite <test_suite at notmuchmail.org>\", \"To\": \"Notmuch Test Suite <test_suite at notmuchmail.org>\", \"Cc\": \"\", \"Bcc\": \"\", \"Date\": \"Sat, 01 Jan 2000 12:00:00 -0000\"}, \"body\": [{\"id\": 1, \"content-type\": \"text/plain\", \"content\": \"json-show-message\n\"}]}, []]]]"
+
+'
+test_expect_success "Search message: json" '
+add_message "[subject]=\"json-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"json-search-message\"" &&
+output=$($NOTMUCH search --format=json "json-search-message" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "[{\"thread\": \"XXX\",
+\"timestamp\": 946728000,
+\"matched\": 1,
+\"total\": 1,
+\"authors\": \"Notmuch Test Suite\",
+\"subject\": \"json-search-subject\",
+\"tags\": [\"inbox\", \"unread\"]}]"
+
+'
+test_expect_success "Search by subject (utf-8):" '
+add_message [subject]=utf8-sübjéct "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$($NOTMUCH search subject:utf8-sübjéct | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; utf8-sübjéct (inbox unread)"
+
+'
+test_expect_success "Show message: json, utf-8" '
+add_message "[subject]=\"json-show-utf8-body-sübjéct\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"jsön-show-méssage\"" &&
+output=$($NOTMUCH show --format=json "jsön-show-méssage") &&
+pass_if_equal "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true, \"filename\": \"${gen_msg_filename}\", \"timestamp\": 946728000, \"date_relative\": \"2000-01-01\", \"tags\": [\"inbox\",\"unread\"], \"headers\": {\"Subject\": \"json-show-utf8-body-sübjéct\", \"From\": \"Notmuch Test Suite <test_suite at notmuchmail.org>\", \"To\": \"Notmuch Test Suite <test_suite at notmuchmail.org>\", \"Cc\": \"\", \"Bcc\": \"\", \"Date\": \"Sat, 01 Jan 2000 12:00:00 -0000\"}, \"body\": [{\"id\": 1, \"content-type\": \"text/plain\", \"content\": \"jsön-show-méssage\n\"}]}, []]]]"
+
+'
+test_expect_success "Search message: json, utf-8" '
+add_message "[subject]=\"json-search-utf8-body-sübjéct\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"jsön-search-méssage\"" &&
+output=$($NOTMUCH search --format=json "jsön-search-méssage" | notmuch_search_sanitize) &&
+pass_if_equal "$output" "[{\"thread\": \"XXX\",
+\"timestamp\": 946728000,
+\"matched\": 1,
+\"total\": 1,
+\"authors\": \"Notmuch Test Suite\",
+\"subject\": \"json-search-utf8-body-sübjéct\",
+\"tags\": [\"inbox\", \"unread\"]}]"
+'
+test_done
diff --git a/test/t0004-thread-naming.sh b/test/t0004-thread-naming.sh
new file mode 100755
index 0000000..88216f2
--- /dev/null
+++ b/test/t0004-thread-naming.sh
@@ -0,0 +1,191 @@
+#!/bin/bash
+test_description="naming of threads with changing subject"
+. ./test-lib.sh
+test_expect_success 'Generate some messages' '
+add_message "[subject]=\"thread-naming: Initial thread subject\"" \
+            "[date]=\"Fri, 05 Jan 2001 15:43:56 -0800\"" &&
+first=${gen_msg_cnt} &&
+parent=${gen_msg_id} &&
+add_message "[subject]=\"thread-naming: Older changed subject\"" \
+            "[date]=\"Sat, 06 Jan 2001 15:43:56 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+add_message "[subject]=\"thread-naming: Newer changed subject\"" \
+            "[date]=\"Sun, 07 Jan 2001 15:43:56 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+add_message "[subject]=\"thread-naming: Final thread subject\"" \
+            "[date]=\"Mon, 08 Jan 2001 15:43:56 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+final=${gen_msg_id}
+
+'
+test_expect_success "Initial thread name (oldest-first search)" '
+output=$($NOTMUCH search --sort=oldest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-05 [4/4] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
+
+'
+test_expect_success "Initial thread name (newest-first search)" '
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-08 [4/4] Notmuch Test Suite; thread-naming: Final thread subject (inbox unread)"
+
+# Remove oldest and newest messages from search results
+$NOTMUCH tag -inbox id:$parent or id:$final
+
+'
+test_expect_success "Changed thread name (oldest-first search)" '
+output=$($NOTMUCH search --sort=oldest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-06 [2/4] Notmuch Test Suite; thread-naming: Older changed subject (inbox unread)"
+
+'
+test_expect_success "Changed thread name (newest-first search)" '
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-07 [2/4] Notmuch Test Suite; thread-naming: Newer changed subject (inbox unread)"
+
+'
+test_expect_success "Ignore added reply prefix (Re:)" '
+add_message "[subject]=\"Re: thread-naming: Initial thread subject\"" \
+            "[date]=\"Tue, 09 Jan 2001 15:43:45 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-09 [3/5] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
+
+'
+test_expect_success "Ignore added reply prefix (Aw:)" '
+add_message "[subject]=\"Aw: thread-naming: Initial thread subject\"" \
+            "[date]=\"Wed, 10 Jan 2001 15:43:45 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-10 [4/6] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
+
+'
+test_expect_success "Ignore added reply prefix (Vs:)" '
+add_message "[subject]=\"Vs: thread-naming: Initial thread subject\"" \
+            "[date]=\"Thu, 11 Jan 2001 15:43:45 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-11 [5/7] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
+
+'
+test_expect_success "Ignore added reply prefix (Sv:)" '
+add_message "[subject]=\"Sv: thread-naming: Initial thread subject\"" \
+            "[date]=\"Fri, 12 Jan 2001 15:43:45 -0800\"" \
+            "[in-reply-to]=\<$parent\>" &&
+output=$($NOTMUCH search --sort=newest-first thread-naming and tag:inbox | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2001-01-12 [6/8] Notmuch Test Suite; thread-naming: Initial thread subject (inbox unread)"
+
+'
+test_expect_success "Test order of messages in \"notmuch show\"" '
+output=$($NOTMUCH show thread-naming | notmuch_show_sanitize) &&
+pass_if_equal "$output" "message{ id:msg-$(printf "%03d" $first)@notmuch-test-suite depth:0 match:1 filename:/XXX/mail/msg-$(printf "%03d" $first)
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-05) (unread)
+Subject: thread-naming: Initial thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Fri, 05 Jan 2001 15:43:56 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$first)
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 1)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 1)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-06) (inbox unread)
+Subject: thread-naming: Older changed subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Sat, 06 Jan 2001 15:43:56 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 1)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 2)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 2)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-07) (inbox unread)
+Subject: thread-naming: Newer changed subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Sun, 07 Jan 2001 15:43:56 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 2)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 3)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 3)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-08) (unread)
+Subject: thread-naming: Final thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Mon, 08 Jan 2001 15:43:56 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 3)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 4)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 4)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-09) (inbox unread)
+Subject: Re: thread-naming: Initial thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Tue, 09 Jan 2001 15:43:45 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 4)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 5)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 5)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-10) (inbox unread)
+Subject: Aw: thread-naming: Initial thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Wed, 10 Jan 2001 15:43:45 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 5)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 6)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 6)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-11) (inbox unread)
+Subject: Vs: thread-naming: Initial thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Thu, 11 Jan 2001 15:43:45 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 6)))
+part}
+body}
+message}
+message{ id:msg-$(printf "%03d" $((first + 7)))@notmuch-test-suite depth:1 match:1 filename:/XXX/mail/msg-$(printf "%03d" $((first + 7)))
+header{
+Notmuch Test Suite <test_suite at notmuchmail.org> (2001-01-12) (inbox unread)
+Subject: Sv: thread-naming: Initial thread subject
+From: Notmuch Test Suite <test_suite at notmuchmail.org>
+To: Notmuch Test Suite <test_suite at notmuchmail.org>
+Date: Fri, 12 Jan 2001 15:43:45 -0800
+header}
+body{
+part{ ID: 1, Content-type: text/plain
+This is just a test message (#$((first + 7)))
+part}
+body}
+message}"
+'
+test_done
diff --git a/test/t0005-reply.sh b/test/t0005-reply.sh
new file mode 100755
index 0000000..670bc73
--- /dev/null
+++ b/test/t0005-reply.sh
@@ -0,0 +1,122 @@
+#!/bin/bash
+test_description="\"notmuch reply\" in several variations"
+. ./test-lib.sh
+
+test_expect_success "Basic reply" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=test_suite at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"basic reply test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> basic reply test"
+
+'
+test_expect_success "Multiple recipients" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+            "[to]=\"test_suite at notmuchmail.org, Someone Else <someone at example.com>\"" \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"Multiple recipients\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, Someone Else <someone at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> Multiple recipients"
+
+'
+test_expect_success "Reply with CC" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=test_suite at notmuchmail.org \
+            "[cc]=\"Other Parties <cc at example.com>\"" \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"reply with CC\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>
+Cc: Other Parties <cc at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> reply with CC"
+
+'
+test_expect_success "Reply from alternate address" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=test_suite_other at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"reply from alternate address\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> reply from alternate address"
+
+'
+test_expect_success "Support for Reply-To" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=test_suite at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"support for reply-to\"" \
+            "[reply-to]=\"Sender <elsewhere at example.com>\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <elsewhere at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> support for reply-to"
+
+'
+test_expect_success "Un-munging Reply-To" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+            "[to]=\"Some List <list at example.com>\"" \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"Un-munging Reply-To\"" \
+            "[reply-to]=\"Evil Munging List <list at example.com>\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, Some List <list at example.com>
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> Un-munging Reply-To"
+'
+test_done
diff --git a/test/t0006-dump-restore.sh b/test/t0006-dump-restore.sh
new file mode 100755
index 0000000..f971181
--- /dev/null
+++ b/test/t0006-dump-restore.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+test_description="\"notmuch dump\" and \"notmuch restore\""
+. ./test-lib.sh
+test_expect_success 'Generate some message' '
+generate_message &&
+notmuch new
+'
+test_expect_success "Dumping all tags" '
+$NOTMUCH dump dump.expected &&
+pass_if_equal "$?" "0"
+
+'
+test_expect_success "Clearing all tags" '
+sed -e "s/(\([^(]*\))$/()/" < dump.expected > clear.expected
+$NOTMUCH restore clear.expected &&
+$NOTMUCH dump clear.actual &&
+pass_if_equal "$(< clear.actual)" "$(< clear.expected)"
+
+'
+test_expect_success "Restoring original tags" '
+$NOTMUCH restore dump.expected &&
+$NOTMUCH dump dump.actual &&
+pass_if_equal "$(< dump.actual)" "$(< dump.expected)"
+
+'
+test_expect_success "Restore with nothing to do" '
+$NOTMUCH restore dump.expected &&
+pass_if_equal "$?" "0"
+'
+test_done
diff --git a/test/t0007-uuencode.sh b/test/t0007-uuencode.sh
new file mode 100755
index 0000000..e290610
--- /dev/null
+++ b/test/t0007-uuencode.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+test_description="handling of uuencoded data"
+. ./test-lib.sh
+test_expect_success 'Generate message' '
+
+add_message [subject]=uuencodetest "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" \
+"[body]=\"This message is used to ensure that notmuch correctly handles a
+message containing a block of uuencoded data. First, we have a marker
+this content beforeuudata . Then we beging the uunencoded data itself:
+
+begin 644 bogus-uuencoded-data
+M0123456789012345678901234567890123456789012345678901234567890
+MOBVIOUSLY, THIS IS NOT ANY SORT OF USEFUL UUNECODED DATA.    
+MINSTEAD THIS IS JUST A WAY TO ENSURE THAT THIS BLOCK OF DATA 
+MIS CORRECTLY IGNORED WHEN NOTMUCH CREATES ITS INDEX. SO WE   
+MINCLUDE A DURINGUUDATA MARKER THAT SHOULD NOT RESULT IN ANY  
+MSEARCH RESULT.                                               
+\\\`
+end
+
+Finally, we have our afteruudata marker as well.\""
+
+'
+test_expect_success "Ensure content before uu data is indexed" '
+output=$($NOTMUCH search beforeuudata | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; uuencodetest (inbox unread)"
+'
+test_expect_success "Ensure uu data is not indexed" '
+output=$($NOTMUCH search DURINGUUDATA | notmuch_search_sanitize) &&
+pass_if_equal "$output" ""
+'
+test_expect_success "Ensure content after uu data is indexed" '
+output=$($NOTMUCH search afteruudata | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; uuencodetest (inbox unread)"
+'
+test_done
diff --git a/test/t0008-threading-out-of-order.sh b/test/t0008-threading-out-of-order.sh
new file mode 100755
index 0000000..9f360b7
--- /dev/null
+++ b/test/t0008-threading-out-of-order.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+test_description="threading when messages received out of order"
+. ./test-lib.sh
+test_expect_success "Adding initial child message" '
+generate_message [body]=foo "[in-reply-to]=\<parent-id\>" [subject]=brokenthreadtest "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Searching returns the message" '
+output=$($NOTMUCH search foo | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/1] Notmuch Test Suite; brokenthreadtest (inbox unread)"
+'
+test_expect_success "Adding second child message" '
+generate_message [body]=foo "[in-reply-to]=\<parent-id\>" [subject]=brokenthreadtest "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Searching returns both messages in one thread" '
+output=$($NOTMUCH search foo | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [2/2] Notmuch Test Suite; brokenthreadtest (inbox unread)"
+'
+test_expect_success "Adding parent message" '
+generate_message [body]=foo [id]=parent-id [subject]=brokenthreadtest "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Searching returns all three messages in one thread" '
+output=$($NOTMUCH search foo | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [3/3] Notmuch Test Suite; brokenthreadtest (inbox unread)"
+'
+test_done
diff --git a/test/t0009-author-reordering.sh b/test/t0009-author-reordering.sh
new file mode 100755
index 0000000..b993341
--- /dev/null
+++ b/test/t0009-author-reordering.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+test_description="author reordering;"
+. ./test-lib.sh
+test_expect_success "Adding parent message" '
+generate_message [body]=findme [id]=new-parent-id [subject]=author-reorder-threadtest "[from]=\"User <user at example.com>\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Adding initial child message" '
+generate_message [body]=findme "[in-reply-to]=\<new-parent-id\>" [subject]=author-reorder-threadtest "[from]=\"User1 <user1 at example.com>\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Adding second child message" '
+generate_message [body]=findme "[in-reply-to]=\<new-parent-id\>" [subject]=author-reorder-threadtest "[from]=\"User2 <user2 at example.com>\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" &&
+output=$(NOTMUCH_NEW) &&
+pass_if_equal "$output" "Added 1 new message to the database."
+'
+test_expect_success "Searching when all three messages match" '
+output=$($NOTMUCH search findme | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [3/3] User, User1, User2; author-reorder-threadtest (inbox unread)"
+'
+test_expect_success "Searching when two messages match" '
+output=$($NOTMUCH search User1 or User2 | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [2/3] User1, User2| User; author-reorder-threadtest (inbox unread)"
+'
+test_expect_success "Searching when only one message matches" '
+output=$($NOTMUCH search User2 | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/3] User2| User, User1; author-reorder-threadtest (inbox unread)"
+'
+test_expect_success "Searching when only first message matches" '
+output=$($NOTMUCH search User | notmuch_search_sanitize) &&
+pass_if_equal "$output" "thread:XXX   2000-01-01 [1/3] User| User1, User2; author-reorder-threadtest (inbox unread)"
+'
+test_done
diff --git a/test/t0010-from-line-heuristics.sh b/test/t0010-from-line-heuristics.sh
new file mode 100755
index 0000000..cb3f5b3
--- /dev/null
+++ b/test/t0010-from-line-heuristics.sh
@@ -0,0 +1,214 @@
+#!/bin/bash
+test_description="From line heuristics (with multiple configured addresses)"
+. ./test-lib.sh
+test_expect_success "Magic from guessing (nothing to go on)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Envelope-to:)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Envelope-To: test_suite_other at notmuchmail.org\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (X-Original-To:)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"X-Original-To: test_suite_other at notmuchmail.org\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Received: .. for ..)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Received: from mail.example.com (mail.example.com [1.1.1.1])\
+        by mail.notmuchmail.org (some MTA) with ESMTP id 12345678\
+        for <test_suite_other at notmuchmail.org>; Sat, 10 Apr 2010 07:54:51 -0400 (EDT)\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite_other at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Received: domain)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Received: from mail.example.com (mail.example.com [1.1.1.1])\
+        by mail.otherdomain.org (some MTA) with ESMTP id 12345678\
+        Sat, 10 Apr 2010 07:54:51 -0400 (EDT)\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at otherdomain.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+
+'
+test_expect_success "\nTesting From line heuristics (with single configured address):\n" '
+sed -i -e "s/^other_email.*//" "${NOTMUCH_CONFIG}"
+
+'
+test_expect_success "Magic from guessing (nothing to go on)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Envelope-to:)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Envelope-To: test_suite_other at notmuchmail.org\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (X-Original-To:)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"X-Original-To: test_suite_other at notmuchmail.org\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Received: .. for ..)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Received: from mail.example.com (mail.example.com [1.1.1.1])\
+        by mail.notmuchmail.org (some MTA) with ESMTP id 12345678\
+        for <test_suite_other at notmuchmail.org>; Sat, 10 Apr 2010 07:54:51 -0400 (EDT)\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+
+'
+test_expect_success "Magic from guessing (Received: domain)" '
+add_message "[from]=\"Sender <sender at example.com>\"" \
+             [to]=mailinglist at notmuchmail.org \
+             [subject]=notmuch-reply-test \
+            "[header]=\"Received: from mail.example.com (mail.example.com [1.1.1.1])\
+        by mail.otherdomain.org (some MTA) with ESMTP id 12345678\
+        Sat, 10 Apr 2010 07:54:51 -0400 (EDT)\"" \
+            "[date]=\"Tue, 05 Jan 2010 15:43:56 -0800\"" \
+            "[body]=\"from guessing test\"" &&
+
+output=$($NOTMUCH reply id:${gen_msg_id}) &&
+pass_if_equal "$output" "From: Notmuch Test Suite <test_suite at notmuchmail.org>
+Subject: Re: notmuch-reply-test
+To: Sender <sender at example.com>, mailinglist at notmuchmail.org
+Bcc: test_suite at notmuchmail.org
+In-Reply-To: <${gen_msg_id}>
+References: <${gen_msg_id}>
+
+On Tue, 05 Jan 2010 15:43:56 -0800, Sender <sender at example.com> wrote:
+> from guessing test"
+'
+test_done
-- 
1.7.1



More information about the notmuch mailing list