Skip to content
This repository was archived by the owner on Mar 4, 2023. It is now read-only.

Commit 2f9e01b

Browse files
committed
improved reliability of accept ack
and increased wait timeouts, configurable
1 parent e19d0c0 commit 2f9e01b

File tree

10 files changed

+53
-22
lines changed

10 files changed

+53
-22
lines changed

src/datasync/messages/proofmessage.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ const QMetaObject *AcceptMessage::getMetaObject() const
5959

6060

6161

62-
AcceptAckMessage::AcceptAckMessage(const AcceptMessage &message) :
63-
deviceId(message.deviceId)
62+
AcceptAckMessage::AcceptAckMessage(const QUuid &deviceId) :
63+
deviceId(deviceId)
6464
{}
6565

6666
const QMetaObject *AcceptAckMessage::getMetaObject() const

src/datasync/messages/proofmessage_p.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Q_DATASYNC_EXPORT AcceptAckMessage : public Message
8383
Q_PROPERTY(QUuid deviceId MEMBER deviceId)
8484

8585
public:
86-
AcceptAckMessage(const AcceptMessage &message = {});
86+
AcceptAckMessage(const QUuid &deviceId = {});
8787

8888
QUuid deviceId;
8989

tests/auto/datasync/TestAppServer/tst_appserver.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -958,12 +958,8 @@ void TestAppServer::testSendDoubleAccept()
958958

959959
//send another proof accept
960960
client->sendSigned(accMsg, crypto);
961-
//is still sent, event though no accept happend...
962-
QVERIFY(client->waitForReply<AcceptAckMessage>([&](AcceptAckMessage message, bool &ok) {
963-
QCOMPARE(message.deviceId, partnerDevId);
964-
ok = true;
965-
}));
966-
QVERIFY(partner->waitForNothing());
961+
QVERIFY(client->waitForNothing()); //no accept ack
962+
QVERIFY(partner->waitForNothing()); //no grant
967963

968964
//clean partner
969965
clean(partner);

tests/auto/datasync/TestLib/mockclient.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
#include "mockclient.h"
22

3+
#ifdef Q_OS_WIN
4+
#define WAIT_TIMEOUT 15000
5+
#else
6+
#define WAIT_TIMEOUT 10000
7+
#endif
8+
39
MockClient::MockClient(QObject *parent) :
410
MockConnection(new QWebSocket(), parent),
511
_connectSpy(_socket, &QWebSocket::connected)
@@ -16,7 +22,7 @@ bool MockClient::waitForConnected(quint16 port)
1622
auto ok = false;
1723
[&]() {
1824
if(_connectSpy.isEmpty())
19-
QVERIFY(_connectSpy.wait());
25+
QVERIFY(_connectSpy.wait(WAIT_TIMEOUT));
2026
QVERIFY(!_connectSpy.isEmpty());
2127
ok = true;
2228
}();

tests/auto/datasync/TestLib/mockconnection.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
#include "mockconnection.h"
22

3-
3+
#ifdef Q_OS_WIN
4+
#define WAIT_TIMEOUT 15000
5+
#else
6+
#define WAIT_TIMEOUT 10000
7+
#endif
48

59
MockConnection::MockConnection(QWebSocket *socket, QObject *parent) :
610
QObject(parent),
@@ -50,7 +54,7 @@ void MockConnection::close()
5054
bool MockConnection::waitForNothing()
5155
{
5256
return _msgSpy.isEmpty() &&
53-
!_msgSpy.wait() &&
57+
!_msgSpy.wait(WAIT_TIMEOUT) &&
5458
_closeSpy.isEmpty();
5559
}
5660

