From f90ca753a4b723dbf72996bbd1261dc786c7cce6 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 31 May 2016 11:24:59 +0200 Subject: Replace the imapresourcetest with the generic mailsynctest --- tests/CMakeLists.txt | 2 +- tests/mailsynctest.cpp | 241 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/mailsynctest.h | 83 +++++++++++++++++ 3 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 tests/mailsynctest.cpp create mode 100644 tests/mailsynctest.h (limited to 'tests') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7146220..c9ad41f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,7 +12,7 @@ add_definitions(-DTESTDATAPATH="${CMAKE_CURRENT_SOURCE_DIR}/data") find_package(KF5 COMPONENTS REQUIRED Mime) -add_library(sink_test SHARED testimplementations.cpp getrssusage.cpp mailtest.cpp) +add_library(sink_test SHARED testimplementations.cpp getrssusage.cpp mailtest.cpp mailsynctest.cpp) qt5_use_modules(sink_test Core Test Concurrent) target_link_libraries(sink_test sink libhawd KF5::Mime) diff --git a/tests/mailsynctest.cpp b/tests/mailsynctest.cpp new file mode 100644 index 0000000..b86fbae --- /dev/null +++ b/tests/mailsynctest.cpp @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2016 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#include "mailsynctest.h" + +#include + +#include +#include + +#include "store.h" +#include "resourcecontrol.h" +#include "log.h" +#include "test.h" + +using namespace Sink; +using namespace Sink::ApplicationDomain; + +void MailSyncTest::initTestCase() +{ + Test::initTest(); + Log::setDebugOutputLevel(Sink::Log::Trace); + resetTestEnvironment(); + auto resource = createResource(); + QVERIFY(!resource.identifier().isEmpty()); + + VERIFYEXEC(Store::create(resource)); + + mResourceInstanceIdentifier = resource.identifier(); + mCapabilities = resource.getProperty("capabilities").value(); +} + +void MailSyncTest::cleanup() +{ + // VERIFYEXEC(ResourceControl::shutdown(mResourceInstanceIdentifier)); + ResourceControl::shutdown(mResourceInstanceIdentifier).exec().waitForFinished(); + removeResourceFromDisk(mResourceInstanceIdentifier); +} + +void MailSyncTest::init() +{ + qDebug(); + qDebug() << "-----------------------------------------"; + qDebug(); + VERIFYEXEC(ResourceControl::start(mResourceInstanceIdentifier)); +} + +void MailSyncTest::testListFolders() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request(); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &folders) { + QCOMPARE(folders.size(), 2); + QStringList names; + for (const auto &folder : folders) { + names << folder->getName(); + } + QVERIFY(names.contains("INBOX")); + QVERIFY(names.contains("test")); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testListFolderHierarchy() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request().request(); + + createFolder(QStringList() << "test" << "sub"); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &folders) { + QCOMPARE(folders.size(), 3); + QHash map; + for (const auto &folder : folders) { + map.insert(folder->getName(), folder); + } + QCOMPARE(map.value("sub")->getParent(), map.value("test")->identifier()); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testListNewFolders() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request(); + + createFolder(QStringList() << "test" << "sub1"); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &folders) { + QStringList names; + for (const auto &folder : folders) { + names << folder->getName(); + } + QVERIFY(names.contains("sub1")); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testListRemovedFolders() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request(); + + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + removeFolder(QStringList() << "test" << "sub1"); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &folders) { + QStringList names; + for (const auto &folder : folders) { + names << folder->getName(); + } + QVERIFY(!names.contains("sub1")); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testListMails() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request().request(); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &mails) { + QCOMPARE(mails.size(), 1); + QVERIFY(mails.first()->getSubject().startsWith(QString("[Nepomuk] Jenkins build is still unstable"))); + const auto data = mails.first()->getMimeMessage(); + QVERIFY(!data.isEmpty()); + + KMime::Message m; + m.setContent(data); + m.parse(); + QCOMPARE(mails.first()->getSubject(), m.subject(true)->asUnicodeString()); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testFetchNewMessages() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request().request(); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto msg = KMime::Message::Ptr::create(); + msg->subject(true)->fromUnicodeString("Foobar", "utf8"); + msg->assemble(); + createMessage(QStringList() << "test", msg->encodedContent(true)); + + Store::synchronize(query).exec().waitForFinished(); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &mails) { + QCOMPARE(mails.size(), 2); + }); + VERIFYEXEC(job); +} + +void MailSyncTest::testFetchRemovedMessages() +{ + Sink::Query query; + query.resources << mResourceInstanceIdentifier; + query.request().request(); + + // Ensure all local data is processed + VERIFYEXEC(Store::synchronize(query)); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + removeMessage(QStringList() << "test", "2:*"); + + Store::synchronize(query).exec().waitForFinished(); + ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished(); + + auto job = Store::fetchAll(query).then>([](const QList &mails) { + QCOMPARE(mails.size(), 1); + }); + VERIFYEXEC(job); +} + +//TODO test flag sync + +void MailSyncTest::testFailingSync() +{ + auto resource = createFaultyResource(); + QVERIFY(!resource.identifier().isEmpty()); + VERIFYEXEC(Store::create(resource)); + + Sink::Query query; + query.resources << resource.identifier(); + + // Ensure sync fails if resource is misconfigured + auto future = Store::synchronize(query).exec(); + future.waitForFinished(); + QVERIFY(future.errorCode()); +} + +#include "mailsynctest.moc" diff --git a/tests/mailsynctest.h b/tests/mailsynctest.h new file mode 100644 index 0000000..f9ee7be --- /dev/null +++ b/tests/mailsynctest.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2016 Christian Mollekopf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#pragma once + +#include +#include + +#include + +#define ASYNCCOMPARE(actual, expected) \ +do {\ + if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\ + return KAsync::error(1, "Comparison failed.");\ +} while (0) + +#define ASYNCVERIFY(statement) \ +do {\ + if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__))\ + return KAsync::error(1, "Verify failed.");\ +} while (0) + +#define VERIFYEXEC(statement) \ +do {\ + auto result = statement.exec(); \ + result.waitForFinished(); \ + if (!QTest::qVerify(!result.errorCode(), #statement, "", __FILE__, __LINE__))\ + return;\ +} while (0) + +namespace Sink { + +class MailSyncTest : public QObject +{ + Q_OBJECT + +protected: + QByteArray mResourceInstanceIdentifier; + QByteArrayList mCapabilities; + + virtual void resetTestEnvironment() = 0; + virtual Sink::ApplicationDomain::SinkResource createResource() = 0; + virtual Sink::ApplicationDomain::SinkResource createFaultyResource() = 0; + virtual void removeResourceFromDisk(const QByteArray &mResourceInstanceIdentifier) = 0; + virtual void createFolder(const QStringList &folderPath) = 0; + virtual void removeFolder(const QStringList &folderPath) = 0; + virtual void createMessage(const QStringList &folderPath, const QByteArray &message) = 0; + virtual void removeMessage(const QStringList &folderPath, const QByteArray &message) = 0; + +private slots: + void initTestCase(); + void init(); + void cleanup(); + + void testListFolders(); + void testListFolderHierarchy(); + void testListNewFolders(); + void testListRemovedFolders(); + + void testListMails(); + void testFetchNewMessages(); + void testFetchRemovedMessages(); + + void testFailingSync(); +}; + +} + -- cgit v1.2.3