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"