@@ -64,7 +68,7 @@ bool MockConnection::waitForPing()
6468
auto ok = false;
6569
[&]() {
6670
if(_msgSpy.isEmpty())
67-
QVERIFY(_msgSpy.wait(65000)); // 1 min 5 secs
71+
QVERIFY(_msgSpy.wait(60000 + WAIT_TIMEOUT)); // 1 min + WAIT_TIMEOUT
6872
QVERIFY(!_msgSpy.isEmpty());
6973
auto msg = _msgSpy.takeFirst()[0].toByteArray();
7074
ok = (msg == QtDataSync::Message::PingMessage);
@@ -86,7 +90,7 @@ bool MockConnection::waitForDisconnect()
8690
auto ok = false;
8791
[&]() {
8892
if(_closeSpy.isEmpty())
89-
QVERIFY(_closeSpy.wait());
93+
QVERIFY(_closeSpy.wait(WAIT_TIMEOUT));
9094
QVERIFY(!_closeSpy.isEmpty());
9195
ok = true;
9296
}();
@@ -100,7 +104,7 @@ bool MockConnection::waitForReplyImpl(const std::function<void(QByteArray, bool&
100104
QByteArray msg;
101105
do {
102106
if(_msgSpy.isEmpty())
103-
QVERIFY(_msgSpy.wait());
107+
QVERIFY(_msgSpy.wait(WAIT_TIMEOUT));
104108
QVERIFY(!_msgSpy.isEmpty());
105109
msg = _msgSpy.takeFirst()[0].toByteArray();
106110
if(msg == QtDataSync::Message::PingMessage)

tests/auto/datasync/TestLib/mockserver.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
#include "mockserver.h"
22

3+
#ifdef Q_OS_WIN
4+
#define WAIT_TIMEOUT 10000
5+
#else
6+
#define WAIT_TIMEOUT 5000
7+
#endif
8+
39
MockServer::MockServer(QObject *parent) :
410
QObject(parent),
511
_server(new QWebSocketServer(QStringLiteral("mockserver"), QWebSocketServer::NonSecureMode, this)),
@@ -44,7 +50,7 @@ bool MockServer::waitForConnected(MockConnection **connection, int timeout)
4450
[&]() {
4551
QVERIFY(connection);
4652
if(_connectedSpy.isEmpty())
47-
QVERIFY(_connectedSpy.wait(timeout));
53+
QVERIFY(_connectedSpy.wait(WAIT_TIMEOUT + timeout));
4854
QVERIFY(!_connectedSpy.isEmpty());
4955
QVERIFY(_server->hasPendingConnections());
5056
_connectedSpy.removeFirst();

tests/auto/datasync/TestRemoteConnector/tst_remoteconnector.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ void TestRemoteConnector::testAddDeviceUntrusted()
680680

681681
//Send from here because message needed
682682
partnerConnection->send(GrantMessage(message));
683-
connection->send(AcceptAckMessage(message));
683+
connection->send(AcceptAckMessage(message.deviceId));
684684
}));
685685

686686
//verify preperations are done
@@ -784,7 +784,7 @@ void TestRemoteConnector::testAddDeviceTrusted()
784784

785785
//Send from here because message needed
786786
partnerCon->send(GrantMessage(message));
787-
connection->send(AcceptAckMessage(message));
787+
connection->send(AcceptAckMessage(message.deviceId));
788788
}));
789789

790790
//verify preperations are done
@@ -1562,7 +1562,7 @@ void TestRemoteConnector::testUnexpectedMessage_data()
15621562
<< false;
15631563
QTest::newRow("ProofMessage") << create<ProofMessage>(AccessMessage(), partnerDevId)
15641564
<< false;
1565-
QTest::newRow("AcceptAckMessage") << create<AcceptAckMessage>(AcceptMessage(partnerDevId))
1565+
QTest::newRow("AcceptAckMessage") << create<AcceptAckMessage>(partnerDevId)
15661566
<< false;
15671567
QTest::newRow("MacUpdateAckMessage") << create<MacUpdateAckMessage>()
15681568
<< false;

tools/appserver/client.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,16 @@ void Client::sendProof(const ProofMessage &message)
186186
});
187187
}
188188

189+
void Client::acceptDone(const QUuid &deviceId)
190+
{
191+
run([this, deviceId]() {
192+
if(_state != Idle)
193+
qWarning() << "Cannot send accept ack when not in idle state";
194+
else
195+
sendMessage(AcceptAckMessage(deviceId));
196+
});
197+
}
198+
189199
void Client::binaryMessageReceived(const QByteArray &message)
190200
{
191201
if(message == Message::PingMessage) {
@@ -552,7 +562,6 @@ void Client::onAccept(const AcceptMessage &message, QDataStream &stream)
552562
}
553563

554564
emit proofDone(message.deviceId, true, message);
555-
sendMessage(AcceptAckMessage(message));
556565
}
557566

558567
void Client::onDeny(const DenyMessage &message)

tools/appserver/client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public Q_SLOTS:
5555
void notifyChanged();
5656
void proofResult(bool success, const QtDataSync::AcceptMessage &message = {}); //empty key equals denied
5757
void sendProof(const QtDataSync::ProofMessage &message);
58+
void acceptDone(const QUuid &deviceId);
5859

5960
Q_SIGNALS:
6061
void connected(const QUuid &deviceId);

tools/appserver/clientconnector.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,18 @@ void ClientConnector::proofRequested(const QUuid &partner, const QtDataSync::Pro
194194
connect(pClient, &Client::proofDone,
195195
client, [devId, pClient, client](const QUuid &partner, bool success, const QtDataSync::AcceptMessage &message) {
196196
if(devId == partner) {
197-
client->proofResult(success, message);
198-
if(pClient)
197+
if(pClient) {
198+
// remove this connections
199199
pClient->disconnect(client);
200+
// once client was added, notify pClient so he can ack the accept
201+
connect(client, &Client::connected,
202+
pClient, [pClient](const QUuid &accPartner) {
203+
pClient->acceptDone(accPartner);
204+
//no disconnect needed, single time emit
205+
}, Qt::QueuedConnection);
206+
}
207+
// pass message on to client
208+
client->proofResult(success, message);
200209
}
201210
}, Qt::QueuedConnection);
202211
pClient->sendProof(message);

0 commit comments

Comments
 (0)