From 3a7d2e81c7fdc8c2e4b9810065028f4906fc28b3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 18 Aug 2017 19:04:54 -0600 Subject: Implemented thread merging It can happen that thread messages are not delivered in order, which means we will have to merge threads once all messages are available. --- tests/mailthreadtest.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'tests/mailthreadtest.cpp') diff --git a/tests/mailthreadtest.cpp b/tests/mailthreadtest.cpp index 741eb78..9ed5d83 100644 --- a/tests/mailthreadtest.cpp +++ b/tests/mailthreadtest.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include "store.h" @@ -185,4 +186,67 @@ void MailThreadTest::testIndexInMixedOrder() /* VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier)); */ } +static QByteArray readMailFromFile(const QString &mailFile) +{ + QFile file(QLatin1String(THREADTESTDATAPATH) + QLatin1Char('/') + mailFile); + file.open(QIODevice::ReadOnly); + Q_ASSERT(file.isOpen()); + return file.readAll(); +} + +static KMime::Message::Ptr readMail(const QString &mailFile) +{ + auto msg = KMime::Message::Ptr::create(); + msg->setContent(readMailFromFile(mailFile)); + msg->parse(); + return msg; +} + +void MailThreadTest::testRealWorldThread() +{ + auto folder = Folder::create(mResourceInstanceIdentifier); + folder.setName("folder"); + VERIFYEXEC(Store::create(folder)); + + auto createMail = [this, folder] (KMime::Message::Ptr msg) { + auto mail = Mail::create(mResourceInstanceIdentifier); + mail.setMimeMessage(msg->encodedContent(true)); + mail.setFolder(folder); + VERIFYEXEC(Store::create(mail)); + }; + + createMail(readMail("thread1")); + + VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); + + auto query = Sink::StandardQueries::threadLeaders(folder); + query.resourceFilter(mResourceInstanceIdentifier); + query.request().request().request().request(); + + //Ensure we find the thread leader + Mail threadLeader = [&] { + auto mails = Store::read(query); + Q_ASSERT(mails.size() == 1); + return mails.first(); + }(); + + createMail(readMail("thread2")); + createMail(readMail("thread3")); + createMail(readMail("thread4")); + createMail(readMail("thread5")); + createMail(readMail("thread6")); + createMail(readMail("thread7")); + createMail(readMail("thread8")); //This mail is breaking the thread + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + //Ensure the thread is complete + { + auto query = Sink::StandardQueries::completeThread(threadLeader); + query.request().request().request().request(); + + auto mails = Store::read(query); + QCOMPARE(mails.size(), 8); + } +} + #include "mailthreadtest.moc" -- cgit v1.2.3