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