// SPDX-FileCopyrightText: 2012 Jeremy Lainé // SPDX-FileCopyrightText: 2022 Melvin Keskin // // SPDX-License-Identifier: LGPL-2.1-or-later #include "QXmppE2eeMetadata.h" #include "QXmppStanza.h" #include "util.h" #include #include class QXmppStanzaStub : public QXmppStanza { public: void toXml(QXmlStreamWriter *) const override {}; }; class tst_QXmppStanza : public QObject { Q_OBJECT private: Q_SLOT void testExtendedAddress_data(); Q_SLOT void testExtendedAddress(); Q_SLOT void testErrorCases_data(); Q_SLOT void testErrorCases(); Q_SLOT void testErrorFileTooLarge(); Q_SLOT void testErrorRetry(); Q_SLOT void testErrorEnums(); Q_SLOT void testEncryption(); Q_SLOT void testSenderKey(); Q_SLOT void testSceTimestamp(); }; void tst_QXmppStanza::testExtendedAddress_data() { QTest::addColumn("xml"); QTest::addColumn("delivered"); QTest::addColumn("description"); QTest::addColumn("jid"); QTest::addColumn("type"); QTest::newRow("simple") << QByteArray(R"(
)") << false << QString() << QString("foo@example.com/QXmpp") << QString("bcc"); QTest::newRow("full") << QByteArray(R"(
)") << true << QString("some description") << QString("foo@example.com/QXmpp") << QString("bcc"); } void tst_QXmppStanza::testExtendedAddress() { QFETCH(QByteArray, xml); QFETCH(bool, delivered); QFETCH(QString, description); QFETCH(QString, jid); QFETCH(QString, type); QXmppExtendedAddress address; parsePacket(address, xml); QCOMPARE(address.isDelivered(), delivered); QCOMPARE(address.description(), description); QCOMPARE(address.jid(), jid); QCOMPARE(address.type(), type); serializePacket(address, xml); } void tst_QXmppStanza::testErrorCases_data() { QTest::addColumn("xml"); QTest::addColumn("type"); QTest::addColumn("condition"); QTest::addColumn("text"); QTest::addColumn("redirectionUri"); QTest::addColumn("by"); #define ROW(name, xml, type, condition, text, redirect, by) \ QTest::newRow(QT_STRINGIFY(name)) \ << QByteArrayLiteral(xml) \ << QXmppStanza::Error::type \ << QXmppStanza::Error::condition \ << text \ << redirect \ << by #define BASIC(xml, type, condition) \ ROW(condition, xml, type, condition, QString(), QString(), QString()) ROW( empty - text, "" "" "", Modify, BadRequest, QString(), QString(), QString()); ROW( redirection - uri - gone, "" "" "xmpp:romeo@afterlife.example.net" "" "", Cancel, Gone, QString(), "xmpp:romeo@afterlife.example.net", "example.net"); ROW( redirection - uri - redirect, "" "" "xmpp:rms@afterlife.example.net" "" "", Cancel, Redirect, QString(), "xmpp:rms@afterlife.example.net", QString()); ROW( redirection - uri - empty, "" "" "", Cancel, Redirect, QString(), QString(), QString()); ROW( policy - violation - text, "" "" "The used words are not allowed on this server." "", Modify, PolicyViolation, "The used words are not allowed on this server.", QString(), "example.net"); ROW( jid - malformed - with - by, "" "" "", Modify, JidMalformed, QString(), QString(), "muc.example.com"); BASIC( "" "" "", Modify, BadRequest); BASIC( "" "" "", Cancel, Conflict); BASIC( "" "" "", Cancel, FeatureNotImplemented); BASIC( "" "" "", Auth, Forbidden); BASIC( "" "" "", Cancel, Gone); BASIC( "" "" "", Cancel, InternalServerError); BASIC( "" "" "", Cancel, ItemNotFound); BASIC( "" "" "", Modify, JidMalformed); BASIC( "" "" "", Modify, NotAcceptable); BASIC( "" "" "", Cancel, NotAllowed); BASIC( "" "" "", Auth, NotAuthorized); BASIC( "" "" "", Modify, PolicyViolation); BASIC( "" "" "", Wait, RecipientUnavailable); BASIC( "" "" "", Modify, Redirect); BASIC( "" "" "", Auth, RegistrationRequired); BASIC( "" "" "", Cancel, RemoteServerNotFound); BASIC( "" "" "", Wait, RemoteServerTimeout); BASIC( "" "" "", Wait, ResourceConstraint); BASIC( "" "" "", Cancel, ServiceUnavailable); BASIC( "" "" "", Auth, SubscriptionRequired); BASIC( "" "" "", Modify, UndefinedCondition); #undef BASIC #undef ROW } void tst_QXmppStanza::testErrorCases() { QFETCH(QByteArray, xml); QFETCH(QXmppStanza::Error::Type, type); QFETCH(QXmppStanza::Error::Condition, condition); QFETCH(QString, text); QFETCH(QString, redirectionUri); QFETCH(QString, by); // parsing QXmppStanza::Error error; parsePacket(error, xml); QCOMPARE(error.type(), type); QCOMPARE(error.condition(), condition); QCOMPARE(error.text(), text); QCOMPARE(error.redirectionUri(), redirectionUri); QCOMPARE(error.by(), by); // check parsed error results in the same xml serializePacket(error, xml); // serialization from setters error = QXmppStanza::Error(); error.setType(type); error.setCondition(condition); error.setText(text); error.setRedirectionUri(redirectionUri); error.setBy(by); serializePacket(error, xml); } void tst_QXmppStanza::testErrorFileTooLarge() { const QByteArray xml( "" "" "" "File too large. The maximum file size is 20000 bytes" "" "" "20000" "" ""); QXmppStanza::Error error; parsePacket(error, xml); QCOMPARE(error.type(), QXmppStanza::Error::Modify); QCOMPARE(error.text(), QString("File too large. The maximum file size is " "20000 bytes")); QCOMPARE(error.condition(), QXmppStanza::Error::NotAcceptable); QVERIFY(error.fileTooLarge()); QCOMPARE(error.maxFileSize(), 20000); serializePacket(error, xml); // test setters error.setMaxFileSize(60000); QCOMPARE(error.maxFileSize(), 60000); error.setFileTooLarge(false); QVERIFY(!error.fileTooLarge()); QXmppStanza::Error e2; e2.setMaxFileSize(123000); QVERIFY(e2.fileTooLarge()); } void tst_QXmppStanza::testErrorRetry() { const QByteArray xml( "" "" "" "Quota reached. You can only upload 5 files in 5 minutes" "" "" ""); QXmppStanza::Error error; parsePacket(error, xml); QCOMPARE(error.type(), QXmppStanza::Error::Wait); QCOMPARE(error.text(), QString("Quota reached. You can only upload 5 " "files in 5 minutes")); QCOMPARE(error.condition(), QXmppStanza::Error::ResourceConstraint); QCOMPARE(error.retryDate(), QDateTime(QDate(2017, 12, 03), QTime(23, 42, 05), Qt::UTC)); serializePacket(error, xml); // test setter error.setRetryDate(QDateTime(QDate(1985, 10, 26), QTime(1, 35))); QCOMPARE(error.retryDate(), QDateTime(QDate(1985, 10, 26), QTime(1, 35))); } void tst_QXmppStanza::testErrorEnums() { QXmppStanza::Error err; QCOMPARE(err.condition(), QXmppStanza::Error::NoCondition); QCOMPARE(err.type(), QXmppStanza::Error::NoType); err.setCondition(QXmppStanza::Error::BadRequest); err.setType(QXmppStanza::Error::Cancel); err.setCondition(QXmppStanza::Error::Condition(-1)); err.setType(QXmppStanza::Error::Type(-1)); QCOMPARE(err.condition(), QXmppStanza::Error::NoCondition); QCOMPARE(err.type(), QXmppStanza::Error::NoType); } void tst_QXmppStanza::testEncryption() { QXmppStanzaStub stanza; QVERIFY(!stanza.e2eeMetadata().has_value()); QXmppE2eeMetadata e2eeMetadata; e2eeMetadata.setEncryption(QXmpp::Omemo2); stanza.setE2eeMetadata(e2eeMetadata); QCOMPARE(stanza.e2eeMetadata()->encryption(), QXmpp::Omemo2); } void tst_QXmppStanza::testSenderKey() { QXmppStanzaStub stanza; QVERIFY(!stanza.e2eeMetadata().has_value()); QXmppE2eeMetadata e2eeMetadata; e2eeMetadata.setSenderKey(QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); stanza.setE2eeMetadata(e2eeMetadata); QCOMPARE(stanza.e2eeMetadata()->senderKey(), QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); } void tst_QXmppStanza::testSceTimestamp() { QXmppStanzaStub stanza; QVERIFY(!stanza.e2eeMetadata().has_value()); QXmppE2eeMetadata e2eeMetadata; QVERIFY(e2eeMetadata.senderKey().isNull()); QVERIFY(e2eeMetadata.sceTimestamp().isNull()); e2eeMetadata.setSceTimestamp(QDateTime(QDate(2022, 01, 01), QTime())); stanza.setE2eeMetadata(e2eeMetadata); QCOMPARE(stanza.e2eeMetadata()->sceTimestamp(), QDateTime(QDate(2022, 01, 01), QTime())); } QTEST_MAIN(tst_QXmppStanza) #include "tst_qxmppstanza.moc"