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"