diff --git a/src/plugins/qmlprofiler/qmlprofiler.qbs b/src/plugins/qmlprofiler/qmlprofiler.qbs index 0fb5d68ab7a..d4b1c7d88ac 100644 --- a/src/plugins/qmlprofiler/qmlprofiler.qbs +++ b/src/plugins/qmlprofiler/qmlprofiler.qbs @@ -82,6 +82,7 @@ QtcPlugin { "flamegraphmodel_test.cpp", "flamegraphmodel_test.h", "flamegraphview_test.cpp", "flamegraphview_test.h", "inputeventsmodel_test.cpp", "inputeventsmodel_test.h", + "localqmlprofilerrunner_test.cpp", "localqmlprofilerrunner_test.h", ] } } diff --git a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp index 7ac464a34fb..a30816ada67 100644 --- a/src/plugins/qmlprofiler/qmlprofilerplugin.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerplugin.cpp @@ -35,6 +35,7 @@ #include "tests/flamegraphmodel_test.h" #include "tests/flamegraphview_test.h" #include "tests/inputeventsmodel_test.h" +#include "tests/localqmlprofilerrunner_test.h" #endif #include @@ -89,6 +90,7 @@ QList QmlProfiler::Internal::QmlProfilerPlugin::createTestObjects() c tests << new FlameGraphModelTest; tests << new FlameGraphViewTest; tests << new InputEventsModelTest; + tests << new LocalQmlProfilerRunnerTest; #endif return tests; } diff --git a/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp new file mode 100644 index 00000000000..8119b75afab --- /dev/null +++ b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "localqmlprofilerrunner_test.h" +#include +#include +#include +#include +#include + +namespace QmlProfiler { +namespace Internal { + +LocalQmlProfilerRunnerTest::LocalQmlProfilerRunnerTest(QObject *parent) : QObject(parent) +{ +} + +void LocalQmlProfilerRunnerTest::testRunner() +{ + LocalQmlProfilerRunner::Configuration configuration; + Debugger::AnalyzerRunControl *rc = Debugger::createAnalyzerRunControl( + nullptr, ProjectExplorer::Constants::QML_PROFILER_RUN_MODE); + rc->setConnection(Debugger::AnalyzerConnection()); + auto runner = new LocalQmlProfilerRunner(configuration, rc); + + bool running = false; + int runCount = 0; + int errors = 0; + + auto connectRunner = [&]() { + connect(runner, &LocalQmlProfilerRunner::started, this, [&running, &runCount](){ + QVERIFY(!running); + ++runCount; + running = true; + }); + connect(runner, &LocalQmlProfilerRunner::stopped, this, [&running](){ + QVERIFY(running); + running = false; + }); + + connect(runner, &LocalQmlProfilerRunner::appendMessage, this, + [&errors](const QString &message, Utils::OutputFormat format) { + Q_UNUSED(message); + if (format == Utils::ErrorMessageFormat) + ++errors; + }); + }; + + connectRunner(); + + rc->start(); + + QTRY_COMPARE(runCount, 1); + QTRY_VERIFY(!running); + QCOMPARE(errors, 1); + + configuration.debuggee.environment = Utils::Environment::systemEnvironment(); + configuration.debuggee.executable = qApp->applicationFilePath(); + configuration.debuggee.commandLineArguments = QString("-version"); + + delete rc; + rc = Debugger::createAnalyzerRunControl( + nullptr, ProjectExplorer::Constants::QML_PROFILER_RUN_MODE); + rc->setConnection(Debugger::AnalyzerConnection()); + runner = new LocalQmlProfilerRunner(configuration, rc); + connectRunner(); + rc->start(); + + QTRY_COMPARE(runCount, 2); + QTRY_VERIFY(!running); + QCOMPARE(errors, 1); + + delete rc; + + configuration.debuggee.commandLineArguments.clear(); + rc = Debugger::createAnalyzerRunControl( + nullptr, ProjectExplorer::Constants::QML_PROFILER_RUN_MODE); + rc->setConnection(Debugger::AnalyzerConnection()); + runner = new LocalQmlProfilerRunner(configuration, rc); + connectRunner(); + rc->start(); + + QTRY_COMPARE(runCount, 3); + QTest::qWait(1000); + QVERIFY(running); + QCOMPARE(errors, 1); + + rc->stop(); + QTRY_VERIFY(!running); + QCOMPARE(errors, 2); // "The program has unexpectedly finished." + + delete rc; +} + + +void LocalQmlProfilerRunnerTest::testFindFreePort() +{ + QString host; + Utils::Port port = LocalQmlProfilerRunner::findFreePort(host); + QVERIFY(port.isValid()); + QVERIFY(!host.isEmpty()); + QTcpServer server; + QVERIFY(server.listen(QHostAddress(host), port.number())); +} + +void LocalQmlProfilerRunnerTest::testFindFreeSocket() +{ + QString socket = LocalQmlProfilerRunner::findFreeSocket(); + QVERIFY(!socket.isEmpty()); + QVERIFY(!QFile::exists(socket)); + QFile file(socket); + QVERIFY(file.open(QIODevice::WriteOnly)); + file.close(); +} + + +} // namespace Internal +} // namespace QmlProfiler diff --git a/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.h b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.h new file mode 100644 index 00000000000..f8c40a1238e --- /dev/null +++ b/src/plugins/qmlprofiler/tests/localqmlprofilerrunner_test.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include +#include + +namespace QmlProfiler { +namespace Internal { + +class LocalQmlProfilerRunnerTest : public QObject +{ + Q_OBJECT +public: + LocalQmlProfilerRunnerTest(QObject *parent = 0); + +private slots: + void testRunner(); + void testFindFreePort(); + void testFindFreeSocket(); +}; + +} // namespace Internal +} // namespace QmlProfiler diff --git a/src/plugins/qmlprofiler/tests/tests.pri b/src/plugins/qmlprofiler/tests/tests.pri index 7951fd823f2..938ac6836f7 100644 --- a/src/plugins/qmlprofiler/tests/tests.pri +++ b/src/plugins/qmlprofiler/tests/tests.pri @@ -3,11 +3,13 @@ SOURCES += \ $$PWD/flamegraph_test.cpp \ $$PWD/flamegraphmodel_test.cpp \ $$PWD/flamegraphview_test.cpp \ - $$PWD/inputeventsmodel_test.cpp + $$PWD/inputeventsmodel_test.cpp \ + $$PWD/localqmlprofilerrunner_test.cpp HEADERS += \ $$PWD/debugmessagesmodel_test.h \ $$PWD/flamegraph_test.h \ $$PWD/flamegraphmodel_test.h \ $$PWD/flamegraphview_test.h \ - $$PWD/inputeventsmodel_test.h + $$PWD/inputeventsmodel_test.h \ + $$PWD/localqmlprofilerrunner_test.h