File indexing completed on 2024-05-12 05:11:09

0001 /*
0002     SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "mailserializertest.h"
0008 
0009 #include "../serializers/akonadi_serializer_mail.h"
0010 #include "../src/messageflags.h"
0011 #include "../src/messageparts.h"
0012 
0013 #include <KMime/Message>
0014 
0015 #include <QBuffer>
0016 #include <QTest>
0017 
0018 using namespace Akonadi;
0019 using namespace KMime;
0020 
0021 QTEST_GUILESS_MAIN(MailSerializerTest)
0022 
0023 void MailSerializerTest::testEnvelopeDeserialize_data()
0024 {
0025     QTest::addColumn<int>("version");
0026     QTest::addColumn<QByteArray>("data");
0027     QTest::addColumn<QDateTime>("date");
0028     QTest::addColumn<QString>("subject");
0029     QTest::addColumn<QString>("from");
0030     QTest::addColumn<QString>("sender");
0031     QTest::addColumn<QString>("replyTo");
0032     QTest::addColumn<QString>("to");
0033     QTest::addColumn<QString>("cc");
0034     QTest::addColumn<QString>("bcc");
0035     QTest::addColumn<QString>("inReplyTo");
0036     QTest::addColumn<QString>("messageId");
0037     QTest::addColumn<QString>("references");
0038 
0039     QTest::newRow("v1 - no references")
0040         << 1
0041         << QByteArray(
0042                R"(("Wed, 1 Feb 2006 13:37:19 UT" "IMPORTANT: Akonadi Test" (("Tobias Koenig" NIL "tokoe" "kde.org")) (("Tobias Koenig" NIL "tokoe" "kde.org")) NIL (("Ingo Kloecker" NIL "kloecker" "kde.org")) NIL NIL NIL <{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org>))")
0043         << QDateTime(QDate(2006, 2, 1), QTime(13, 37, 19), QTimeZone::UTC) << QStringLiteral("IMPORTANT: Akonadi Test")
0044         << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QString()
0045         << QStringLiteral("Ingo Kloecker <kloecker@kde.org>") << QString() << QString() << QString()
0046         << QStringLiteral("<{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org>") << QString();
0047 
0048     QTest::newRow("v1 - with references")
0049         << 1
0050         << QByteArray(
0051                R"(("Wed, 1 Feb 2006 13:37:19 UT" "IMPORTANT: Akonadi Test" (("Tobias Koenig" NIL "tokoe" "kde.org")) (("Tobias Koenig" NIL "tokoe" "kde.org")) NIL (("Ingo Kloecker" NIL "kloecker" "kde.org")) NIL NIL NIL <{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org> "<{8888827e-77f4-489d-bf18-e805be96718c}@server.kde.org> <{9999927e-77f4-489d-bf18-e805be96718c}@server.kde.org>"))")
0052         << QDateTime(QDate(2006, 2, 1), QTime(13, 37, 19), QTimeZone::UTC) << QStringLiteral("IMPORTANT: Akonadi Test")
0053         << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QString()
0054         << QStringLiteral("Ingo Kloecker <kloecker@kde.org>") << QString() << QString() << QString()
0055         << QStringLiteral("<{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org>")
0056         << QStringLiteral("<{8888827e-77f4-489d-bf18-e805be96718c}@server.kde.org> <{9999927e-77f4-489d-bf18-e805be96718c}@server.kde.org>");
0057 
0058     QBuffer buffer;
0059     buffer.open(QIODevice::WriteOnly);
0060     QDataStream stream(&buffer);
0061     stream << QDateTime(QDate(2015, 6, 29), QTime(23, 50, 10), QTimeZone::UTC) << QStringLiteral("Důležité: Testování Akonadi")
0062            << QStringLiteral("<1234567.icameup@withthis>") << QStringLiteral("<2849719.IhmDc3qecs@thor>")
0063            << QStringLiteral("<1234567.icameup@withthis> <7654321.icameupwith@thistoo>") << 1 << QStringLiteral("Daniel Vrátil") << QStringLiteral("dvratil")
0064            << QStringLiteral("kde.org") << 1 << QStringLiteral("Daniel Vrátil") << QStringLiteral("dvratil") << QStringLiteral("kde.org") << 0 << 1
0065            << QStringLiteral("Volker Krause") << QStringLiteral("vkrause") << QStringLiteral("kde.org") << 0 << 0;
0066 
0067     QTest::newRow("v2") << 2 << buffer.data() << QDateTime(QDate(2015, 6, 29), QTime(23, 50, 10), QTimeZone::UTC)
0068                         << QStringLiteral("Důležité: Testování Akonadi") << QStringLiteral("Daniel Vrátil <dvratil@kde.org>")
0069                         << QStringLiteral("Daniel Vrátil <dvratil@kde.org>") << QString() // reply to
0070                         << QStringLiteral("Volker Krause <vkrause@kde.org>") << QString() // cc
0071                         << QString() // bcc
0072                         << QStringLiteral("<1234567.icameup@withthis>") << QStringLiteral("<2849719.IhmDc3qecs@thor>")
0073                         << QStringLiteral("<1234567.icameup@withthis> <7654321.icameupwith@thistoo>");
0074 }
0075 
0076 void MailSerializerTest::testEnvelopeDeserialize()
0077 {
0078     QFETCH(int, version);
0079     QFETCH(QByteArray, data);
0080     QFETCH(QDateTime, date);
0081     QFETCH(QString, subject);
0082     QFETCH(QString, from);
0083     QFETCH(QString, sender);
0084     QFETCH(QString, replyTo);
0085     QFETCH(QString, to);
0086     QFETCH(QString, cc);
0087     QFETCH(QString, bcc);
0088     QFETCH(QString, inReplyTo);
0089     QFETCH(QString, messageId);
0090     QFETCH(QString, references);
0091 
0092     Item i;
0093     i.setMimeType(QStringLiteral("message/rfc822"));
0094 
0095     auto serializer = new SerializerPluginMail();
0096 
0097     // envelope
0098     QBuffer buffer;
0099     buffer.setData(data);
0100     buffer.open(QIODevice::ReadOnly);
0101     QBENCHMARK {
0102         buffer.seek(0);
0103         serializer->deserialize(i, MessagePart::Envelope, buffer, version);
0104     }
0105     QVERIFY(i.hasPayload<KMime::Message::Ptr>());
0106 
0107     auto msg = i.payload<KMime::Message::Ptr>();
0108     QCOMPARE(msg->date()->dateTime(), date);
0109     QCOMPARE(msg->subject()->asUnicodeString(), subject);
0110     QCOMPARE(msg->from()->asUnicodeString(), from);
0111     QCOMPARE(msg->sender()->asUnicodeString(), sender);
0112     QCOMPARE(msg->replyTo()->asUnicodeString(), replyTo);
0113     QCOMPARE(msg->to()->asUnicodeString(), to);
0114     QCOMPARE(msg->cc()->asUnicodeString(), cc);
0115     QCOMPARE(msg->bcc()->asUnicodeString(), bcc);
0116     QCOMPARE(msg->inReplyTo()->asUnicodeString(), inReplyTo);
0117     QCOMPARE(msg->messageID()->asUnicodeString(), messageId);
0118     QCOMPARE(msg->references()->asUnicodeString(), references);
0119 
0120     delete serializer;
0121 }
0122 
0123 void MailSerializerTest::testEnvelopeSerialize_data()
0124 {
0125     QTest::addColumn<QDateTime>("date");
0126     QTest::addColumn<QString>("subject");
0127     QTest::addColumn<QString>("from");
0128     QTest::addColumn<QString>("sender");
0129     QTest::addColumn<QString>("replyTo");
0130     QTest::addColumn<QString>("to");
0131     QTest::addColumn<QString>("cc");
0132     QTest::addColumn<QString>("bcc");
0133     QTest::addColumn<QString>("inReplyTo");
0134     QTest::addColumn<QString>("messageId");
0135     QTest::addColumn<QString>("references");
0136     QTest::addColumn<QByteArray>("data");
0137 
0138     QBuffer buffer;
0139     buffer.open(QIODevice::WriteOnly);
0140     QDataStream stream(&buffer);
0141     stream << QDateTime(QDate(2006, 2, 1), QTime(13, 37, 19), QTimeZone::UTC) << QStringLiteral("IMPORTANT: Akonadi Test") << QString()
0142            << QStringLiteral("<{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org>") << QString() << 1 << QStringLiteral("Tobias Koenig")
0143            << QStringLiteral("tokoe") << QStringLiteral("kde.org") << 1 << QStringLiteral("Tobias Koenig") << QStringLiteral("tokoe")
0144            << QStringLiteral("kde.org") << 0 << 1 << QStringLiteral("Ingo Kloecker") << QStringLiteral("kloecker") << QStringLiteral("kde.org") << 0 << 0;
0145     QTest::newRow("") << QDateTime(QDate(2006, 2, 1), QTime(13, 37, 19), QTimeZone::UTC) << QStringLiteral("IMPORTANT: Akonadi Test")
0146                       << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QStringLiteral("Tobias Koenig <tokoe@kde.org>") << QString()
0147                       << QStringLiteral("Ingo Kloecker <kloecker@kde.org>") << QString() << QString() << QString()
0148                       << QStringLiteral("<{7b55527e-77f4-489d-bf18-e805be96718c}@server.kde.org>") << QString() << buffer.data();
0149 }
0150 
0151 void MailSerializerTest::testEnvelopeSerialize()
0152 {
0153     QFETCH(QDateTime, date);
0154     QFETCH(QString, subject);
0155     QFETCH(QString, from);
0156     QFETCH(QString, sender);
0157     QFETCH(QString, replyTo);
0158     QFETCH(QString, to);
0159     QFETCH(QString, cc);
0160     QFETCH(QString, bcc);
0161     QFETCH(QString, inReplyTo);
0162     QFETCH(QString, messageId);
0163     QFETCH(QString, references);
0164     QFETCH(QByteArray, data);
0165 
0166     Item i;
0167     i.setMimeType(QStringLiteral("message/rfc822"));
0168     auto msg = new Message();
0169     msg->date()->setDateTime(date);
0170     msg->subject()->fromUnicodeString(subject, "UTF-8");
0171     msg->from()->fromUnicodeString(from, "UTF-8");
0172     msg->sender()->fromUnicodeString(sender, "UTF-8");
0173     msg->replyTo()->fromUnicodeString(replyTo, "UTF-8");
0174     msg->to()->fromUnicodeString(to, "UTF-8");
0175     msg->cc()->fromUnicodeString(cc, "UTF-8");
0176     msg->bcc()->fromUnicodeString(bcc, "UTF-8");
0177     msg->inReplyTo()->fromUnicodeString(inReplyTo, "UTF-8");
0178     msg->messageID()->fromUnicodeString(messageId, "UTF-8");
0179     msg->references()->fromUnicodeString(references, "UTF-8");
0180     i.setPayload(KMime::Message::Ptr(msg));
0181 
0182     auto serializer = new SerializerPluginMail();
0183 
0184     // envelope
0185     QByteArray env;
0186     QBuffer buffer;
0187     buffer.setBuffer(&env);
0188     buffer.open(QIODevice::ReadWrite);
0189     int version = 0;
0190     QBENCHMARK {
0191         buffer.seek(0);
0192         serializer->serialize(i, MessagePart::Envelope, buffer, version);
0193     }
0194     QCOMPARE(env, data);
0195 
0196     delete serializer;
0197 }
0198 
0199 void MailSerializerTest::testParts()
0200 {
0201     Item item;
0202     item.setMimeType(QStringLiteral("message/rfc822"));
0203     auto m = new Message;
0204     KMime::Message::Ptr msg(m);
0205     item.setPayload(msg);
0206 
0207     auto serializer = new SerializerPluginMail();
0208     QVERIFY(serializer->parts(item).isEmpty());
0209 
0210     msg->setHead("foo");
0211     QSet<QByteArray> parts = serializer->parts(item);
0212     QCOMPARE(parts.count(), 2);
0213     QVERIFY(parts.contains(MessagePart::Envelope));
0214     QVERIFY(parts.contains(MessagePart::Header));
0215 
0216     msg->setBody("bar");
0217     parts = serializer->parts(item);
0218     QCOMPARE(parts.count(), 3);
0219     QVERIFY(parts.contains(MessagePart::Envelope));
0220     QVERIFY(parts.contains(MessagePart::Header));
0221     QVERIFY(parts.contains(MessagePart::Body));
0222 
0223     delete serializer;
0224 }
0225 
0226 void MailSerializerTest::testHeaderFetch()
0227 {
0228     Item i;
0229     i.setMimeType(QStringLiteral("message/rfc822"));
0230 
0231     auto serializer = new SerializerPluginMail();
0232 
0233     QByteArray headerData(
0234         "From: David Johnson <david@usermode.org>\n"
0235         "To: kde-commits@kde.org\n"
0236         "MIME-Version: 1.0\n"
0237         "Date: Sun, 01 Feb 2009 06:25:22 +0000\n"
0238         "Message-Id: <1233469522.741324.18468.nullmailer@svn.kde.org>\n"
0239         "Subject: [kde-doc-english] KDE/kdeutils/kcalc\n");
0240 
0241     QString expectedSubject = QStringLiteral("[kde-doc-english] KDE/kdeutils/kcalc");
0242     QString expectedFrom = QStringLiteral("David Johnson <david@usermode.org>");
0243     QString expectedTo = QStringLiteral("kde-commits@kde.org");
0244 
0245     // envelope
0246     QBuffer buffer;
0247     buffer.setData(headerData);
0248     buffer.open(QIODevice::ReadOnly);
0249     buffer.seek(0);
0250     serializer->deserialize(i, MessagePart::Header, buffer, 0);
0251     QVERIFY(i.hasPayload<KMime::Message::Ptr>());
0252 
0253     auto msg = i.payload<KMime::Message::Ptr>();
0254     QCOMPARE(msg->subject()->asUnicodeString(), expectedSubject);
0255     QCOMPARE(msg->from()->asUnicodeString(), expectedFrom);
0256     QCOMPARE(msg->to()->asUnicodeString(), expectedTo);
0257 
0258     delete serializer;
0259 }
0260 
0261 void MailSerializerTest::testMultiDeserialize()
0262 {
0263     // The Body part includes the Header.
0264     // When serialization is done a second time, we should already have the header deserialized.
0265     // We change the header data for the second deserialization (which is an unrealistic scenario)
0266     // to demonstrate that it is not deserialized again.
0267 
0268     Item i;
0269     i.setMimeType(QStringLiteral("message/rfc822"));
0270 
0271     auto serializer = new SerializerPluginMail();
0272 
0273     QByteArray messageData(
0274         "From: David Johnson <david@usermode.org>\n"
0275         "To: kde-commits@kde.org\n"
0276         "MIME-Version: 1.0\n"
0277         "Date: Sun, 01 Feb 2009 06:25:22 +0000\n"
0278         "Subject: [kde-doc-english] KDE/kdeutils/kcalc\n"
0279         "Content-Type: text/plain\n"
0280         "\n"
0281         "This is content");
0282 
0283     QString expectedSubject = QStringLiteral("[kde-doc-english] KDE/kdeutils/kcalc");
0284     QString expectedFrom = QStringLiteral("David Johnson <david@usermode.org>");
0285     QString expectedTo = QStringLiteral("kde-commits@kde.org");
0286     QByteArray expectedBody("This is content");
0287 
0288     // envelope
0289     QBuffer buffer;
0290     buffer.setData(messageData);
0291     buffer.open(QIODevice::ReadOnly);
0292     buffer.seek(0);
0293     serializer->deserialize(i, MessagePart::Body, buffer, 0);
0294     QVERIFY(i.hasPayload<KMime::Message::Ptr>());
0295 
0296     auto msg = i.payload<KMime::Message::Ptr>();
0297     QCOMPARE(msg->subject()->asUnicodeString(), expectedSubject);
0298     QCOMPARE(msg->from()->asUnicodeString(), expectedFrom);
0299     QCOMPARE(msg->to()->asUnicodeString(), expectedTo);
0300     QCOMPARE(msg->body(), expectedBody);
0301 
0302     buffer.close();
0303 
0304     messageData = QByteArray(
0305         "From: DIFFERENT CONTACT <DIFFERENTCONTACT@example.org>\n"
0306         "To: kde-commits@kde.org\n"
0307         "MIME-Version: 1.0\n"
0308         "Date: Sun, 01 Feb 2009 06:25:22 +0000\n"
0309         "Message-Id: <1233469522.741324.18468.nullmailer@svn.kde.org>\n"
0310         "Subject: [kde-doc-english] KDE/kdeutils/kcalc\n"
0311         "Content-Type: text/plain\n"
0312         "\r\n"
0313         "This is content");
0314 
0315     buffer.setData(messageData);
0316     buffer.open(QIODevice::ReadOnly);
0317     buffer.seek(0);
0318 
0319     serializer->deserialize(i, MessagePart::Header, buffer, 0);
0320     QVERIFY(i.hasPayload<KMime::Message::Ptr>());
0321 
0322     msg = i.payload<KMime::Message::Ptr>();
0323     QCOMPARE(msg->subject()->asUnicodeString(), expectedSubject);
0324     QCOMPARE(msg->from()->asUnicodeString(), expectedFrom);
0325     QCOMPARE(msg->to()->asUnicodeString(), expectedTo);
0326 
0327     delete serializer;
0328 }
0329 
0330 #include "moc_mailserializertest.cpp"