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"