File indexing completed on 2024-11-10 04:40:20

0001 /*
0002     SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <QObject>
0008 
0009 #include "private/imapset_p.h"
0010 #include "private/scope_p.h"
0011 
0012 #include "aktest.h"
0013 #include "dbinitializer.h"
0014 #include "entities.h"
0015 #include "fakeakonadiserver.h"
0016 
0017 #include <QTest>
0018 
0019 using namespace Akonadi;
0020 using namespace Akonadi::Server;
0021 
0022 Q_DECLARE_METATYPE(Akonadi::Server::Tag::List)
0023 Q_DECLARE_METATYPE(Akonadi::Server::Tag)
0024 
0025 class FetchHandlerTest : public QObject
0026 {
0027     Q_OBJECT
0028 
0029     FakeAkonadiServer mAkonadi;
0030 
0031 public:
0032     FetchHandlerTest()
0033         : QObject()
0034     {
0035         qRegisterMetaType<Akonadi::Server::Tag::List>();
0036 
0037         mAkonadi.setPopulateDb(false);
0038         mAkonadi.init();
0039     }
0040 
0041     Protocol::FetchItemsCommandPtr createCommand(const Scope &scope, const Protocol::ScopeContext &ctx = Protocol::ScopeContext())
0042     {
0043         auto cmd = Protocol::FetchItemsCommandPtr::create(scope, ctx);
0044         auto fetchScope = cmd->itemFetchScope();
0045         fetchScope.setFetch(Protocol::ItemFetchScope::IgnoreErrors);
0046         cmd->setItemFetchScope(fetchScope);
0047         return cmd;
0048     }
0049 
0050     Protocol::FetchItemsResponsePtr createResponse(const PimItem &item)
0051     {
0052         auto resp = Protocol::FetchItemsResponsePtr::create(item.id());
0053         resp->setMimeType(item.mimeType().name());
0054         resp->setParentId(item.collectionId());
0055 
0056         return resp;
0057     }
0058 
0059     QScopedPointer<DbInitializer> initializer;
0060 
0061 private Q_SLOTS:
0062     void testFetch_data()
0063     {
0064         initializer.reset(new DbInitializer);
0065         Resource res = initializer->createResource("testresource");
0066         Collection col = initializer->createCollection("root");
0067         PimItem item1 = initializer->createItem("item1", col);
0068         PimItem item2 = initializer->createItem("item2", col);
0069 
0070         QTest::addColumn<TestScenario::List>("scenarios");
0071 
0072         {
0073             TestScenario::List scenarios;
0074             scenarios << mAkonadi.loginScenario() << TestScenario::create(5, TestScenario::ClientCmd, createCommand(item1.id()))
0075                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item1))
0076                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0077 
0078             QTest::newRow("basic fetch") << scenarios;
0079         }
0080         {
0081             TestScenario::List scenarios;
0082             scenarios << mAkonadi.loginScenario()
0083                       << TestScenario::create(5,
0084                                               TestScenario::ClientCmd,
0085                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Collection, col.id())))
0086                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item2))
0087                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item1))
0088                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0089             QTest::newRow("collection context") << scenarios;
0090         }
0091     }
0092 
0093     void testFetch()
0094     {
0095         QFETCH(TestScenario::List, scenarios);
0096 
0097         mAkonadi.setScenarios(scenarios);
0098         mAkonadi.runTest();
0099     }
0100 
0101     void testFetchByTag_data()
0102     {
0103         initializer.reset(new DbInitializer);
0104         Resource res = initializer->createResource("testresource");
0105         Collection col = initializer->createCollection("root");
0106         PimItem item1 = initializer->createItem("item1", col);
0107         PimItem item2 = initializer->createItem("item2", col);
0108 
0109         Tag tag;
0110         TagType type;
0111         type.setName(QStringLiteral("PLAIN"));
0112         type.insert();
0113         tag.setTagType(type);
0114         tag.setGid(QStringLiteral("gid"));
0115         tag.insert();
0116 
0117         item1.addTag(tag);
0118         item1.update();
0119 
0120         QTest::addColumn<TestScenario::List>("scenarios");
0121 
0122         {
0123             TestScenario::List scenarios;
0124             scenarios << mAkonadi.loginScenario()
0125                       << TestScenario::create(5,
0126                                               TestScenario::ClientCmd,
0127                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Tag, tag.id())))
0128                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item1))
0129                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0130 
0131             QTest::newRow("fetch by tag") << scenarios;
0132         }
0133         {
0134             TestScenario::List scenarios;
0135             scenarios << mAkonadi.loginScenario() << mAkonadi.selectResourceScenario(QStringLiteral("testresource"))
0136                       << TestScenario::create(5,
0137                                               TestScenario::ClientCmd,
0138                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Tag, tag.id())))
0139                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item1))
0140                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0141 
0142             QTest::newRow("uid fetch by tag from resource") << scenarios;
0143         }
0144         {
0145             TestScenario::List scenarios;
0146             scenarios << mAkonadi.loginScenario() << mAkonadi.selectResourceScenario(QStringLiteral("testresource"))
0147                       << TestScenario::create(5,
0148                                               TestScenario::ClientCmd,
0149                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Collection, col.id())))
0150                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item2))
0151                       << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item1))
0152                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0153 
0154             QTest::newRow("fetch collection") << scenarios;
0155         }
0156     }
0157 
0158     void testFetchByTag()
0159     {
0160         QFETCH(TestScenario::List, scenarios);
0161 
0162         mAkonadi.setScenarios(scenarios);
0163         mAkonadi.runTest();
0164     }
0165 
0166     void testFetchCommandContext_data()
0167     {
0168         initializer.reset(new DbInitializer);
0169         Resource res = initializer->createResource("testresource");
0170         Collection col1 = initializer->createCollection("col1");
0171         PimItem item1 = initializer->createItem("item1", col1);
0172         Collection col2 = initializer->createCollection("col2");
0173 
0174         Tag tag;
0175         TagType type;
0176         type.setName(QStringLiteral("PLAIN"));
0177         type.insert();
0178         tag.setTagType(type);
0179         tag.setGid(QStringLiteral("gid"));
0180         tag.insert();
0181 
0182         item1.addTag(tag);
0183         item1.update();
0184 
0185         QTest::addColumn<TestScenario::List>("scenarios");
0186 
0187         {
0188             TestScenario::List scenarios;
0189             scenarios << mAkonadi.loginScenario() << mAkonadi.selectResourceScenario(QStringLiteral("testresource"))
0190                       << TestScenario::create(5,
0191                                               TestScenario::ClientCmd,
0192                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Collection, col2.id())))
0193                       << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create())
0194                       << TestScenario::create(6,
0195                                               TestScenario::ClientCmd,
0196                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Tag, tag.id())))
0197                       << TestScenario::create(6, TestScenario::ServerCmd, createResponse(item1))
0198                       << TestScenario::create(6, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0199 
0200             // Special case that used to be broken due to persistent command context
0201             QTest::newRow("fetch by tag after collection") << scenarios;
0202         }
0203     }
0204 
0205     void testFetchCommandContext()
0206     {
0207         QFETCH(TestScenario::List, scenarios);
0208 
0209         mAkonadi.setScenarios(scenarios);
0210         mAkonadi.runTest();
0211     }
0212 
0213     void testList_data()
0214     {
0215         QElapsedTimer timer;
0216         initializer.reset(new DbInitializer);
0217         Resource res = initializer->createResource("testresource");
0218         Collection col1 = initializer->createCollection("col1");
0219 
0220         timer.start();
0221         QList<PimItem> items;
0222         for (int i = 0; i < 1000; i++) {
0223             items.append(initializer->createItem(QString::number(i).toLatin1().constData(), col1));
0224         }
0225         qDebug() << timer.nsecsElapsed() / 1.0e6 << "ms";
0226         timer.start();
0227 
0228         QTest::addColumn<TestScenario::List>("scenarios");
0229 
0230         {
0231             TestScenario::List scenarios;
0232             scenarios << mAkonadi.loginScenario()
0233                       << TestScenario::create(5,
0234                                               TestScenario::ClientCmd,
0235                                               createCommand(ImapSet::all(), Protocol::ScopeContext(Protocol::ScopeContext::Collection, col1.id())));
0236             while (!items.isEmpty()) {
0237                 const PimItem &item = items.takeLast();
0238                 scenarios << TestScenario::create(5, TestScenario::ServerCmd, createResponse(item));
0239             }
0240             scenarios << TestScenario::create(5, TestScenario::ServerCmd, Protocol::FetchItemsResponsePtr::create());
0241             QTest::newRow("complete list") << scenarios;
0242         }
0243         qDebug() << timer.nsecsElapsed() / 1.0e6 << "ms";
0244     }
0245 
0246     void testList()
0247     {
0248         QFETCH(TestScenario::List, scenarios);
0249 
0250         mAkonadi.setScenarios(scenarios);
0251         // StorageDebugger::instance()->enableSQLDebugging(true);
0252         // StorageDebugger::instance()->writeToFile(QStringLiteral("sqllog.txt"));
0253         mAkonadi.runTest();
0254     }
0255 };
0256 
0257 AKTEST_FAKESERVER_MAIN(FetchHandlerTest)
0258 
0259 #include "fetchhandlertest.moc"