File indexing completed on 2024-05-12 05:17:10
0001 /* 0002 SPDX-FileCopyrightText: 2013 Christian Mollekopf <mollekopf@kolabsys.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include <QTest> 0008 0009 #include "kimap/getmetadatajob.h" 0010 #include "kimap/session.h" 0011 #include "kimaptest/fakeserver.h" 0012 0013 #include <QDebug> 0014 #include <QTest> 0015 0016 using MAP = QMap<QByteArray, QByteArray>; 0017 Q_DECLARE_METATYPE(MAP) 0018 0019 class GetMetadataJobTest : public QObject 0020 { 0021 Q_OBJECT 0022 0023 private Q_SLOTS: 0024 0025 void metadata_data() 0026 { 0027 QTest::addColumn<QList<QByteArray>>("scenario"); 0028 QTest::addColumn<QString>("mailbox"); 0029 QTest::addColumn<QMap<QByteArray, QByteArray>>("expectedAnnotations"); 0030 0031 { 0032 // FIXME requesting /shared and getting /private back doesn't make sense => fix scenario 0033 QList<QByteArray> scenario; 0034 scenario << FakeServer::preauth() << "C: A000001 GETMETADATA (DEPTH infinity) \"Folder1\" (/shared)" 0035 << R"(S: * METADATA "Folder1" (/shared/comment "Shared comment"))" 0036 << R"(S: * METADATA "Folder1" (/private/comment "My own comment"))" 0037 << "S: A000001 OK GETMETADATA complete"; 0038 QMap<QByteArray, QByteArray> expected; 0039 expected.insert("/shared/comment", "Shared comment"); 0040 expected.insert("/private/comment", "My own comment"); 0041 QTest::newRow("normal") << scenario << "Folder1" << expected; 0042 } 0043 { 0044 QList<QByteArray> scenario; 0045 scenario << FakeServer::preauth() << "C: A000001 GETMETADATA (DEPTH infinity) \"Folder1\" (/shared)" 0046 << R"(S: * METADATA "Folder1" (/shared/comment "Shared comment" /private/comment "My own comment"))" 0047 << "S: A000001 OK GETMETADATA complete"; 0048 QMap<QByteArray, QByteArray> expected; 0049 expected.insert("/shared/comment", "Shared comment"); 0050 expected.insert("/private/comment", "My own comment"); 0051 QTest::newRow("combined response") << scenario << "Folder1" << expected; 0052 } 0053 { 0054 QList<QByteArray> scenario; 0055 scenario << FakeServer::preauth() << "C: A000001 GETMETADATA (DEPTH infinity) \"Folder1\" (/shared)" 0056 << R"(S: * METADATA "Folder1" (/shared/comment "NIL" /private/comment "NIL"))" 0057 << "S: A000001 OK GETMETADATA complete"; 0058 QMap<QByteArray, QByteArray> expected; 0059 expected.insert("/shared/comment", ""); 0060 expected.insert("/private/comment", ""); 0061 QTest::newRow("NIL response") << scenario << "Folder1" << expected; 0062 } 0063 } 0064 0065 void metadata() 0066 { 0067 QFETCH(QList<QByteArray>, scenario); 0068 QFETCH(QString, mailbox); 0069 QFETCH(MAP, expectedAnnotations); 0070 0071 FakeServer fakeServer; 0072 fakeServer.setScenario(scenario); 0073 fakeServer.startAndWait(); 0074 0075 KIMAP::Session session(QLatin1StringView("127.0.0.1"), 5989); 0076 0077 auto getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0078 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0079 getMetadataJob->setMailBox(mailbox); 0080 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::AllLevels); 0081 getMetadataJob->addRequestedEntry("/shared"); 0082 0083 QVERIFY(getMetadataJob->exec()); 0084 0085 QCOMPARE(getMetadataJob->allMetaData(mailbox).size(), expectedAnnotations.size()); 0086 const QMap<QByteArray, QByteArray> &allMetaData = getMetadataJob->allMetaData(); 0087 QCOMPARE(allMetaData.size(), expectedAnnotations.size()); 0088 const auto keys = expectedAnnotations.keys(); 0089 for (const QByteArray &entry : keys) { 0090 QCOMPARE(getMetadataJob->metaData(mailbox, entry), expectedAnnotations.value(entry)); 0091 QCOMPARE(getMetadataJob->metaData(entry), expectedAnnotations.value(entry)); 0092 QCOMPARE(allMetaData.value(entry), expectedAnnotations.value(entry)); 0093 } 0094 0095 fakeServer.quit(); 0096 } 0097 0098 void testMetadataParameter() 0099 { 0100 FakeServer fakeServer; 0101 QList<QByteArray> scenario; 0102 0103 scenario << FakeServer::preauth() << "C: A000001 GETMETADATA \"Folder1\" (/shared)" 0104 << "S: A000001 OK GETMETADATA complete" 0105 << "C: A000002 GETMETADATA (DEPTH 1) \"Folder1\" (/shared)" 0106 << "S: A000002 OK GETMETADATA complete" 0107 << "C: A000003 GETMETADATA (MAXSIZE 1234) \"Folder1\" (/shared)" 0108 << "S: A000003 OK GETMETADATA complete" 0109 << "C: A000004 GETMETADATA (DEPTH 1 MAXSIZE 1234) \"Folder1\" (/shared)" 0110 << "S: A000004 OK GETMETADATA complete" 0111 << "C: A000005 GETMETADATA (DEPTH 1 MAXSIZE 1234) \"Folder1\" (/shared /shared2)" 0112 << "S: A000005 OK GETMETADATA complete" 0113 << "C: A000006 GETMETADATA (DEPTH 1 MAXSIZE 1234) \"Folder1\"" 0114 << "S: A000006 OK GETMETADATA complete" 0115 << "C: A000007 GETMETADATA (DEPTH 1) \"Folder1\"" 0116 << "S: A000007 OK GETMETADATA complete" 0117 << "C: A000008 GETMETADATA (MAXSIZE 1234) \"Folder1\"" 0118 << "S: A000008 OK GETMETADATA complete" 0119 << "C: A000009 GETMETADATA \"Folder1\"" 0120 << "S: A000009 OK GETMETADATA complete" 0121 << "C: A000010 GETMETADATA \"\"" 0122 << "S: A000010 OK GETMETADATA complete"; 0123 fakeServer.setScenario(scenario); 0124 fakeServer.startAndWait(); 0125 0126 KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989); 0127 0128 // C: A000001 GETMETADATA "Folder1" (/shared) 0129 auto getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0130 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0131 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0132 getMetadataJob->addRequestedEntry("/shared"); 0133 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::NoDepth); 0134 QVERIFY(getMetadataJob->exec()); 0135 0136 QCOMPARE(getMetadataJob->allMetaData(QLatin1StringView("Folder1")).size(), 0); 0137 0138 // C: A000002 GETMETADATA "Folder1" (DEPTH 1) (/shared) 0139 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0140 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0141 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0142 getMetadataJob->addRequestedEntry("/shared"); 0143 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::OneLevel); 0144 QVERIFY(getMetadataJob->exec()); 0145 0146 // C: A000003 GETMETADATA "Folder1" (MAXSIZE 1234) (/shared) 0147 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0148 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0149 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0150 getMetadataJob->addRequestedEntry("/shared"); 0151 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::NoDepth); 0152 getMetadataJob->setMaximumSize(1234); 0153 QVERIFY(getMetadataJob->exec()); 0154 0155 // C: A000004 GETMETADATA "Folder1" (DEPTH 1) (MAXSIZE 1234) (/shared) 0156 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0157 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0158 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0159 getMetadataJob->addRequestedEntry("/shared"); 0160 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::OneLevel); 0161 getMetadataJob->setMaximumSize(1234); 0162 QVERIFY(getMetadataJob->exec()); 0163 0164 // C: A000005 GETMETADATA "Folder1" (DEPTH 1) (MAXSIZE 1234) (/shared /shared2) 0165 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0166 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0167 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0168 getMetadataJob->addRequestedEntry("/shared"); 0169 getMetadataJob->addRequestedEntry("/shared2"); 0170 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::OneLevel); 0171 getMetadataJob->setMaximumSize(1234); 0172 QVERIFY(getMetadataJob->exec()); 0173 0174 // C: A000006 GETMETADATA "Folder1" (DEPTH 1) (MAXSIZE 1234) 0175 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0176 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0177 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0178 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::OneLevel); 0179 getMetadataJob->setMaximumSize(1234); 0180 QVERIFY(getMetadataJob->exec()); 0181 0182 // C: A000007 GETMETADATA "Folder1" (DEPTH 1) 0183 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0184 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0185 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0186 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::OneLevel); 0187 QVERIFY(getMetadataJob->exec()); 0188 0189 // C: A000008 GETMETADATA "Folder1" (MAXSIZE 1234) 0190 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0191 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0192 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0193 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::NoDepth); 0194 getMetadataJob->setMaximumSize(1234); 0195 QVERIFY(getMetadataJob->exec()); 0196 0197 // C: A000009 GETMETADATA "Folder1" 0198 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0199 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0200 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0201 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::NoDepth); 0202 QVERIFY(getMetadataJob->exec()); 0203 0204 // C: A000010 GETMETADATA "" 0205 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0206 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Metadata); 0207 getMetadataJob->setMailBox(QLatin1StringView("")); 0208 getMetadataJob->setDepth(KIMAP::GetMetaDataJob::NoDepth); 0209 QVERIFY(getMetadataJob->exec()); 0210 0211 QVERIFY(fakeServer.isAllScenarioDone()); 0212 fakeServer.quit(); 0213 } 0214 0215 void annotatemore_data() 0216 { 0217 QTest::addColumn<QList<QByteArray>>("scenario"); 0218 QTest::addColumn<QString>("mailbox"); 0219 QTest::addColumn<QMap<QByteArray, QByteArray>>("expectedAnnotations"); 0220 QTest::addColumn<QByteArray>("entry"); 0221 0222 { 0223 QList<QByteArray> scenario; 0224 scenario << FakeServer::preauth() << R"(C: A000001 GETANNOTATION "Folder1" "*" "value.shared")" 0225 << "S: * ANNOTATION Folder1 /comment (value.shared \"Shared comment\")" 0226 << "S: * ANNOTATION Folder1 /comment (value.priv \"My own comment\")" 0227 << "S: A000001 OK annotations retrieved"; 0228 0229 QMap<QByteArray, QByteArray> expected; 0230 expected.insert("/shared/comment", "Shared comment"); 0231 expected.insert("/private/comment", "My own comment"); 0232 QTest::newRow("get all") << scenario << "Folder1" << expected << QByteArray("/shared*"); 0233 } 0234 { 0235 QList<QByteArray> scenario; 0236 scenario << FakeServer::preauth() << R"(C: A000001 GETANNOTATION "Folder1" "/comment" "value.shared")" 0237 << "S: * ANNOTATION Folder1 /comment (value.shared \"Shared comment\")" 0238 << "S: * ANNOTATION Folder1 /comment (value.priv \"My own comment\")" 0239 << "S: A000001 OK annotations retrieved"; 0240 0241 QMap<QByteArray, QByteArray> expected; 0242 expected.insert("/shared/comment", "Shared comment"); 0243 expected.insert("/private/comment", "My own comment"); 0244 QTest::newRow("get single") << scenario << "Folder1" << expected << QByteArray("/shared/comment"); 0245 } 0246 } 0247 0248 void annotatemore() 0249 { 0250 QFETCH(QList<QByteArray>, scenario); 0251 QFETCH(QString, mailbox); 0252 QFETCH(MAP, expectedAnnotations); 0253 QFETCH(QByteArray, entry); 0254 0255 FakeServer fakeServer; 0256 fakeServer.setScenario(scenario); 0257 fakeServer.startAndWait(); 0258 0259 KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989); 0260 0261 auto getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0262 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore); 0263 getMetadataJob->setMailBox(mailbox); 0264 getMetadataJob->addRequestedEntry(entry); 0265 0266 QVERIFY(getMetadataJob->exec()); 0267 0268 // qDebug() << getMetadataJob->allMetaData(mailbox); 0269 qDebug() << getMetadataJob->allMetaData(); 0270 const QMap<QByteArray, QByteArray> &allMetaData = getMetadataJob->allMetaData(); 0271 QCOMPARE(allMetaData.size(), expectedAnnotations.size()); 0272 const auto keys = expectedAnnotations.keys(); 0273 for (const QByteArray &e : keys) { 0274 QCOMPARE(getMetadataJob->metaData(e), expectedAnnotations.value(e)); 0275 QCOMPARE(allMetaData.value(e), expectedAnnotations.value(e)); 0276 } 0277 0278 fakeServer.quit(); 0279 } 0280 0281 void testAnnotateEntires() 0282 { 0283 FakeServer fakeServer; 0284 QList<QByteArray> scenario; 0285 0286 scenario << FakeServer::preauth() << "C: A000001 GETANNOTATION \"Folder1\"" 0287 << "S: A000001 OK annotations retrieved" 0288 << R"(C: A000002 GETANNOTATION "Folder1" ("/comment" "/motd") ("value.priv" "value.shared"))" 0289 << "S: A000002 OK annotations retrieved"; 0290 fakeServer.setScenario(scenario); 0291 fakeServer.startAndWait(); 0292 0293 KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989); 0294 0295 // C: A000001 GETANNOTATION "Folder1" 0296 auto getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0297 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore); 0298 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0299 QVERIFY(getMetadataJob->exec()); 0300 0301 QCOMPARE(getMetadataJob->allMetaData(QLatin1StringView("Folder1")).size(), 0); 0302 0303 // C: A000002 GETANNOTATION "Folder1" ("/comment" "/motd") ("value.shared" "value.priv") 0304 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0305 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore); 0306 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0307 getMetadataJob->addRequestedEntry("/shared/comment"); 0308 getMetadataJob->addRequestedEntry("/private/motd"); 0309 QVERIFY(getMetadataJob->exec()); 0310 0311 QVERIFY(fakeServer.isAllScenarioDone()); 0312 fakeServer.quit(); 0313 } 0314 0315 void testAnnotateMutiple() 0316 { 0317 // Do not double same parts of the request 0318 FakeServer fakeServer; 0319 QList<QByteArray> scenario; 0320 0321 scenario << FakeServer::preauth() << R"(C: A000001 GETANNOTATION "Folder1" ("/comment" "/motd") "value.shared")" 0322 << "S: A000001 OK annotations retrieved" 0323 << R"(C: A000002 GETANNOTATION "Folder1" "/comment" ("value.priv" "value.shared"))" 0324 << "S: A000002 OK annotations retrieved"; 0325 fakeServer.setScenario(scenario); 0326 fakeServer.startAndWait(); 0327 0328 KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989); 0329 0330 // C: A000001 GETANNOTATION "Folder1" ("/comment" "/motd") "value.shared" 0331 auto getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0332 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore); 0333 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0334 getMetadataJob->addRequestedEntry("/shared/comment"); 0335 getMetadataJob->addRequestedEntry("/shared/motd"); 0336 QVERIFY(getMetadataJob->exec()); 0337 0338 // C: A000002 GETANNOTATION "Folder1" ("/comment") ("value.shared" "value.priv") 0339 getMetadataJob = new KIMAP::GetMetaDataJob(&session); 0340 getMetadataJob->setServerCapability(KIMAP::MetaDataJobBase::Annotatemore); 0341 getMetadataJob->setMailBox(QStringLiteral("Folder1")); 0342 getMetadataJob->addRequestedEntry("/shared/comment"); 0343 getMetadataJob->addRequestedEntry("/private/comment"); 0344 QVERIFY(getMetadataJob->exec()); 0345 0346 QVERIFY(fakeServer.isAllScenarioDone()); 0347 fakeServer.quit(); 0348 } 0349 }; 0350 0351 QTEST_GUILESS_MAIN(GetMetadataJobTest) 0352 0353 #include "getmetadatajobtest.moc"