X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=test%2FT590-thread-breakage.sh;fp=test%2FT590-thread-breakage.sh;h=2f838b39b215d33dabf4b146f7889ccf8ce3eea4;hp=0000000000000000000000000000000000000000;hb=92559ee3473381b0ba207ddb7db944d6ffadc2db;hpb=f68e776617175fe77cbd7b29ce0fb2a1011117a8 diff --git a/test/T590-thread-breakage.sh b/test/T590-thread-breakage.sh new file mode 100755 index 00000000..2f838b39 --- /dev/null +++ b/test/T590-thread-breakage.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2016 Daniel Kahn Gillmor +# + +test_description='thread breakage during reindexing + +notmuch uses ghost documents to track messages we have seen references +to but have never seen. Regardless of the order of delivery, message +deletion, and reindexing, the list of ghost messages for a given +stored corpus should not vary, so that threads can be reassmebled +cleanly. + +In practice, we accept a small amount of variation (and therefore +traffic pattern metadata leakage to be stored in the index) for the +sake of efficiency. + +This test also embeds some subtests to ensure that indexing actually +works properly and attempted fixes to threading issues do not break +the expected contents of the index.' + +. ./test-lib.sh || exit 1 + +message_a() { + mkdir -p ${MAIL_DIR}/cur + cat > ${MAIL_DIR}/cur/a < +From: Alice +To: Bob +Date: Thu, 31 Mar 2016 20:10:00 -0400 + +This is the first message in the thread. +Apple +EOF +} + +message_b() { + mkdir -p ${MAIL_DIR}/cur + cat > ${MAIL_DIR}/cur/b < +In-Reply-To: +References: +From: Bob +To: Alice +Date: Thu, 31 Mar 2016 20:15:00 -0400 + +This is the second message in the thread. +Banana +EOF +} + + +test_content_count() { + test_begin_subtest "${3:-looking for $2 instance of '$1'}" + count=$(notmuch count --output=threads "$1") + test_expect_equal "$count" "$2" +} + +test_thread_count() { + test_begin_subtest "${2:-Expecting $1 thread(s)}" + count=$(notmuch count --output=threads) + test_expect_equal "$count" "$1" +} + +test_ghost_count() { + test_begin_subtest "${2:-Expecting $1 ghosts(s)}" + ghosts=$(../ghost-report ${MAIL_DIR}/.notmuch/xapian) + test_expect_equal "$ghosts" "$1" +} + +notmuch new >/dev/null + +test_thread_count 0 'There should be no threads initially' +test_ghost_count 0 'There should be no ghosts initially' + +message_a +notmuch new >/dev/null +test_thread_count 1 'One message in: one thread' +test_content_count apple 1 +test_content_count banana 0 +test_ghost_count 0 + +message_b +notmuch new >/dev/null +test_thread_count 1 'Second message in the same thread: one thread' +test_content_count apple 1 +test_content_count banana 1 +test_ghost_count 0 + +rm -f ${MAIL_DIR}/cur/a +notmuch new >/dev/null +test_thread_count 1 'First message removed: still only one thread' +test_content_count apple 0 +test_content_count banana 1 +test_begin_subtest 'should be one ghost after first message removed' +test_subtest_known_broken +ghosts=$(../ghost-report ${MAIL_DIR}/.notmuch/xapian) +test_expect_equal "$ghosts" "1" + +message_a +notmuch new >/dev/null +# this is known to fail (it shows 2 threads) because no "ghost +# message" was created for message A when it was removed from the +# index, despite message B still pointing to it. +test_begin_subtest 'First message reappears: should return to the same thread' +test_subtest_known_broken +count=$(notmuch count --output=threads) +test_expect_equal "$count" "1" +test_content_count apple 1 +test_content_count banana 1 +test_ghost_count 0 + +rm -f ${MAIL_DIR}/cur/b +notmuch new >/dev/null +test_thread_count 1 'Removing second message: still only one thread' +test_content_count apple 1 +test_content_count banana 0 +test_ghost_count 0 'No ghosts should remain after deletion of second message' + +rm -f ${MAIL_DIR}/cur/a +notmuch new >/dev/null +test_thread_count 0 'All messages gone: no threads' +test_content_count apple 0 +test_content_count banana 0 +test_ghost_count 0 + +test_done