From 49b83e87e4da54cdd18ec04b10fdb4624389bd80 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 19 Jun 2018 11:00:39 +0200 Subject: Fixed the thread index. * Modifications could result in index changes because we lost the threadId due to remove + add. A modify was necessary (although we can ignore it for the email case). * The ThreadIndexer would try to lookup and potentially index threads for empty parent ids, which is clearly wrong. --- tests/mailthreadtest.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'tests/mailthreadtest.cpp') diff --git a/tests/mailthreadtest.cpp b/tests/mailthreadtest.cpp index 8c325d8..d2962e5 100644 --- a/tests/mailthreadtest.cpp +++ b/tests/mailthreadtest.cpp @@ -29,6 +29,8 @@ #include "log.h" #include "test.h" #include "standardqueries.h" +#include "index.h" +#include "definitions.h" using namespace Sink; using namespace Sink::ApplicationDomain; @@ -249,3 +251,79 @@ void MailThreadTest::testRealWorldThread() QCOMPARE(mails.size(), 8); } } + +//Avoid accidentally merging or changing threads +void MailThreadTest::testNoParentsWithModifications() +{ + auto folder = Folder::create(mResourceInstanceIdentifier); + folder.setName("folder2"); + VERIFYEXEC(Store::create(folder)); + + auto createMail = [&] (const QString &subject) { + auto message1 = KMime::Message::Ptr::create(); + message1->subject(true)->fromUnicodeString(subject, "utf8"); + message1->messageID(true)->fromUnicodeString("<" + subject + "@foobar.com" + ">", "utf8"); + message1->date(true)->setDateTime(QDateTime::currentDateTimeUtc()); + message1->assemble(); + + auto mail = Mail::create(mResourceInstanceIdentifier); + mail.setMimeMessage(message1->encodedContent(true)); + mail.setFolder(folder); + return mail; + }; + + auto mail1 = createMail("1"); + VERIFYEXEC(Store::create(mail1)); + auto mail2 = createMail("2"); + VERIFYEXEC(Store::create(mail2)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + auto query = Sink::StandardQueries::threadLeaders(folder); + query.resourceFilter(mResourceInstanceIdentifier); + query.request().request().request().request().request(); + + QSet threadIds; + { + auto mails = Store::read(query); + QCOMPARE(mails.size(), 2); + for (const auto &m : mails) { + threadIds << m.getProperty(Mail::ThreadId::name).toByteArray(); + } + } + + auto readIndex = [&] (const QString &indexName, const QByteArray &lookupKey) { + Index index(Sink::storageLocation(), mResourceInstanceIdentifier, indexName, Sink::Storage::DataStore::ReadOnly); + QByteArrayList keys; + index.lookup(lookupKey, + [&](const QByteArray &value) { keys << QByteArray{value.constData(), value.size()}; }, + [=](const Index::Error &error) { SinkWarning() << "Lookup error in secondary index: " << error.message; }, + false); + return keys; + }; + QCOMPARE(readIndex("mail.index.messageIdthreadId", "1@foobar.com").size(), 1); + QCOMPARE(readIndex("mail.index.messageIdthreadId", "2@foobar.com").size(), 1); + + //We try to modify both mails on purpose + auto checkMail = [&] (Mail mail1) { + Mail modification = mail1; + modification.setChangedProperties({}); + modification.setImportant(true); + VERIFYEXEC(Store::modify(modification)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + QCOMPARE(readIndex("mail.index.messageIdthreadId", "1@foobar.com").size(), 1); + QCOMPARE(readIndex("mail.index.messageIdthreadId", "2@foobar.com").size(), 1); + + { + auto mails = Store::read(query); + QCOMPARE(mails.size(), 2); + QSet newThreadIds; + for (const auto &m : mails) { + newThreadIds << m.getProperty(Mail::ThreadId::name).toByteArray(); + } + QCOMPARE(threadIds, newThreadIds); + } + }; + checkMail(mail1); + checkMail(mail2); +} -- cgit v1.2.3