From 721ba9faafb79aac73973410ee1dd3624ded97a5 Mon Sep 17 00:00:00 2001 From: Aleix Pol Date: Wed, 16 Sep 2020 02:27:13 +0200 Subject: [PATCH 06/10] Don't brute-force reading the socket The package will arrive eventually, and dataReceived will be emitted. Otherwise we just end up calling dataReceived to no end. Thanks Matthias Gerstner for reporting this. --- core/backends/lan/socketlinereader.cpp | 8 ------- tests/testsocketlinereader.cpp | 31 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/core/backends/lan/socketlinereader.cpp b/core/backends/lan/socketlinereader.cpp index f67fdf3f..da77052a 100644 --- a/core/backends/lan/socketlinereader.cpp +++ b/core/backends/lan/socketlinereader.cpp @@ -38,14 +38,6 @@ void SocketLineReader::dataReceived() } } - //If we still have things to read from the socket, call dataReceived again - //We do this manually because we do not trust readyRead to be emitted again - //So we call this method again just in case. - if (m_socket->bytesAvailable() > 0) { - QMetaObject::invokeMethod(this, "dataReceived", Qt::QueuedConnection); - return; - } - //If we have any packets, tell it to the world. if (!m_packets.isEmpty()) { Q_EMIT readyRead(); diff --git a/tests/testsocketlinereader.cpp b/tests/testsocketlinereader.cpp index 75584556..b6425b03 100644 --- a/tests/testsocketlinereader.cpp +++ b/tests/testsocketlinereader.cpp @@ -25,16 +25,19 @@ #include #include #include +#include class TestSocketLineReader : public QObject { Q_OBJECT public Q_SLOTS: - void initTestCase(); + void init(); + void cleanup() { delete m_server; } void newPacket(); private Q_SLOTS: void socketLineReader(); + void badData(); private: QTimer m_timer; @@ -45,8 +48,9 @@ private: SocketLineReader* m_reader; }; -void TestSocketLineReader::initTestCase() +void TestSocketLineReader::init() { + m_packets.clear(); m_server = new Server(this); QVERIFY2(m_server->listen(QHostAddress::LocalHost, 8694), "Failed to create local tcp server"); @@ -97,6 +101,29 @@ void TestSocketLineReader::socketLineReader() } } +void TestSocketLineReader::badData() +{ + const QList dataToSend = { "data1\n", "data" }; //does not end in a \n + for (const QByteArray& line : qAsConst(dataToSend)) { + m_conn->write(line); + } + m_conn->flush(); + + QSignalSpy spy(m_server, &QTcpServer::newConnection); + QVERIFY(m_server->hasPendingConnections() || spy.wait(1000)); + QSslSocket* sock = m_server->nextPendingConnection(); + + QVERIFY2(sock != nullptr, "Could not open a connection to the client"); + + m_reader = new SocketLineReader(sock, this); + connect(m_reader, &SocketLineReader::readyRead, this, &TestSocketLineReader::newPacket); + m_timer.start(); + m_loop.exec(); + + QCOMPARE(m_packets.count(), 1); + QCOMPARE(m_packets[0], dataToSend[0]); +} + void TestSocketLineReader::newPacket() { if (!m_reader->bytesAvailable()) { -- 2.28.0