Eliminate extra event loops from QQmlDebugTest

Extra event loops are famously brittle, and we don't need them here. We
can just us QTest::qWaitFor().

Task-number: QTBUG-101678
Change-Id: I73837bc323c83431f487db3cac6872736635d557
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Ulf Hermann 2022-03-15 12:02:16 +01:00
parent 7dba80af87
commit 8398f6990b
2 changed files with 20 additions and 24 deletions

View File

@ -31,25 +31,25 @@
#include <private/qqmldebugconnection_p.h> #include <private/qqmldebugconnection_p.h>
#include <QtCore/qeventloop.h>
#include <QtCore/qtimer.h> #include <QtCore/qtimer.h>
#include <QtTest/qtest.h>
#include <QtTest/qsignalspy.h>
QQmlDebugTest::QQmlDebugTest(const char *qmlTestDataDir) QQmlDebugTest::QQmlDebugTest(const char *qmlTestDataDir)
: QQmlDataTest(qmlTestDataDir) : QQmlDataTest(qmlTestDataDir)
{ {
} }
bool QQmlDebugTest::waitForSignal(QObject *receiver, const char *member, int timeout) { bool QQmlDebugTest::waitForSignal(QObject *sender, const char *member, int timeout)
QEventLoop loop; {
QTimer timer; QSignalSpy spy(sender, member);
timer.setSingleShot(true);
QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); // Do not use spy.wait(). We want to avoid nested event loops.
QObject::connect(receiver, member, &loop, SLOT(quit())); if (QTest::qWaitFor([&]() { return spy.count() > 0; }, timeout))
timer.start(timeout); return true;
loop.exec();
if (!timer.isActive()) qWarning("waitForSignal %s timed out after %d ms", member, timeout);
qWarning("waitForSignal %s timed out after %d ms", member, timeout); return false;
return timer.isActive();
} }
QList<QQmlDebugClient *> QQmlDebugTest::createOtherClients(QQmlDebugConnection *connection) QList<QQmlDebugClient *> QQmlDebugTest::createOtherClients(QQmlDebugConnection *connection)
@ -154,18 +154,11 @@ QQmlDebugTest::ConnectResult QQmlDebugTest::connectTo(
ClientStateHandler stateHandler(m_clients, createOtherClients(m_connection), services.isEmpty() ClientStateHandler stateHandler(m_clients, createOtherClients(m_connection), services.isEmpty()
? QQmlDebugClient::Enabled : QQmlDebugClient::Unavailable); ? QQmlDebugClient::Enabled : QQmlDebugClient::Unavailable);
QSignalSpy okSpy(&stateHandler, &ClientStateHandler::allOk);
const int port = m_process->debugPort(); QSignalSpy disconnectSpy(m_connection, &QQmlDebugConnection::disconnected);
m_connection->connectToHost(QLatin1String("127.0.0.1"), port); m_connection->connectToHost(QLatin1String("127.0.0.1"), m_process->debugPort());
if (!QTest::qWaitFor([&](){ return okSpy.count() > 0 || disconnectSpy.count() > 0; }, 5000))
QEventLoop loop; return ConnectionTimeout;
QTimer timer;
QObject::connect(&stateHandler, &ClientStateHandler::allOk, &loop, &QEventLoop::quit);
QObject::connect(m_connection, &QQmlDebugConnection::disconnected, &loop, &QEventLoop::quit);
QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
timer.start(5000);
loop.exec();
if (!stateHandler.allEnabled()) if (!stateHandler.allEnabled())
return EnableFailed; return EnableFailed;
@ -266,3 +259,5 @@ QString debugJsServerPath(const QString &selfPath)
return (position == -1 ? appPath : appPath.replace(position, selfPath.length(), debugserver)) return (position == -1 ? appPath : appPath.replace(position, selfPath.length(), debugserver))
+ "/" + debugserver; + "/" + debugserver;
} }
#include "debugutil.moc"

View File

@ -62,6 +62,7 @@ public:
SessionFailed, SessionFailed,
ConnectionFailed, ConnectionFailed,
ClientsFailed, ClientsFailed,
ConnectionTimeout,
EnableFailed, EnableFailed,
RestrictFailed RestrictFailed
}; };