Files
localsend-qt/tests/core/TestSessionManager.cpp

553 lines
18 KiB
C++
Raw Normal View History

2026-04-28 15:30:48 +08:00
#include <QtTest>
#include <LocalSendCore/SessionManager.h>
#include <LocalSendCore/Device.h>
class TestSessionManager : public QObject
{
Q_OBJECT
private slots:
void testCreateReceiveSession();
void testAcceptReceiveSession();
void testDeclineReceiveSession();
void testCancelReceiveSession();
void testReceiveProgress();
void testCompleteReceiveFile();
void testCompleteAllReceiveFiles();
void testFailReceiveFile();
void testCreateSendSession();
void testSetSendSessionTokens();
void testStartSendSession();
void testSendProgress();
void testCompleteSendFile();
void testCompleteAllSendFiles();
void testCancelSendSession();
void testHasSessionQueries();
void testGenerateToken();
void testDeclineRemovesSession();
void testSetSendSessionTokensRekeys();
};
void TestSessionManager::testCreateReceiveSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
sender.ip = QStringLiteral("10.0.0.1");
sender.alias = QStringLiteral("Sender");
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
LocalSend::FileDto f2;
f2.id = QStringLiteral("1");
f2.fileName = QStringLiteral("b.txt");
f2.size = 200;
files.insert(QStringLiteral("1"), f2);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionCreated);
QString sessionId = mgr.createReceiveSession(sender, files);
QVERIFY(!sessionId.isEmpty());
QCOMPARE(spy.count(), 1);
LocalSend::ReceiveSession session = mgr.receiveSession(sessionId);
QCOMPARE(session.sessionId, sessionId);
QCOMPARE(session.sender.alias, QStringLiteral("Sender"));
QCOMPARE(session.files.size(), 2);
QCOMPARE(session.status, LocalSend::SessionStatus::Waiting);
QVERIFY(!session.files[QStringLiteral("0")].token.isEmpty());
QVERIFY(!session.files[QStringLiteral("1")].token.isEmpty());
}
void TestSessionManager::testAcceptReceiveSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionAccepted);
QMap<QString, QString> destPaths;
destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
mgr.acceptReceiveSession(sessionId, destPaths);
QCOMPARE(spy.count(), 1);
QList<QVariant> args = spy.takeFirst();
QCOMPARE(args.at(0).toString(), sessionId);
LocalSend::ReceiveSession session = mgr.receiveSession(sessionId);
QCOMPARE(session.status, LocalSend::SessionStatus::Sending);
QCOMPARE(session.files[QStringLiteral("0")].destinationPath, QStringLiteral("/tmp/a.txt"));
auto tokens = args.at(1).value<QMap<QString, QString>>();
QVERIFY(!tokens.value(QStringLiteral("0")).isEmpty());
}
void TestSessionManager::testDeclineReceiveSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionDeclined);
mgr.declineReceiveSession(sessionId);
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasReceiveSession(sessionId));
}
void TestSessionManager::testCancelReceiveSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QMap<QString, QString> destPaths;
destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
mgr.acceptReceiveSession(sessionId, destPaths);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionCanceled);
mgr.cancelReceiveSession(sessionId);
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasReceiveSession(sessionId));
}
void TestSessionManager::testReceiveProgress()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 1000;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QMap<QString, QString> destPaths;
destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
mgr.acceptReceiveSession(sessionId, destPaths);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveProgress);
mgr.updateReceiveProgress(sessionId, QStringLiteral("0"), 500);
QCOMPARE(spy.count(), 1);
double progress = spy.takeFirst().at(2).toDouble();
QVERIFY(qFuzzyCompare(progress, 0.5));
}
void TestSessionManager::testCompleteReceiveFile()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 1000;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QMap<QString, QString> destPaths;
destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
mgr.acceptReceiveSession(sessionId, destPaths);
mgr.updateReceiveProgress(sessionId, QStringLiteral("0"), 1000);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionCompleted);
mgr.completeReceiveFile(sessionId, QStringLiteral("0"));
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasReceiveSession(sessionId));
}
void TestSessionManager::testCompleteAllReceiveFiles()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
LocalSend::FileDto f2;
f2.id = QStringLiteral("1");
f2.fileName = QStringLiteral("b.txt");
f2.size = 200;
files.insert(QStringLiteral("1"), f2);
QString sessionId = mgr.createReceiveSession(sender, files);
QMap<QString, QString> destPaths;
destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
destPaths.insert(QStringLiteral("1"), QStringLiteral("/tmp/b.txt"));
mgr.acceptReceiveSession(sessionId, destPaths);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::receiveSessionCompleted);
mgr.completeReceiveFile(sessionId, QStringLiteral("0"));
QCOMPARE(spy.count(), 0);
QVERIFY(mgr.hasReceiveSession(sessionId));
mgr.completeReceiveFile(sessionId, QStringLiteral("1"));
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasReceiveSession(sessionId));
}
void TestSessionManager::testFailReceiveFile()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 1000;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
mgr.failReceiveFile(sessionId, QStringLiteral("0"));
LocalSend::ReceiveSession session = mgr.receiveSession(sessionId);
QCOMPARE(session.files[QStringLiteral("0")].status, LocalSend::FileStatus::Failed);
}
void TestSessionManager::testCreateSendSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
target.ip = QStringLiteral("10.0.0.2");
target.alias = QStringLiteral("Receiver");
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("c.txt");
f1.size = 500;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/home/user/c.txt"));
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendSessionCreated);
QString sessionId = mgr.createSendSession(target, files, localPaths);
QVERIFY(!sessionId.isEmpty());
QCOMPARE(spy.count(), 1);
LocalSend::SendSession session = mgr.sendSession(sessionId);
QCOMPARE(session.sessionId, sessionId);
QCOMPARE(session.target.alias, QStringLiteral("Receiver"));
QCOMPARE(session.files.size(), 1);
QCOMPARE(session.files[QStringLiteral("0")].localPath, QStringLiteral("/home/user/c.txt"));
QCOMPARE(session.status, LocalSend::SessionStatus::Waiting);
}
void TestSessionManager::testSetSendSessionTokens()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString origSessionId = mgr.createSendSession(target, files, localPaths);
QString responseSessionId = QStringLiteral("server-session-123");
QMap<QString, QString> tokens;
tokens.insert(QStringLiteral("0"), QStringLiteral("token-abc"));
mgr.setSendSessionTokens(origSessionId, responseSessionId, tokens);
QVERIFY(!mgr.hasSendSession(origSessionId));
QVERIFY(mgr.hasSendSession(responseSessionId));
LocalSend::SendSession session = mgr.sendSession(responseSessionId);
QCOMPARE(session.sessionId, responseSessionId);
QCOMPARE(session.files[QStringLiteral("0")].token, QStringLiteral("token-abc"));
}
void TestSessionManager::testStartSendSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString sessionId = mgr.createSendSession(target, files, localPaths);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendSessionStarted);
mgr.startSendSession(sessionId);
QCOMPARE(spy.count(), 1);
LocalSend::SendSession session = mgr.sendSession(sessionId);
QCOMPARE(session.status, LocalSend::SessionStatus::Sending);
}
void TestSessionManager::testSendProgress()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 2000;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString sessionId = mgr.createSendSession(target, files, localPaths);
mgr.startSendSession(sessionId);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendProgress);
mgr.updateSendProgress(sessionId, QStringLiteral("0"), 1000);
QCOMPARE(spy.count(), 1);
double progress = spy.takeFirst().at(2).toDouble();
QVERIFY(qFuzzyCompare(progress, 0.5));
}
void TestSessionManager::testCompleteSendFile()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 1000;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString sessionId = mgr.createSendSession(target, files, localPaths);
mgr.startSendSession(sessionId);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendSessionCompleted);
mgr.completeSendFile(sessionId, QStringLiteral("0"));
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasSendSession(sessionId));
}
void TestSessionManager::testCompleteAllSendFiles()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
LocalSend::FileDto f2;
f2.id = QStringLiteral("1");
f2.fileName = QStringLiteral("b.txt");
f2.size = 200;
files.insert(QStringLiteral("1"), f2);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
localPaths.insert(QStringLiteral("1"), QStringLiteral("/tmp/b.txt"));
QString sessionId = mgr.createSendSession(target, files, localPaths);
mgr.startSendSession(sessionId);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendSessionCompleted);
mgr.completeSendFile(sessionId, QStringLiteral("0"));
QCOMPARE(spy.count(), 0);
mgr.completeSendFile(sessionId, QStringLiteral("1"));
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasSendSession(sessionId));
}
void TestSessionManager::testCancelSendSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString sessionId = mgr.createSendSession(target, files, localPaths);
mgr.startSendSession(sessionId);
QSignalSpy spy(&mgr, &LocalSend::SessionManager::sendSessionCanceled);
mgr.cancelSendSession(sessionId);
QCOMPARE(spy.count(), 1);
QVERIFY(!mgr.hasSendSession(sessionId));
}
void TestSessionManager::testHasSessionQueries()
{
LocalSend::SessionManager mgr;
QVERIFY(!mgr.hasReceiveSession(QStringLiteral("nonexistent")));
QVERIFY(!mgr.hasSendSession(QStringLiteral("nonexistent")));
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QString recvSessionId = mgr.createReceiveSession(sender, files);
QVERIFY(mgr.hasReceiveSession(recvSessionId));
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
QString sendSessionId = mgr.createSendSession(sender, files, localPaths);
QVERIFY(mgr.hasSendSession(sendSessionId));
LocalSend::ReceiveSession emptyRecv = mgr.receiveSession(QStringLiteral("nope"));
QVERIFY(emptyRecv.sessionId.isEmpty());
LocalSend::SendSession emptySend = mgr.sendSession(QStringLiteral("nope"));
QVERIFY(emptySend.sessionId.isEmpty());
}
void TestSessionManager::testGenerateToken()
{
LocalSend::SessionManager mgr;
QString token1 = mgr.generateToken();
QString token2 = mgr.generateToken();
QVERIFY(!token1.isEmpty());
QVERIFY(!token2.isEmpty());
QVERIFY(token1 != token2);
}
void TestSessionManager::testDeclineRemovesSession()
{
LocalSend::SessionManager mgr;
LocalSend::Device sender;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
QString sessionId = mgr.createReceiveSession(sender, files);
QVERIFY(mgr.hasReceiveSession(sessionId));
mgr.declineReceiveSession(sessionId);
QVERIFY(!mgr.hasReceiveSession(sessionId));
}
void TestSessionManager::testSetSendSessionTokensRekeys()
{
LocalSend::SessionManager mgr;
LocalSend::Device target;
QMap<QString, LocalSend::FileDto> files;
LocalSend::FileDto f1;
f1.id = QStringLiteral("0");
f1.fileName = QStringLiteral("a.txt");
f1.size = 100;
files.insert(QStringLiteral("0"), f1);
LocalSend::FileDto f2;
f2.id = QStringLiteral("1");
f2.fileName = QStringLiteral("b.txt");
f2.size = 200;
files.insert(QStringLiteral("1"), f2);
QMap<QString, QString> localPaths;
localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt"));
localPaths.insert(QStringLiteral("1"), QStringLiteral("/tmp/b.txt"));
QString origId = mgr.createSendSession(target, files, localPaths);
QString newId = QStringLiteral("response-session-id");
QMap<QString, QString> tokens;
tokens.insert(QStringLiteral("0"), QStringLiteral("tok0"));
tokens.insert(QStringLiteral("1"), QStringLiteral("tok1"));
mgr.setSendSessionTokens(origId, newId, tokens);
QVERIFY(!mgr.hasSendSession(origId));
QVERIFY(mgr.hasSendSession(newId));
LocalSend::SendSession session = mgr.sendSession(newId);
QCOMPARE(session.sessionId, newId);
QCOMPARE(session.files[QStringLiteral("0")].token, QStringLiteral("tok0"));
QCOMPARE(session.files[QStringLiteral("1")].token, QStringLiteral("tok1"));
QCOMPARE(session.files[QStringLiteral("0")].localPath, QStringLiteral("/tmp/a.txt"));
QCOMPARE(session.files[QStringLiteral("1")].localPath, QStringLiteral("/tmp/b.txt"));
}
QTEST_MAIN(TestSessionManager)
#include "TestSessionManager.moc"