From 8d2d52fcfd3c42a82b7f86c6f3c5009461f1de9f Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 1 Apr 2018 09:41:28 +0200 Subject: Avoid missing revision updates while a query is running. Instead we have to remember that something has changed and rerun an incremental query. --- tests/querytest.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'tests/querytest.cpp') diff --git a/tests/querytest.cpp b/tests/querytest.cpp index 2a12979..81b7cdc 100644 --- a/tests/querytest.cpp +++ b/tests/querytest.cpp @@ -13,6 +13,8 @@ #include "test.h" #include "testutils.h" #include "applicationdomaintype.h" +#include "queryrunner.h" +#include "adaptorfactoryregistry.h" #include @@ -1229,6 +1231,55 @@ private slots: } } + void testQueryRunnerDontMissUpdates() + { + // Setup + auto folder1 = Folder::createEntity("sink.dummy.instance1"); + VERIFYEXEC(Sink::Store::create(folder1)); + + QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}}; + + auto createMail = [] (const QByteArray &messageid, const Folder &folder, const QDateTime &date, bool important) { + auto mail = Mail::createEntity("sink.dummy.instance1"); + mail.setExtractedMessageId(messageid); + mail.setFolder(folder); + mail.setExtractedDate(date); + mail.setImportant(important); + return mail; + }; + + VERIFYEXEC(Sink::Store::create(createMail("mail1", folder1, now, false))); + + // Ensure all local data is processed + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + + Query query; + query.setFlags(Query::LiveQuery); + + Sink::ResourceContext resourceContext{"sink.dummy.instance1", "sink.dummy", Sink::AdaptorFactoryRegistry::instance().getFactories("sink.dummy")}; + Sink::Log::Context logCtx; + auto runner = new QueryRunner(query, resourceContext, ApplicationDomain::getTypeName(), logCtx); + runner->delayNextQuery(); + + auto emitter = runner->emitter(); + QList added; + emitter->onAdded([&](Mail::Ptr mail) { + added << mail; + }); + + emitter->fetch(); + VERIFYEXEC(Sink::Store::create(createMail("mail2", folder1, now, false))); + QTRY_COMPARE(added.size(), 2); + + runner->delayNextQuery(); + VERIFYEXEC(Sink::Store::create(createMail("mail3", folder1, now, false))); + //The second revision update is supposed to come in while the initial revision update is still in the query. + //So wait a bit to make sure the query is currently runnning. + QTest::qWait(500); + VERIFYEXEC(Sink::Store::create(createMail("mail4", folder1, now, false))); + QTRY_COMPARE(added.size(), 4); + } + /* * This test is here to ensure we don't crash if we call removeFromDisk with a running query. */ -- cgit v1.2.3