forked from qt-creator/qt-creator
QmlProfiler: Unify local and tcp connection mechanism
Use the URL scheme to distinguish between them, check that in QmlProfilerClientManager and test all possible combinations of URL parts. Change-Id: I6583e5bf18eda0344a299a279c12578c4ebc7ffe Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -293,6 +293,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunControl *runControl, const AndroidRu
|
|||||||
QTC_ASSERT(server.listen(QHostAddress::LocalHost)
|
QTC_ASSERT(server.listen(QHostAddress::LocalHost)
|
||||||
|| server.listen(QHostAddress::LocalHostIPv6),
|
|| server.listen(QHostAddress::LocalHostIPv6),
|
||||||
qDebug() << tr("No free ports available on host for QML debugging."));
|
qDebug() << tr("No free ports available on host for QML debugging."));
|
||||||
|
m_qmlServer.setScheme(urlTcpScheme());
|
||||||
m_qmlServer.setHost(server.serverAddress().toString());
|
m_qmlServer.setHost(server.serverAddress().toString());
|
||||||
m_qmlServer.setPort(server.serverPort());
|
m_qmlServer.setPort(server.serverPort());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ QUrl urlFromLocalHostAndFreePort()
|
|||||||
{
|
{
|
||||||
QUrl serverUrl;
|
QUrl serverUrl;
|
||||||
QTcpServer server;
|
QTcpServer server;
|
||||||
|
serverUrl.setScheme(urlTcpScheme());
|
||||||
if (server.listen(QHostAddress::LocalHost) || server.listen(QHostAddress::LocalHostIPv6)) {
|
if (server.listen(QHostAddress::LocalHost) || server.listen(QHostAddress::LocalHostIPv6)) {
|
||||||
serverUrl.setHost(server.serverAddress().toString());
|
serverUrl.setHost(server.serverAddress().toString());
|
||||||
serverUrl.setPort(server.serverPort());
|
serverUrl.setPort(server.serverPort());
|
||||||
@@ -68,4 +69,9 @@ QString urlSocketScheme()
|
|||||||
return QString("socket");
|
return QString("socket");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString urlTcpScheme()
|
||||||
|
{
|
||||||
|
return QString("tcp");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|||||||
@@ -56,5 +56,6 @@ PROJECTEXPLORER_EXPORT bool operator==(const StandardRunnable &r1, const Standar
|
|||||||
PROJECTEXPLORER_EXPORT QUrl urlFromLocalHostAndFreePort();
|
PROJECTEXPLORER_EXPORT QUrl urlFromLocalHostAndFreePort();
|
||||||
PROJECTEXPLORER_EXPORT QUrl urlFromLocalSocket();
|
PROJECTEXPLORER_EXPORT QUrl urlFromLocalSocket();
|
||||||
PROJECTEXPLORER_EXPORT QString urlSocketScheme();
|
PROJECTEXPLORER_EXPORT QString urlSocketScheme();
|
||||||
|
PROJECTEXPLORER_EXPORT QString urlTcpScheme();
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "qmlprofilerstatemanager.h"
|
#include "qmlprofilerstatemanager.h"
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
#include <projectexplorer/runnables.h>
|
||||||
|
|
||||||
namespace QmlProfiler {
|
namespace QmlProfiler {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -65,13 +66,19 @@ void QmlProfilerClientManager::setRetryParams(int interval, int maxAttempts)
|
|||||||
m_maximumRetries = maxAttempts;
|
m_maximumRetries = maxAttempts;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlProfilerClientManager::setServerUrl(const QUrl &server)
|
void QmlProfilerClientManager::connectToServer(const QUrl &server)
|
||||||
{
|
{
|
||||||
if (m_server != server) {
|
if (m_server != server) {
|
||||||
m_server = server;
|
m_server = server;
|
||||||
disconnectClient();
|
disconnectClient();
|
||||||
stopConnectionTimer();
|
stopConnectionTimer();
|
||||||
}
|
}
|
||||||
|
if (server.scheme() == ProjectExplorer::urlTcpScheme())
|
||||||
|
connectToTcpServer();
|
||||||
|
else if (server.scheme() == ProjectExplorer::urlSocketScheme())
|
||||||
|
startLocalServer();
|
||||||
|
else
|
||||||
|
QTC_ASSERT(false, emit connectionFailed());
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlProfilerClientManager::clearConnection()
|
void QmlProfilerClientManager::clearConnection()
|
||||||
@@ -166,9 +173,9 @@ void QmlProfilerClientManager::stopRecording()
|
|||||||
|
|
||||||
void QmlProfilerClientManager::retryConnect()
|
void QmlProfilerClientManager::retryConnect()
|
||||||
{
|
{
|
||||||
if (m_server.scheme() == "socket") {
|
if (m_server.scheme() == ProjectExplorer::urlSocketScheme()) {
|
||||||
startLocalServer();
|
startLocalServer();
|
||||||
} else if (!m_server.host().isEmpty() && m_server.port() > 0) {
|
} else if (m_server.scheme() == ProjectExplorer::urlTcpScheme()) {
|
||||||
disconnectClient();
|
disconnectClient();
|
||||||
connectToTcpServer();
|
connectToTcpServer();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
~QmlProfilerClientManager();
|
~QmlProfilerClientManager();
|
||||||
|
|
||||||
void setProfilerStateManager(QmlProfilerStateManager *profilerState);
|
void setProfilerStateManager(QmlProfilerStateManager *profilerState);
|
||||||
void setServerUrl(const QUrl &server);
|
void connectToServer(const QUrl &server);
|
||||||
void clearConnection();
|
void clearConnection();
|
||||||
|
|
||||||
void clearBufferedData();
|
void clearBufferedData();
|
||||||
@@ -58,8 +58,6 @@ public:
|
|||||||
|
|
||||||
void setRetryParams(int interval, int maxAttempts);
|
void setRetryParams(int interval, int maxAttempts);
|
||||||
void retryConnect();
|
void retryConnect();
|
||||||
void connectToTcpServer();
|
|
||||||
void startLocalServer();
|
|
||||||
|
|
||||||
void stopRecording();
|
void stopRecording();
|
||||||
|
|
||||||
@@ -69,6 +67,9 @@ signals:
|
|||||||
void connectionClosed();
|
void connectionClosed();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void connectToTcpServer();
|
||||||
|
void startLocalServer();
|
||||||
|
|
||||||
QPointer<QmlProfilerStateManager> m_profilerState;
|
QPointer<QmlProfilerStateManager> m_profilerState;
|
||||||
QPointer<QmlProfilerModelManager> m_modelManager;
|
QPointer<QmlProfilerModelManager> m_modelManager;
|
||||||
QScopedPointer<QmlDebug::QmlDebugConnection> m_connection;
|
QScopedPointer<QmlDebug::QmlDebugConnection> m_connection;
|
||||||
|
|||||||
@@ -127,17 +127,10 @@ void QmlProfilerRunner::start()
|
|||||||
});
|
});
|
||||||
|
|
||||||
infoBox->show();
|
infoBox->show();
|
||||||
});
|
}, Qt::QueuedConnection); // Queue any connection failures after reportStarted()
|
||||||
|
|
||||||
clientManager->setServerUrl(serverUrl);
|
|
||||||
if (serverUrl.port() != -1) {
|
|
||||||
clientManager->connectToTcpServer();
|
|
||||||
} else {
|
|
||||||
clientManager->startLocalServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
clientManager->connectToServer(serverUrl);
|
||||||
d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppRunning);
|
d->m_profilerState->setCurrentState(QmlProfilerStateManager::AppRunning);
|
||||||
|
|
||||||
reportStarted();
|
reportStarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,9 +277,13 @@ LocalQmlProfilerSupport::LocalQmlProfilerSupport(RunControl *runControl, const Q
|
|||||||
|
|
||||||
StandardRunnable debuggee = runnable().as<StandardRunnable>();
|
StandardRunnable debuggee = runnable().as<StandardRunnable>();
|
||||||
|
|
||||||
QString code = serverUrl.scheme() == "socket"
|
QString code;
|
||||||
? QString("file:%1").arg(serverUrl.path())
|
if (serverUrl.scheme() == urlSocketScheme())
|
||||||
: QString("port:%1").arg(serverUrl.port());
|
code = QString("file:%1").arg(serverUrl.path());
|
||||||
|
else if (serverUrl.scheme() == urlTcpScheme())
|
||||||
|
code = QString("port:%1").arg(serverUrl.port());
|
||||||
|
else
|
||||||
|
QTC_CHECK(false);
|
||||||
|
|
||||||
QString arguments = QmlDebug::qmlDebugCommandLineArguments(QmlDebug::QmlProfilerServices,
|
QString arguments = QmlDebug::qmlDebugCommandLineArguments(QmlDebug::QmlProfilerServices,
|
||||||
code, true);
|
code, true);
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ void LocalQmlProfilerRunnerTest::testRunner()
|
|||||||
debuggee.environment = Utils::Environment::systemEnvironment();
|
debuggee.environment = Utils::Environment::systemEnvironment();
|
||||||
|
|
||||||
// should not be used anywhere but cannot be empty
|
// should not be used anywhere but cannot be empty
|
||||||
|
serverUrl.setScheme(ProjectExplorer::urlSocketScheme());
|
||||||
serverUrl.setPath("invalid");
|
serverUrl.setPath("invalid");
|
||||||
|
|
||||||
runControl = new ProjectExplorer::RunControl(nullptr,
|
runControl = new ProjectExplorer::RunControl(nullptr,
|
||||||
|
|||||||
@@ -73,37 +73,31 @@ void QmlProfilerClientManagerTest::testConnectionFailure_data()
|
|||||||
QUrl localUrl = urlFromLocalHostAndFreePort();
|
QUrl localUrl = urlFromLocalHostAndFreePort();
|
||||||
|
|
||||||
QTest::addColumn<QUrl>("serverUrl");
|
QTest::addColumn<QUrl>("serverUrl");
|
||||||
QVarLengthArray<QString> hosts({"", "/-/|\\-\\|/-", localUrl.host()});
|
const QVarLengthArray<QString> hosts({"", "/-/|\\-\\|/-", localUrl.host()});
|
||||||
QVarLengthArray<int> ports({-1, 5, localUrl.port()});
|
const QVarLengthArray<int> ports({-1, 5, localUrl.port()});
|
||||||
QVarLengthArray<QString> sockets({"", "/-/|\\-\\|/-", urlFromLocalSocket().path()});
|
const QVarLengthArray<QString> sockets({"", "/-/|\\-\\|/-", urlFromLocalSocket().path()});
|
||||||
|
const QVarLengthArray<QString> schemes({"", urlSocketScheme(), urlTcpScheme()});
|
||||||
|
|
||||||
foreach (QmlProfilerModelManager *modelManager, modelManagers) {
|
for (QmlProfilerModelManager *modelManager : modelManagers) {
|
||||||
foreach (QmlProfilerStateManager *stateManager, stateManagers) {
|
for (QmlProfilerStateManager *stateManager : stateManagers) {
|
||||||
foreach (QString host, hosts) {
|
for (const QString &host : hosts) {
|
||||||
foreach (int port, ports) {
|
for (int port : ports) {
|
||||||
QString tag = QString::fromLatin1("%1, %2, %3, %4, %5")
|
for (const QString &socket : sockets) {
|
||||||
.arg(QLatin1String(modelManager ? "modelManager" : "<null>"))
|
for (const QString &scheme : schemes ) {
|
||||||
.arg(QLatin1String(stateManager ? "stateManager" : "<null>"))
|
|
||||||
.arg(host.isEmpty() ? "<empty>" : host)
|
|
||||||
.arg(Utils::Port(port).isValid() ? port : 0)
|
|
||||||
.arg("<empty>");
|
|
||||||
QUrl url;
|
QUrl url;
|
||||||
|
url.setScheme(scheme);
|
||||||
url.setHost(host);
|
url.setHost(host);
|
||||||
url.setPort(port);
|
url.setPort(port);
|
||||||
QTest::newRow(tag.toLatin1().constData()) << modelManager << stateManager << url;
|
url.setPath(socket);
|
||||||
}
|
QString tag = QString::fromLatin1("%1, %2, %3")
|
||||||
}
|
|
||||||
foreach (QString socket, sockets) {
|
|
||||||
QString tag = QString::fromLatin1("%1, %2, %3, %4, %5")
|
|
||||||
.arg(QLatin1String(modelManager ? "modelManager" : "<null>"))
|
.arg(QLatin1String(modelManager ? "modelManager" : "<null>"))
|
||||||
.arg(QLatin1String(stateManager ? "stateManager" : "<null>"))
|
.arg(QLatin1String(stateManager ? "stateManager" : "<null>"))
|
||||||
.arg("<empty>")
|
.arg(url.toString());
|
||||||
.arg(0)
|
QTest::newRow(tag.toLatin1().constData()) << modelManager
|
||||||
.arg(socket);
|
<< stateManager << url;
|
||||||
QUrl url;
|
}
|
||||||
url.setScheme(urlSocketScheme());
|
}
|
||||||
url.setPath(socket);
|
}
|
||||||
QTest::newRow(tag.toLatin1().constData()) << modelManager << stateManager << url;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,24 +131,17 @@ void QmlProfilerClientManagerTest::testConnectionFailure()
|
|||||||
|
|
||||||
clientManager.setModelManager(modelManager);
|
clientManager.setModelManager(modelManager);
|
||||||
clientManager.setProfilerStateManager(stateManager);
|
clientManager.setProfilerStateManager(stateManager);
|
||||||
clientManager.setServerUrl(serverUrl);
|
|
||||||
|
|
||||||
QVERIFY(!clientManager.isConnected());
|
QVERIFY(!clientManager.isConnected());
|
||||||
|
|
||||||
clientManager.connectToTcpServer();
|
clientManager.connectToServer(serverUrl);
|
||||||
QTRY_COMPARE(failedSpy.count(), 1);
|
QTRY_COMPARE(failedSpy.count(), 1);
|
||||||
QCOMPARE(closedSpy.count(), 0);
|
QCOMPARE(closedSpy.count(), 0);
|
||||||
QCOMPARE(openedSpy.count(), 0);
|
QCOMPARE(openedSpy.count(), 0);
|
||||||
QVERIFY(!clientManager.isConnected());
|
QVERIFY(!clientManager.isConnected());
|
||||||
|
|
||||||
clientManager.startLocalServer();
|
|
||||||
QTRY_COMPARE(failedSpy.count(), 2);
|
|
||||||
QCOMPARE(closedSpy.count(), 0);
|
|
||||||
QCOMPARE(openedSpy.count(), 0);
|
|
||||||
QVERIFY(!clientManager.isConnected());
|
|
||||||
|
|
||||||
clientManager.retryConnect();
|
clientManager.retryConnect();
|
||||||
QTRY_COMPARE(failedSpy.count(), 3);
|
QTRY_COMPARE(failedSpy.count(), 2);
|
||||||
QCOMPARE(closedSpy.count(), 0);
|
QCOMPARE(closedSpy.count(), 0);
|
||||||
QCOMPARE(openedSpy.count(), 0);
|
QCOMPARE(openedSpy.count(), 0);
|
||||||
QVERIFY(!clientManager.isConnected());
|
QVERIFY(!clientManager.isConnected());
|
||||||
@@ -181,8 +168,7 @@ void QmlProfilerClientManagerTest::testUnresponsiveTcp()
|
|||||||
server.listen(QHostAddress(serverUrl.host()), serverUrl.port());
|
server.listen(QHostAddress(serverUrl.host()), serverUrl.port());
|
||||||
QSignalSpy connectionSpy(&server, SIGNAL(newConnection()));
|
QSignalSpy connectionSpy(&server, SIGNAL(newConnection()));
|
||||||
|
|
||||||
clientManager.setServerUrl(serverUrl);
|
clientManager.connectToServer(serverUrl);
|
||||||
clientManager.connectToTcpServer();
|
|
||||||
|
|
||||||
QTRY_VERIFY(connectionSpy.count() > 0);
|
QTRY_VERIFY(connectionSpy.count() > 0);
|
||||||
QTRY_COMPARE(failedSpy.count(), 1);
|
QTRY_COMPARE(failedSpy.count(), 1);
|
||||||
@@ -208,8 +194,7 @@ void QmlProfilerClientManagerTest::testUnresponsiveLocal()
|
|||||||
QLocalSocket socket;
|
QLocalSocket socket;
|
||||||
QSignalSpy connectionSpy(&socket, SIGNAL(connected()));
|
QSignalSpy connectionSpy(&socket, SIGNAL(connected()));
|
||||||
|
|
||||||
clientManager.setServerUrl(socketUrl);
|
clientManager.connectToServer(socketUrl);
|
||||||
clientManager.startLocalServer();
|
|
||||||
|
|
||||||
socket.connectToServer(socketUrl.path());
|
socket.connectToServer(socketUrl.path());
|
||||||
QTRY_COMPARE(connectionSpy.count(), 1);
|
QTRY_COMPARE(connectionSpy.count(), 1);
|
||||||
@@ -280,8 +265,7 @@ void QmlProfilerClientManagerTest::testResponsiveTcp()
|
|||||||
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
||||||
&clientManager, &QmlProfilerClientManager::retryConnect);
|
&clientManager, &QmlProfilerClientManager::retryConnect);
|
||||||
|
|
||||||
clientManager.setServerUrl(serverUrl);
|
clientManager.connectToServer(serverUrl);
|
||||||
clientManager.connectToTcpServer();
|
|
||||||
|
|
||||||
QTRY_COMPARE(openedSpy.count(), 1);
|
QTRY_COMPARE(openedSpy.count(), 1);
|
||||||
QCOMPARE(closedSpy.count(), 0);
|
QCOMPARE(closedSpy.count(), 0);
|
||||||
@@ -329,8 +313,7 @@ void QmlProfilerClientManagerTest::testResponsiveLocal()
|
|||||||
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
||||||
&clientManager, &QmlProfilerClientManager::retryConnect);
|
&clientManager, &QmlProfilerClientManager::retryConnect);
|
||||||
|
|
||||||
clientManager.setServerUrl(socketUrl);
|
clientManager.connectToServer(socketUrl);
|
||||||
clientManager.startLocalServer();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
QScopedPointer<QLocalSocket> socket(new QLocalSocket(this));
|
QScopedPointer<QLocalSocket> socket(new QLocalSocket(this));
|
||||||
@@ -397,8 +380,7 @@ void QmlProfilerClientManagerTest::testInvalidData()
|
|||||||
|
|
||||||
server.listen(QHostAddress(serverUrl.host()), serverUrl.port());
|
server.listen(QHostAddress(serverUrl.host()), serverUrl.port());
|
||||||
|
|
||||||
clientManager.setServerUrl(serverUrl);
|
clientManager.connectToServer(serverUrl);
|
||||||
clientManager.connectToTcpServer();
|
|
||||||
|
|
||||||
QTRY_VERIFY(dataSent);
|
QTRY_VERIFY(dataSent);
|
||||||
QTRY_COMPARE(failedSpy.count(), 1);
|
QTRY_COMPARE(failedSpy.count(), 1);
|
||||||
@@ -427,8 +409,7 @@ void QmlProfilerClientManagerTest::testStopRecording()
|
|||||||
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
connect(&clientManager, &QmlProfilerClientManager::connectionFailed,
|
||||||
&clientManager, &QmlProfilerClientManager::retryConnect);
|
&clientManager, &QmlProfilerClientManager::retryConnect);
|
||||||
|
|
||||||
clientManager.setServerUrl(socketUrl);
|
clientManager.connectToServer(socketUrl);
|
||||||
clientManager.startLocalServer();
|
|
||||||
|
|
||||||
QScopedPointer<QLocalSocket> socket(new QLocalSocket(this));
|
QScopedPointer<QLocalSocket> socket(new QLocalSocket(this));
|
||||||
socket->connectToServer(socketUrl.path());
|
socket->connectToServer(socketUrl.path());
|
||||||
|
|||||||
Reference in New Issue
Block a user