mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 10:58:10 +01:00
test: Rework testing of maildir-synchronization feature.
This change reworks these tests in several ways: 1. Bring tests into "new" test style preferring test_expect_equal over test_expect_success in almost all cases. 2. Don't emit test results for intermediate items not actually being tested, (things like "no new messages", "search for message", etc.). Those things are already covered by existing tests such as "basic" or "search" and only serve to obscure what's actually being tested. 3. Change sense of the test showing failure to rename a file from "new" to "cur" when "cur" doesn't exist. In this case, notmuch should detect that this is not a maildir and should not attempt to do any renaming of the file. 4. Extend dump/restore test to also exercise addition of tag, not just removal. Both items #3 and #4 above show shortcomings in the current implementation. These are currently resulting in test results of FAIL and indicate bugs that need to be fixed.
This commit is contained in:
parent
736ac42c45
commit
882b994c17
1 changed files with 97 additions and 194 deletions
|
@ -1,11 +1,14 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
test_description="Test maildir synchronization"
|
test_description="maildir synchronization"
|
||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
filter_show() {
|
# Much easier to examine differences if the "notmuch show
|
||||||
sed -e 's/, /,\n/g'|sed -e "s|${MAIL_DIR}/||" -e '/^"tags"/d'
|
# --format=json" output includes some newlines. Also, need to avoid
|
||||||
|
# including the local value of MAIL_DIR in the result.
|
||||||
|
filter_show_json() {
|
||||||
|
sed -e 's/, /,\n/g' | sed -e "s|${MAIL_DIR}/|MAIL_DIR/|"
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,218 +17,118 @@ cat >> "$NOTMUCH_CONFIG" <<EOF
|
||||||
synchronize_flags=true
|
synchronize_flags=true
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
test_begin_subtest "No new messages"
|
# Create the expected maildir structure
|
||||||
output=$(NOTMUCH_NEW)
|
mkdir $MAIL_DIR/cur
|
||||||
test_expect_equal "$output" "No new mail."
|
mkdir $MAIL_DIR/new
|
||||||
|
mkdir $MAIL_DIR/tmp
|
||||||
|
|
||||||
cat > expected <<EOF
|
test_begin_subtest "Adding 'S' flag to existing filename removes 'unread' tag"
|
||||||
Added 1 new message to the database.
|
add_message [subject]='"Adding S flag"' [filename]='adding-s-flag:2,' [dir]=cur
|
||||||
EOF
|
output=$(notmuch search subject:"Adding S flag" | notmuch_search_sanitize)
|
||||||
test_expect_success "Add a message, no flags" '
|
output+="
|
||||||
generate_message [subject]="\"test message\"" [date]="\"Sat, 01 Jan 2000 12:00:00 -0000\"" [filename]="\"msg-001:2,\"" &&
|
"
|
||||||
NOTMUCH_NEW > actual &&
|
mv "${gen_msg_filename}" "${gen_msg_filename}S"
|
||||||
test_cmp expected actual
|
increment_mtime "$(dirname "${gen_msg_filename}")"
|
||||||
#emacs --eval "(gdb \"gdb --annotate=3 --args $(which notmuch) new\")"
|
output+=$(NOTMUCH_NEW)
|
||||||
'
|
output+="
|
||||||
cat > expected <<EOF
|
"
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message (inbox unread)
|
output+=$(notmuch search subject:"Adding S flag" | notmuch_search_sanitize)
|
||||||
EOF
|
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding S flag (inbox unread)
|
||||||
test_expect_success 'Search for the message' '
|
|
||||||
notmuch search tag:inbox and tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp expected actual
|
|
||||||
'
|
|
||||||
cat > expected <<EOF
|
|
||||||
No new mail. Detected 1 file rename.
|
No new mail. Detected 1 file rename.
|
||||||
EOF
|
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding S flag (inbox)"
|
||||||
test_expect_success 'Add seen flag' '
|
|
||||||
mv "${gen_msg_filename}" "${gen_msg_filename}S" &&
|
|
||||||
increment_mtime "$(dirname "${gen_msg_filename}")" &&
|
|
||||||
NOTMUCH_NEW > actual &&
|
|
||||||
test_cmp expected actual
|
|
||||||
'
|
|
||||||
cat > expected <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message (inbox)
|
|
||||||
EOF
|
|
||||||
test_expect_success 'Check that tags were updated' '
|
|
||||||
notmuch search tag:inbox and not tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp expected actual
|
|
||||||
'
|
|
||||||
cat > expected <<EOF
|
|
||||||
Added 1 new message to the database.
|
|
||||||
EOF
|
|
||||||
test_expect_success "Add a seen message" '
|
|
||||||
generate_message [subject]="\"test message 2\"" [date]="\"Sat, 01 Jan 2000 12:00:00 -0000\"" [filename]="\"msg-002:2,S\"" &&
|
|
||||||
NOTMUCH_NEW > actual &&
|
|
||||||
test_cmp expected actual
|
|
||||||
'
|
|
||||||
cat > expected <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message (inbox)
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 2 (inbox)
|
|
||||||
EOF
|
|
||||||
test_expect_success 'Check that the seen message is not tagged unread' '
|
|
||||||
notmuch search tag:inbox and not tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp expected actual
|
|
||||||
'
|
|
||||||
test_expect_success 'Tag the seen messages as replied' '
|
|
||||||
notmuch tag +replied -inbox tag:inbox and not tag:unread
|
|
||||||
'
|
|
||||||
|
|
||||||
cat > expected <<EOF
|
test_begin_subtest "Adding message with 'S' flag prevents 'unread' tag"
|
||||||
msg-001:2,RS
|
add_message [subject]='"Adding message with S"' [filename]='adding-with-s-flag:2,S' [dir]=cur
|
||||||
msg-002:2,RS
|
output=$(notmuch search subject:"Adding message with S" | notmuch_search_sanitize)
|
||||||
EOF
|
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding message with S (inbox)"
|
||||||
test_expect_success 'Check that R flag was added' '
|
|
||||||
ls -1 "${MAIL_DIR}" > actual &&
|
test_begin_subtest "Adding 'replied' tag adds 'R' flag to filename"
|
||||||
test_cmp expected actual
|
add_message [subject]='"Adding replied tag"' [filename]='adding-replied-tag:2,S' [dir]=cur
|
||||||
'
|
notmuch tag +replied subject:"Adding replied tag"
|
||||||
cat <<EOF > show-expected
|
output=$(cd ${MAIL_DIR}/cur; ls -1 adding-replied*)
|
||||||
[[[{"id": "msg-001@notmuch-test-suite",
|
test_expect_equal "$output" "adding-replied-tag:2,RS"
|
||||||
|
|
||||||
|
test_begin_subtest "notmuch show works with renamed file (without notmuch new)"
|
||||||
|
output=$(notmuch show --format=json id:${gen_msg_id} | filter_show_json)
|
||||||
|
test_expect_equal "$output" '[[[{"id": "adding-replied-tag@notmuch-test-suite",
|
||||||
"match": true,
|
"match": true,
|
||||||
"filename": "msg-001:2,RS",
|
"filename": "MAIL_DIR/cur/adding-replied-tag:2,RS",
|
||||||
"timestamp": 946728000,
|
"timestamp": 978709437,
|
||||||
"date_relative": "2000-01-01",
|
"date_relative": "2001-01-05",
|
||||||
"headers": {"Subject": "test message",
|
"tags": ["inbox","replied"],
|
||||||
|
"headers": {"Subject": "Adding replied tag",
|
||||||
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
||||||
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
|
||||||
"Cc": "",
|
"Cc": "",
|
||||||
"Bcc": "",
|
"Bcc": "",
|
||||||
"Date": "Sat,
|
"Date": "Tue,
|
||||||
01 Jan 2000 12:00:00 -0000"},
|
05 Jan 2001 15:43:57 -0000"},
|
||||||
"body": [{"id": 1,
|
"body": [{"id": 1,
|
||||||
"content-type": "text/plain",
|
"content-type": "text/plain",
|
||||||
"content": "This is just a test message (#1)\n"}]},
|
"content": "This is just a test message (#3)\n"}]},
|
||||||
[]]]]
|
[]]]]'
|
||||||
EOF
|
|
||||||
|
|
||||||
test_expect_success 'Message renamed due to changed flags can be shown without running notmuch new' '
|
test_expect_success 'notmuch reply works with renamed file (without notmuch new)' 'notmuch reply id:${gen_msg_id}'
|
||||||
notmuch show --format=json id:msg-001@notmuch-test-suite | filter_show > show-actual &&
|
|
||||||
test_cmp show-expected show-actual
|
|
||||||
'
|
|
||||||
|
|
||||||
test_expect_success 'Test that we can reply to the renamed message' '
|
test_begin_subtest "notmuch new detects no file rename after tag->flag synchronization"
|
||||||
notmuch reply id:msg-001@notmuch-test-suite
|
increment_mtime "$(dirname ${gen_msg_filename})"
|
||||||
'
|
output=$(NOTMUCH_NEW)
|
||||||
|
test_expect_equal "$output" "No new mail."
|
||||||
|
|
||||||
echo "No new mail." > expected
|
test_begin_subtest "When read, message moved from new to cur"
|
||||||
test_expect_success 'No rename should be detected by notmuch new' '
|
add_message [subject]='"Message to move to cur"' [date]='"Sat, 01 Jan 2000 12:00:00 -0000"' [filename]='message-to-move-to-cur' [dir]=new
|
||||||
increment_mtime "$(dirname "${gen_msg_filename}")" &&
|
notmuch tag -unread subject:"Message to move to cur"
|
||||||
notmuch new > actual &&
|
output=$(cd "$MAIL_DIR/cur"; ls message-to-move*)
|
||||||
test_cmp expected actual
|
test_expect_equal "$output" "message-to-move-to-cur:2,S"
|
||||||
'
|
|
||||||
test_expect_success "Add a message to new/ without info" '
|
|
||||||
generate_message [subject]="\"test message 3\"" [date]="\"Sat, 01 Jan 2000 12:00:00 -0000\"" [dir]=new &&
|
|
||||||
NOTMUCH_NEW > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
Added 1 new message to the database.
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success "Check that the message has inbox and unread tags" '
|
|
||||||
notmuch search tag:inbox and tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 3 (inbox unread)
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success "Tag the message with 'tmp' tag" '
|
|
||||||
notmuch tag +tmp tag:inbox and tag:unread'
|
|
||||||
|
|
||||||
test_expect_success "Check that the message was not moved from new/ to cur/" '
|
test_begin_subtest "No rename should be detected by notmuch new"
|
||||||
echo filename:$gen_msg_filename > expected &&
|
increment_mtime "$MAIL_DIR/cur"
|
||||||
notmuch show id:$gen_msg_id|grep -o "filename:.*$" > actual &&
|
output=$(NOTMUCH_NEW)
|
||||||
test_cmp expected actual &&
|
test_expect_equal "$output" "No new mail."
|
||||||
test -f "$gen_msg_filename"
|
|
||||||
'
|
|
||||||
test_expect_success "Check that the message was not renamed" '
|
|
||||||
ls "${MAIL_DIR}/new" > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
msg-003
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success 'Removing of unread tag should fail without cur/' '
|
|
||||||
test_must_fail notmuch tag -unread tag:inbox and tag:unread
|
|
||||||
'
|
|
||||||
test_expect_success "Check that the tags were not changed" '
|
|
||||||
notmuch search tag:inbox and tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 3 (inbox tmp unread)
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
|
|
||||||
# notmuch new is not necessary here, but we run it in order to check
|
|
||||||
# for 'no rename' later (*).
|
|
||||||
test_expect_success 'Create cur/ and let notmuch know about it' '
|
|
||||||
mkdir "$MAIL_DIR/cur" &&
|
|
||||||
notmuch new
|
|
||||||
'
|
|
||||||
test_expect_success 'Removing of unread tag should pass with cur/' '
|
|
||||||
notmuch tag -unread tag:inbox and tag:unread
|
|
||||||
'
|
|
||||||
test_expect_success 'Check that the message was moved to cur/' '\
|
|
||||||
ls "$MAIL_DIR/cur" > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
msg-003:2,S
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success 'No rename should be detected by notmuch new' '
|
|
||||||
increment_mtime "$MAIL_DIR/cur" &&
|
|
||||||
notmuch new > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
No new mail.
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
# (*) If notmuch new was not run we've got "Processed 1 file in almost
|
# (*) If notmuch new was not run we've got "Processed 1 file in almost
|
||||||
# no time" here. The reason is that removing unread tag in a previous
|
# no time" here. The reason is that removing unread tag in a previous
|
||||||
# test created directory document in the database but this document
|
# test created directory document in the database but this document
|
||||||
# was not linked as subdirectory of $MAIL_DIR. Therefore notmuch new
|
# was not linked as subdirectory of $MAIL_DIR. Therefore notmuch new
|
||||||
# could not reach the cur/ directory and its files in it during
|
# could not reach the cur/ directory and its files in it during
|
||||||
# recurive traversal.
|
# recurive traversal.
|
||||||
test_expect_success 'Remove info from file name' '
|
#
|
||||||
mv "$MAIL_DIR/cur/msg-003:2,S" "$MAIL_DIR/cur/msg-003" &&
|
# XXX: The above sounds like a bug that should be fixed. If notmuch is
|
||||||
increment_mtime "$MAIL_DIR/cur" &&
|
# creating new directories in the mail store, then it should be
|
||||||
NOTMUCH_NEW > actual
|
# creating all necessary database state for those directories.
|
||||||
test_cmp - actual <<EOF
|
|
||||||
No new mail. Detected 1 file rename.
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success "Check that removing info did not change tags" '
|
|
||||||
notmuch search tag:inbox | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 3 (inbox tmp)
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success "Add a message to fakenew/ without info" '
|
|
||||||
generate_message [subject]="\"test message 4\"" [date]="\"Sat, 01 Jan 2000 12:00:00 -0000\"" [dir]=fakenew &&
|
|
||||||
NOTMUCH_NEW > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
Added 1 new message to the database.
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success "Check that the message has inbox and unread tags" '
|
|
||||||
notmuch search tag:inbox and tag:unread | notmuch_search_sanitize > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 4 (inbox unread)
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
test_expect_success 'Removing of unread tag should leave the message in fakenew/' '
|
|
||||||
notmuch tag -unread tag:inbox and tag:unread &&
|
|
||||||
ls "$MAIL_DIR/fakenew" > actual &&
|
|
||||||
test_cmp - actual <<EOF
|
|
||||||
msg-004:2,S
|
|
||||||
EOF
|
|
||||||
'
|
|
||||||
|
|
||||||
test_expect_success 'Make maildir flags out of sync with the database' '
|
test_begin_subtest "Removing info from filename leaves tags unchanged"
|
||||||
ls $MAIL_DIR > expected &&
|
add_message [subject]='"Message to lose maildir info"' [filename]='message-to-lose-maildir-info' [dir]=cur
|
||||||
mv $MAIL_DIR/msg-001:2,RS $MAIL_DIR/msg-001:2, &&
|
notmuch tag -unread subject:"Message to lose maildir info"
|
||||||
mv $MAIL_DIR/msg-002:2,RS $MAIL_DIR/msg-002:2, &&
|
mv "$MAIL_DIR/cur/message-to-lose-maildir-info:2,S" "$MAIL_DIR/cur/message-without-maildir-info"
|
||||||
increment_mtime $MAIL_DIR
|
increment_mtime "$MAIL_DIR/cur"
|
||||||
'
|
output=$(NOTMUCH_NEW)
|
||||||
|
output+="
|
||||||
|
"
|
||||||
|
output+=$(notmuch search subject:"Message to lose maildir info" | notmuch_search_sanitize)
|
||||||
|
test_expect_equal "$output" "No new mail. Detected 1 file rename.
|
||||||
|
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Message to lose maildir info (inbox)"
|
||||||
|
|
||||||
test_expect_success 'Test whether dump/new/restore synchronizes the maildir flags with the database' '
|
add_message [subject]='"Non-maildir message"' [dir]=notmaildir/new [filename]='non-maildir-message'
|
||||||
notmuch dump dump.txt &&
|
expected=$(notmuch search --output=files subject:"Non-maildir message")
|
||||||
notmuch new &&
|
test_expect_success "Can remove unread tag from message in non-maildir directory" 'notmuch tag -unread subject:"Non-maildir message"'
|
||||||
notmuch restore dump.txt &&
|
|
||||||
ls $MAIL_DIR > actual &&
|
test_begin_subtest "Message in non-maildir directory does not get renamed"
|
||||||
test_cmp expected actual
|
output=$(notmuch search --output=files subject:"Non-maildir message")
|
||||||
'
|
test_expect_equal "$output" "$expected"
|
||||||
|
|
||||||
|
test_begin_subtest "notmuch dump/restore re-synchronizes maildir tags with flags"
|
||||||
|
# Capture current filename state
|
||||||
|
expected=$(ls $MAIL_DIR/cur)
|
||||||
|
# Add/remove some flags from filenames
|
||||||
|
mv $MAIL_DIR/cur/adding-replied-tag:2,RS $MAIL_DIR/cur/adding-replied-tag:2,S
|
||||||
|
mv $MAIL_DIR/cur/adding-s-flag:2,S $MAIL_DIR/cur/adding-s-flag:2,
|
||||||
|
mv $MAIL_DIR/cur/adding-with-s-flag:2,S $MAIL_DIR/cur/adding-with-s-flag:2,RS
|
||||||
|
mv $MAIL_DIR/cur/message-to-move-to-cur:2,S $MAIL_DIR/cur/message-to-move-to-cur:2,SD
|
||||||
|
increment_mtime $MAIL_DIR/cur
|
||||||
|
notmuch dump dump.txt
|
||||||
|
NOTMUCH_NEW >/dev/null
|
||||||
|
notmuch restore dump.txt
|
||||||
|
output=$(ls $MAIL_DIR/cur)
|
||||||
|
test_expect_equal "$output" "$expected"
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue