Page MenuHomePhorge

D210.1750587690.diff
No OneTemporary

Size
3 KB
Referenced Files
None
Subscribers
None

D210.1750587690.diff

diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -77,6 +77,9 @@
set(CMARK_TARGET_NAME cmark)
endif()
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(libhttpserver REQUIRED IMPORTED_TARGET GLOBAL libhttpserver)
+
kde_enable_exceptions()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -foperator-names -DQT_NO_EMIT")
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -35,6 +35,11 @@
LINK_LIBRARIES Qt${QT_MAJOR_VERSION}::Test kazvtestlib
)
+ecm_add_test(
+ kazv-io-job-test.cpp
+ LINK_LIBRARIES Qt${QT_MAJOR_VERSION}::Test kazvtestlib PkgConfig::libhttpserver
+)
+
ecm_add_test(
quick-test.cpp
TEST_NAME quicktest
diff --git a/src/tests/kazv-io-job-test.cpp b/src/tests/kazv-io-job-test.cpp
new file mode 100644
--- /dev/null
+++ b/src/tests/kazv-io-job-test.cpp
@@ -0,0 +1,103 @@
+/*
+ * 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-job.hpp>
+
+#include <QObject>
+#include <QtTest>
+#include <QTcpServer>
+#include <QTemporaryFile>
+#include <QCryptographicHash>
+#include <QSignalSpy>
+
+#include <httpserver.hpp>
+
+#include <memory>
+#include <string>
+#include <chrono>
+
+using namespace httpserver;
+
+class KazvIOJobTest : public QObject
+{
+ Q_OBJECT
+
+private:
+ class FileRes : public http_resource
+ {
+ public:
+ FileRes(const std::string &fileName)
+ : http_resource()
+ , m_fileName(fileName)
+ {}
+
+ const std::shared_ptr<http_response> render(const http_request&) override {
+ return std::shared_ptr<http_response>(
+ new file_response(m_fileName));
+ }
+
+ private:
+ std::string m_fileName;
+ };
+
+ std::unique_ptr<QTcpServer> ts;
+ std::unique_ptr<webserver> ws;
+ std::unique_ptr<FileRes> fr;
+
+ quint16 port;
+ QTemporaryFile file;
+ QCryptographicHash hash{QCryptographicHash::Sha256};
+
+private Q_SLOTS:
+ void initTestCase();
+ void testDownload();
+};
+
+void KazvIOJobTest::initTestCase()
+{
+ // Get a free port
+ ts.reset(new QTcpServer{});
+ ts->listen();
+ port = ts->serverPort();
+
+ ws.reset(new webserver{create_webserver{}.bind_socket(ts->socketDescriptor())});
+ file.open();
+ file.write("some content");
+ file.close();
+ hash.addData(&file);
+ fr.reset(new FileRes{file.fileName().toStdString()});
+ ws->register_resource("/download", fr.get());
+ ws->start(false);
+}
+
+void KazvIOJobTest::testDownload()
+{
+ QTemporaryFile saveFile{};
+ saveFile.open();
+ auto urlStr = QStringLiteral("http://localhost:")
+ .append(QString::number(port))
+ .append(QStringLiteral("/download"));
+ KazvIODownloadJob job{saveFile.fileName(), QUrl{urlStr}, false,
+ QString::fromUtf8(hash.result().toBase64(
+ QByteArray::Base64Encoding
+ | QByteArray::OmitTrailingEquals))};
+ QSignalSpy qs{&job, &KazvIODownloadJob::result};
+ qs.wait(std::chrono::seconds(5));
+
+ auto args = qs.takeFirst();
+ QCOMPARE(qvariant_cast<KazvIOBaseJob::ErrorCode>(args.at(0)),
+ KazvIOBaseJob::NoError);
+
+ file.open();
+ QTRY_COMPARE(file.readAll(), saveFile.readAll());
+ file.close();
+ saveFile.close();
+}
+
+QTEST_MAIN(KazvIOJobTest)
+
+#include "kazv-io-job-test.moc"

File Metadata

Mime Type
text/plain
Expires
Sun, Jun 22, 3:21 AM (11 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234127
Default Alt Text
D210.1750587690.diff (3 KB)

Event Timeline