#include #include #include 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 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 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 destPaths; destPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt")); mgr.acceptReceiveSession(sessionId, destPaths); QCOMPARE(spy.count(), 1); QList 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>(); QVERIFY(!tokens.value(QStringLiteral("0")).isEmpty()); } void TestSessionManager::testDeclineReceiveSession() { LocalSend::SessionManager mgr; LocalSend::Device sender; QMap 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 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 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 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 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 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 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 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 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 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("c.txt"); f1.size = 500; files.insert(QStringLiteral("0"), f1); QMap 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("a.txt"); f1.size = 100; files.insert(QStringLiteral("0"), f1); QMap localPaths; localPaths.insert(QStringLiteral("0"), QStringLiteral("/tmp/a.txt")); QString origSessionId = mgr.createSendSession(target, files, localPaths); QString responseSessionId = QStringLiteral("server-session-123"); QMap 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("a.txt"); f1.size = 100; files.insert(QStringLiteral("0"), f1); QMap 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("a.txt"); f1.size = 2000; files.insert(QStringLiteral("0"), f1); QMap 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("a.txt"); f1.size = 1000; files.insert(QStringLiteral("0"), f1); QMap 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 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 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 files; LocalSend::FileDto f1; f1.id = QStringLiteral("0"); f1.fileName = QStringLiteral("a.txt"); f1.size = 100; files.insert(QStringLiteral("0"), f1); QMap 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 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 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 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 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 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 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"