From 816e80c911da450e76e94223f24fe40be9343bdd Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 8 Sep 2022 14:15:28 +0200 Subject: Rename UploadRequestManager test to HttpUploadManager test One of the following commits will add tests also for the HttpUploadManager. --- .../tst_qxmpphttpuploadmanager.cpp | 331 +++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 tests/qxmpphttpuploadmanager/tst_qxmpphttpuploadmanager.cpp (limited to 'tests/qxmpphttpuploadmanager/tst_qxmpphttpuploadmanager.cpp') diff --git a/tests/qxmpphttpuploadmanager/tst_qxmpphttpuploadmanager.cpp b/tests/qxmpphttpuploadmanager/tst_qxmpphttpuploadmanager.cpp new file mode 100644 index 00000000..7f82ac38 --- /dev/null +++ b/tests/qxmpphttpuploadmanager/tst_qxmpphttpuploadmanager.cpp @@ -0,0 +1,331 @@ +// SPDX-FileCopyrightText: 2019 Yury Gubich +// SPDX-FileCopyrightText: 2020 Linus Jahn +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppClient.h" +#include "QXmppDiscoveryManager.h" +#include "QXmppHttpUploadIq.h" +#include "QXmppLogger.h" +#include "QXmppUploadRequestManager.h" + +#include "util.h" +#include +#include +#include + +class TestHelper : public QObject +{ + Q_OBJECT + +public: + TestHelper(bool expectedEvent, bool expectedError); + ~TestHelper(); + +public slots: + void onSlotReceived(const QXmppHttpUploadSlotIq &slot); + void onRequestFailed(const QXmppHttpUploadRequestIq &request); + +private: + bool expectedEvent; + bool expectedError; + bool event; + bool error; +}; + +TestHelper::TestHelper(bool p_expectedEvent, bool p_expectedError) : QObject(), + expectedEvent(p_expectedEvent), + expectedError(p_expectedError), + event(false), + error(false) +{ +} + +TestHelper::~TestHelper() +{ + QCOMPARE(event, expectedEvent); + QCOMPARE(error, expectedError); +} + +void TestHelper::onRequestFailed(const QXmppHttpUploadRequestIq &) +{ + event = true; + error = true; +} + +void TestHelper::onSlotReceived(const QXmppHttpUploadSlotIq &) +{ + event = true; + error = false; +} + +class tst_QXmppHttpUploadManager : public QObject +{ + Q_OBJECT + +protected slots: + void onLoggerMessage(QXmppLogger::MessageType type, const QString &text) const; + +private slots: + void initTestCase(); + + void testDiscoveryService_data(); + void testDiscoveryService(); + + void testHandleStanza_data(); + void testHandleStanza(); + + void testSending_data(); + void testSending(); + + void testUploadService(); + +private: + QXmppUploadRequestManager *manager; + QXmppClient client; + QXmppDiscoveryManager *discovery; + QString uploadServiceName; + qint64 maxFileSize; + + QMimeType lastMimeType; + QString lastFileName; + qint64 lastFileSize; +}; + +void tst_QXmppHttpUploadManager::onLoggerMessage(QXmppLogger::MessageType type, const QString &text) const +{ + QCOMPARE(type, QXmppLogger::SentMessage); + + QDomDocument doc; + QVERIFY(doc.setContent(text, true)); + QDomElement element = doc.documentElement(); + + QXmppHttpUploadRequestIq iq; + iq.parse(element); + + QCOMPARE(iq.type(), QXmppIq::Get); + QCOMPARE(iq.to(), uploadServiceName); + QCOMPARE(iq.fileName(), lastFileName); + QCOMPARE(iq.size(), lastFileSize); + QCOMPARE(iq.contentType(), lastMimeType); +} + +void tst_QXmppHttpUploadManager::initTestCase() +{ + uploadServiceName = "upload.montague.tld"; + maxFileSize = 500UL * 1024UL * 1024UL; + manager = new QXmppUploadRequestManager(); + discovery = client.findExtension(); + client.addExtension(manager); +} + +void tst_QXmppHttpUploadManager::testHandleStanza_data() +{ + QTest::addColumn("xml"); + QTest::addColumn("accepted"); + QTest::addColumn("event"); + QTest::addColumn("error"); + + QTest::newRow("notAccepted") + << QByteArray("" + "" + "" + "" + "What man art thou that, thus bescreen'd in night, so stumblest on my counsel?" + "0e3141cd80894871a68e6fe6b1ec56fa" + "" + "" + "" + "") + << false << false << false; + + QTest::newRow("slotReceived") + << QByteArray("" + "" + "" + "
Basic Base64String==
" + "
foo=bar; user=romeo
" + "
" + "" + "
" + "
") + << true << true << false; + + QTest::newRow("tooLargeError") + << QByteArray("" + "" + "" + "" + "File too large. The maximum file size is 20000 bytes" + "" + "20000" + "" + "" + "") + << true << true << true; + + QTest::newRow("quotaReachedError") + << QByteArray("" + "" + "" + "" + "Quota reached. You can only upload 5 files in 5 minutes" + "" + "" + "") + << true << true << true; +} + +void tst_QXmppHttpUploadManager::testHandleStanza() +{ + QFETCH(QByteArray, xml); + QFETCH(bool, accepted); + QFETCH(bool, event); + QFETCH(bool, error); + + TestHelper helper(event, error); + connect(manager, &QXmppUploadRequestManager::slotReceived, &helper, &TestHelper::onSlotReceived); + connect(manager, &QXmppUploadRequestManager::requestFailed, &helper, &TestHelper::onRequestFailed); + + QDomDocument doc; + QVERIFY(doc.setContent(xml, true)); + QDomElement element = doc.documentElement(); + + bool realAccepted = manager->handleStanza(element); + + QCOMPARE(realAccepted, accepted); +} + +void tst_QXmppHttpUploadManager::testDiscoveryService_data() +{ + QTest::addColumn("xml"); + QTest::addColumn("discovered"); + + QTest::newRow("mixDiscoveryStanzaIq") + << QByteArray("" + "" + "" + "" + "" + "" + "") + << false; + + QTest::newRow("HTTPUploadDiscoveryStanzaIq") + << QByteArray("" + "" + "" + "" + "" + "" + "urn:xmpp:http:upload:0" + "" + "" + "" + + QByteArray::number(maxFileSize) + "" + "" + "" + "" + "") + << true; +} + +void tst_QXmppHttpUploadManager::testDiscoveryService() +{ + QFETCH(QByteArray, xml); + QFETCH(bool, discovered); + + QDomDocument doc; + QVERIFY(doc.setContent(xml, true)); + QDomElement element = doc.documentElement(); + + bool accepted = discovery->handleStanza(element); + QCOMPARE(accepted, true); + QCOMPARE(manager->serviceFound(), discovered); + + if (manager->serviceFound()) { + QCOMPARE(manager->uploadServices().at(0).jid(), uploadServiceName); + QCOMPARE(manager->uploadServices().at(0).sizeLimit(), maxFileSize); + } +} + +void tst_QXmppHttpUploadManager::testSending_data() +{ + QTest::addColumn("fileInfo"); + QTest::addColumn("fileName"); + QTest::addColumn("fileSize"); + QTest::addColumn("fileType"); + + QTest::newRow("fileInfo") + << QFileInfo(":/test.svg") + << "test.svg" + << 2280LL + << "image/svg+xml"; + + QTest::newRow("fileWithSizeBelowLimit") + << QFileInfo() + << "whatever.jpeg" + << 698547LL + << "image/jpeg"; + + QTest::newRow("fileWithSizeAboveLimit") + << QFileInfo() + << "some.pdf" + << 65896498547LL + << "application/pdf"; + + // there is no size above limit handling in request manager + // there is also no code that selects an upload service with proper + // size limit above requesting file size. + // Is it something to worry about? +} + +void tst_QXmppHttpUploadManager::testSending() +{ + QFETCH(QFileInfo, fileInfo); + QFETCH(QString, fileName); + QFETCH(qint64, fileSize); + QFETCH(QString, fileType); + + QXmppLogger logger; + logger.setLoggingType(QXmppLogger::SignalLogging); + client.setLogger(&logger); + + lastMimeType = QMimeDatabase().mimeTypeForName(fileType); + connect(&logger, &QXmppLogger::message, this, &tst_QXmppHttpUploadManager::onLoggerMessage); + + lastFileName = fileName; + lastFileSize = fileSize; + + QString returnId; + if (!fileInfo.baseName().isEmpty()) { + returnId = manager->requestUploadSlot(fileInfo); + } else { + returnId = manager->requestUploadSlot(fileName, fileSize, lastMimeType); + } + + // The client is not connected, so we never get an ID back (the packet was not sent). + QVERIFY(returnId.isNull()); +} + +void tst_QXmppHttpUploadManager::testUploadService() +{ + QXmppUploadService service; + QCOMPARE(service.sizeLimit(), -1LL); + QVERIFY(service.jid().isNull()); + + service.setSizeLimit(256LL * 1024LL * 1024LL); + QCOMPARE(service.sizeLimit(), 256LL * 1024LL * 1024LL); + + service.setJid(QStringLiteral("upload.shakespeare.lit")); + QCOMPARE(service.jid(), QStringLiteral("upload.shakespeare.lit")); +} + +QTEST_MAIN(tst_QXmppHttpUploadManager) +#include "tst_qxmpphttpuploadmanager.moc" -- cgit v1.2.3