Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2577430
kazv-io-manager-test.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
5 KB
Referenced Files
None
Subscribers
None
kazv-io-manager-test.cpp
View Options
/*
* 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
Details
Attached
Mime Type
text/x-c++
Expires
Tue, Jun 24, 7:11 AM (18 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
234747
Default Alt Text
kazv-io-manager-test.cpp (5 KB)
Attached To
Mode
rK kazv
Attached
Detach File
Event Timeline
Log In to Comment