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"