Page MenuHomePhorge

D215.1749454516.diff
No OneTemporary

Size
6 KB
Referenced Files
None
Subscribers
None

D215.1749454516.diff

diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -40,6 +40,11 @@
LINK_LIBRARIES Qt${QT_MAJOR_VERSION}::Test Qt${QT_MAJOR_VERSION}::HttpServer kazvtestlib
)
+ecm_add_test(
+ kazv-io-manager-test.cpp
+ LINK_LIBRARIES Qt${QT_MAJOR_VERSION}::Test Qt${QT_MAJOR_VERSION}::HttpServer kazvtestlib
+)
+
ecm_add_test(
quick-test.cpp
TEST_NAME quicktest
diff --git a/src/tests/kazv-io-manager-test.cpp b/src/tests/kazv-io-manager-test.cpp
new file mode 100644
--- /dev/null
+++ b/src/tests/kazv-io-manager-test.cpp
@@ -0,0 +1,190 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2025 nannanko <nannanko@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#include <kazv-defs.hpp>
+
+#include "kazv-io-manager.hpp"
+#include "test-model.hpp"
+#include "test-utils.hpp"
+
+#include <QObject>
+#include <QtTest>
+#include <QHttpServer>
+#include <QTcpServer>
+#include <QThread>
+#include <QTemporaryFile>
+#include <QString>
+#include <QHttpServerResponder>
+
+using namespace Qt::Literals::StringLiterals;
+
+static const QString downloadEndpoint =
+ u"/_matrix/client/v1/media/download/serverName/download"_s;
+static const char *downloadFileContent = "download";
+
+class KazvIOManagerTest : public QObject
+{
+ Q_OBJECT
+
+private:
+ QHttpServer httpServer;
+ QTcpServer tcpServer; // Required by QHttpServer
+ QThread serverThread;
+ quint16 port;
+
+ QTemporaryFile downloadFile;
+
+ QString serverUrl;
+
+private Q_SLOTS:
+ void initTestCase();
+ void cleanupTestCase();
+ void testCache();
+ void testDownload();
+ void testUpload();
+ void testRoomlessUpload();
+ void testClearJobs();
+
+Q_SIGNALS:
+ void readyResume();
+ void readyPause();
+};
+
+void KazvIOManagerTest::initTestCase()
+{
+ downloadFile.open();
+ downloadFile.write(downloadFileContent);
+ downloadFile.close();
+
+ // QHttpServer::route() requires QHttpServerResponder must be passed by universal reference before Qt6.8
+ // https://doc.qt.io/qt-6.5/qhttpserver.html#route
+#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0)
+ using QHttpServerResponderRef = QHttpServerResponder &&;
+#else
+ using QHttpServerResponderRef = QHttpServerResponder &;
+#endif
+ httpServer.route(downloadEndpoint, [this](QHttpServerResponderRef res) {
+ QSignalSpy qs{this, &KazvIOManagerTest::readyResume};
+ Q_EMIT readyPause();
+ QVERIFY(qs.wait());
+ downloadFile.open();
+ res.write(downloadFile.readAll(), "application/octet-stream"_ba);
+ downloadFile.close();
+ });
+ QVERIFY(tcpServer.listen());
+ httpServer.bind(&tcpServer);
+
+ port = tcpServer.serverPort();
+ serverUrl = u"http://localhost:"_s + QString::number(port);
+ httpServer.moveToThread(&serverThread);
+ serverThread.start();
+}
+
+void KazvIOManagerTest::cleanupTestCase()
+{
+ serverThread.quit();
+ serverThread.wait();
+}
+
+void KazvIOManagerTest::testCache()
+{
+ KazvIOManager manager;
+ auto url = QUrl{serverUrl + downloadEndpoint};
+ auto id = u"id"_s;
+ QSignalSpy qsPause{this, &KazvIOManagerTest::readyPause};
+ manager.cacheFile(url, id);
+ QVERIFY(qsPause.wait());
+ auto job = manager.getCacheJob(id);
+ QVERIFY(job != nullptr);
+ // Multiple calls do not repeat downloads
+ manager.cacheFile(QUrl{u"url"_s}, id);
+ QCOMPARE(manager.getCacheJob(id), job);
+ QSignalSpy qs{job, &KazvIOBaseJob::result};
+ Q_EMIT readyResume();
+ // Cache job is automatically destroyed
+ QVERIFY(qs.wait());
+ QCOMPARE(manager.getCacheJob(id), nullptr);
+}
+
+void KazvIOManagerTest::testDownload()
+{
+ KazvIOManager manager;
+ auto id = u"id"_s;
+ manager.startNewDownloadJob(
+ QUrl{u"serverUrl"_s}, QUrl{u"localFileUrl"_s}, id, u"hash"_s);
+ QVERIFY(manager.getDownloadJob(id) != nullptr);
+ manager.deleteDownloadJob(id);
+ QCOMPARE(manager.getDownloadJob(id), nullptr);
+}
+
+void KazvIOManagerTest::testUpload()
+{
+ auto model = makeTestModel();
+ Kazv::RoomModel room;
+ room.roomId = "!test:tusooa.xyz";
+ model.client.roomList.rooms =
+ model.client.roomList.rooms.set(room.roomId, room);
+
+ std::unique_ptr<MatrixSdk> sdk{makeTestSdk(model)};
+ auto roomList = toUniquePtr(sdk->roomList());
+
+ KazvIOManager manager;
+ auto job = manager.startNewUploadJob(QUrl{u"serverUrl"_s}, QUrl{u"localFileUrl"_s},
+ u"token"_s, QString::fromStdString(room.roomId), roomList.get(), false,
+ u"relType"_s, u"relatedTo"_s);
+ auto roomId = QString::fromStdString(room.roomId);
+ auto uploadModel = QPointer{manager.getUploadJobs(roomId)};
+ QCOMPARE(uploadModel->rowCount(), 1);
+ manager.deleteUploadJob(roomId, job);
+ QCOMPARE(uploadModel->rowCount(), 0);
+ manager.deleteModelIfEmpty(roomId);
+ QVERIFY(uploadModel.isNull());
+}
+
+void KazvIOManagerTest::testRoomlessUpload()
+{
+ const auto ROOMLESS = u"not-a-room"_s;
+ KazvIOManager manager;
+ auto job = manager.startNewRoomlessUploadJob(QUrl{u"serverUrl"_s},
+ QUrl{u"localFileUrl"_s}, u"token"_s);
+ auto uploadModel = QPointer{manager.getUploadJobs(ROOMLESS)};
+ QCOMPARE(uploadModel->rowCount(), 1);
+ manager.deleteRoomlessUploadJob(job);
+ QCOMPARE(uploadModel->rowCount(), 0);
+ manager.deleteModelIfEmpty(ROOMLESS);
+ QVERIFY(uploadModel.isNull());
+}
+
+void KazvIOManagerTest::testClearJobs()
+{
+ KazvIOManager manager;
+ auto id = u"id"_s;
+ manager.startNewDownloadJob(
+ QUrl{u"serverUrl"_s}, QUrl{u"localFileUrl"_s}, id, u"hash"_s);
+ QVERIFY(manager.getDownloadJob(id) != nullptr);
+
+ auto model = makeTestModel();
+ Kazv::RoomModel room;
+ room.roomId = "!test:tusooa.xyz";
+ model.client.roomList.rooms =
+ model.client.roomList.rooms.set(room.roomId, room);
+
+ std::unique_ptr<MatrixSdk> sdk{makeTestSdk(model)};
+ auto roomList = toUniquePtr(sdk->roomList());
+ manager.startNewUploadJob(QUrl{u"serverUrl"_s}, QUrl{u"localFileUrl"_s},
+ u"token"_s, QString::fromStdString(room.roomId), roomList.get(), false,
+ u"relType"_s, u"relatedTo"_s);
+ auto roomId = QString::fromStdString(room.roomId);
+ QCOMPARE(manager.getUploadJobs(roomId)->rowCount(), 1);
+
+ manager.clearJobs();
+ QCOMPARE(manager.getDownloadJob(id), nullptr);
+ QCOMPARE(manager.getUploadJobs(roomId)->rowCount(), 0);
+}
+
+QTEST_MAIN(KazvIOManagerTest)
+
+#include "kazv-io-manager-test.moc"

File Metadata

Mime Type
text/plain
Expires
Mon, Jun 9, 12:35 AM (15 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
213101
Default Alt Text
D215.1749454516.diff (6 KB)

Event Timeline