Page MenuHomePhorge

kazv-io-manager-test.cpp
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

kazv-io-manager-test.cpp

/*
* 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/x-c++
Expires
Tue, Jun 24, 7:11 AM (23 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234747
Default Alt Text
kazv-io-manager-test.cpp (5 KB)

Event Timeline