From e22776a57bd12621358ad7cd98dac3261f2a70db Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 28 Jul 2015 16:50:39 +0200 Subject: Test life queries in the generic facade --- tests/clientapitest.cpp | 102 +++----------------------------------------- tests/genericfacadetest.cpp | 55 ++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 99 deletions(-) (limited to 'tests') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 9b8c27e..27139c2 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -7,20 +7,6 @@ #include "synclistresult.h" #include "resourceconfig.h" -class RevisionNotifier : public QObject -{ - Q_OBJECT -public: - RevisionNotifier() : QObject() {}; - void notify(qint64 revision) - { - emit revisionChanged(revision); - } - -Q_SIGNALS: - void revisionChanged(qint64); -}; - class DummyResourceFacade : public Akonadi2::StoreFacade { public: @@ -28,70 +14,17 @@ public: KAsync::Job create(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; KAsync::Job modify(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; KAsync::Job remove(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; - - KAsync::Job load(const Akonadi2::Query &query, const std::function &resultCallback) + KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE { - return KAsync::start([this, resultCallback](KAsync::Future &future) { - qDebug() << "load called"; - for(const auto &result : results) { - resultCallback(result); - } - future.setValue(0); - future.setFinished(); - }); - } - - KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE - { - auto runner = QSharedPointer::create(query); - //The runner only lives as long as the resultProvider - resultProvider->setQueryRunner(runner); - QWeakPointer > weakResultProvider = resultProvider; capturedResultProvider = resultProvider; - runner->setQuery([this, weakResultProvider, query](qint64 oldRevision, qint64 newRevision) -> KAsync::Job { - qDebug() << "Creating query for revisions: " << oldRevision << newRevision; - return KAsync::start([this, weakResultProvider, query](KAsync::Future &future) { - auto resultProvider = weakResultProvider.toStrongRef(); - if (!resultProvider) { - Warning() << "Tried executing query after result provider is already gone"; - future.setError(0, QString()); - future.setFinished(); - return; - } - //TODO only emit changes and don't replace everything - resultProvider->clear(); - //rerun query - std::function addCallback = std::bind(&Akonadi2::ResultProvider::add, resultProvider, std::placeholders::_1); - load(query, addCallback).then([resultProvider, &future, query](qint64 queriedRevision) { - future.setValue(queriedRevision); - future.setFinished(); - }).exec(); - }); - }); - - //Ensure the notification is emitted in the right thread - //Otherwise we get crashes as we call revisionChanged from the test. - if (!notifier) { - notifier.reset(new RevisionNotifier); - } - - //TODO somehow disconnect as resultNotifier is destroyed. Otherwise we keep the runner alive forever. - if (query.liveQuery) { - QObject::connect(notifier.data(), &RevisionNotifier::revisionChanged, [runner](qint64 newRevision) { - runner->revisionChanged(newRevision); - }); - } - - return KAsync::start([runner](KAsync::Future &future) { - runner->run().then([&future]() { - //TODO if not live query, destroy runner. - future.setFinished(); - }).exec(); + return KAsync::start([this, resultProvider, query]() { + for (const auto &res : results) { + resultProvider->add(res); + } }); } QList results; - QSharedPointer notifier; QWeakPointer > capturedResultProvider; }; @@ -117,7 +50,6 @@ private Q_SLOTS: ResourceConfig::clear(); } - void testLoad() { auto facade = registerDummyFacade(); @@ -133,27 +65,7 @@ private Q_SLOTS: QCOMPARE(result.size(), 1); } - void testLiveQuery() - { - auto facade = registerDummyFacade(); - facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer()); - ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); - - Akonadi2::Query query; - query.resources << "dummyresource.instance1"; - query.liveQuery = true; - - async::SyncListResult result(Akonadi2::Store::load(query)); - result.exec(); - QCOMPARE(result.size(), 1); - - //Enter a second result - facade->results << QSharedPointer::create("resource", "id2", 0, QSharedPointer()); - QVERIFY(facade->notifier); - facade->notifier->revisionChanged(2); - QTRY_COMPARE(result.size(), 2); - } - + //The query provider is supposed to delete itself void testQueryLifetime() { auto facade = registerDummyFacade(); @@ -169,7 +81,7 @@ private Q_SLOTS: result.exec(); QCOMPARE(result.size(), 1); } - //It's running in a separate thread, so we have to wait for a moment. + //It's running in a separate thread, so we have to wait for a moment until the query provider deletes itself. QTRY_VERIFY(!facade->capturedResultProvider); } diff --git a/tests/genericfacadetest.cpp b/tests/genericfacadetest.cpp index fa086d1..7aaec23 100644 --- a/tests/genericfacadetest.cpp +++ b/tests/genericfacadetest.cpp @@ -35,11 +35,25 @@ public: QList mResults; }; +class TestResourceAccess : public Akonadi2::ResourceAccessInterface +{ + Q_OBJECT +public: + virtual ~TestResourceAccess() {}; + KAsync::Job sendCommand(int commandId) Q_DECL_OVERRIDE { return KAsync::null(); } + KAsync::Job sendCommand(int commandId, flatbuffers::FlatBufferBuilder &fbb) Q_DECL_OVERRIDE { return KAsync::null(); } + KAsync::Job synchronizeResource(bool remoteSync, bool localSync) Q_DECL_OVERRIDE { return KAsync::null(); } + +public Q_SLOTS: + void open() Q_DECL_OVERRIDE {} + void close() Q_DECL_OVERRIDE {} +}; + class TestResourceFacade : public Akonadi2::GenericFacade { public: - TestResourceFacade(const QByteArray &instanceIdentifier, const QSharedPointer > storage) - : Akonadi2::GenericFacade(instanceIdentifier, QSharedPointer::create(), storage) + TestResourceFacade(const QByteArray &instanceIdentifier, const QSharedPointer > storage, const QSharedPointer resourceAccess) + : Akonadi2::GenericFacade(instanceIdentifier, QSharedPointer::create(), storage, resourceAccess) { } @@ -58,11 +72,12 @@ private Q_SLOTS: { Akonadi2::Query query; query.liveQuery = false; - auto resultSet = QSharedPointer >::create(); + auto resultSet = QSharedPointer >::create(); auto storage = QSharedPointer::create("identifier", QSharedPointer::create()); + auto resourceAccess = QSharedPointer::create(); storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); - TestResourceFacade facade("identifier", storage); + TestResourceFacade facade("identifier", storage, resourceAccess); async::SyncListResult result(resultSet->emitter()); @@ -74,6 +89,38 @@ private Q_SLOTS: QCOMPARE(result.size(), 1); } + + void testLiveQuery() + { + Akonadi2::Query query; + query.liveQuery = true; + + auto resultSet = QSharedPointer >::create(); + auto storage = QSharedPointer::create("identifier", QSharedPointer::create()); + auto resourceAccess = QSharedPointer::create(); + storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); + TestResourceFacade facade("identifier", storage, resourceAccess); + + async::SyncListResult result(resultSet->emitter()); + + facade.load(query, resultSet).exec().waitForFinished(); + resultSet->initialResultSetComplete(); + + result.exec(); + QCOMPARE(result.size(), 1); + + //Enter a second result + storage->mResults.clear(); + storage->mResults << QSharedPointer::create("resource", "id2", 0, QSharedPointer()); + resourceAccess->emit revisionChanged(2); + + //Hack to get event loop in synclistresult to abort again + resultSet->initialResultSetComplete(); + result.exec(); + + // QTRY_COMPARE(result.size(), 2); + QCOMPARE(result.size(), 2); + } }; QTEST_MAIN(GenericFacadeTest) -- cgit v1.2.3