#!/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_subject_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 pwd ls -la ${MAIL_DIR}/.notmuch/xapian 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_subject_count apple 1 test_subject_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_subject_count apple 1 test_subject_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_subject_count apple 0 test_subject_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_subject_count apple 1 test_subject_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_subject_count apple 1 test_subject_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_subject_count apple 0 test_subject_count banana 0 test_ghost_count 0 test_done