Make TestRunner more thread-safe

Change-Id: I42e5c9e26a45ef2875cf70e1c5e3b989bcce4de8
Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
This commit is contained in:
Christian Stenger
2016-01-18 14:37:32 +01:00
committed by Eike Ziller
parent eca35ce868
commit d0b258a5df
2 changed files with 13 additions and 14 deletions

View File

@@ -22,15 +22,13 @@
#include "autotestconstants.h" #include "autotestconstants.h"
#include <projectexplorer/project.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <QObject> #include <QObject>
#include <QPointer>
#include <QStringList> #include <QStringList>
namespace ProjectExplorer {
class Project;
}
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
@@ -68,7 +66,7 @@ public:
QString workingDirectory() const { return m_workingDir; } QString workingDirectory() const { return m_workingDir; }
QString displayName() const { return m_displayName; } QString displayName() const { return m_displayName; }
Utils::Environment environment() const { return m_environment; } Utils::Environment environment() const { return m_environment; }
ProjectExplorer::Project *project() const { return m_project; } ProjectExplorer::Project *project() const { return m_project.data(); }
bool unnamedOnly() const { return m_unnamedOnly; } bool unnamedOnly() const { return m_unnamedOnly; }
bool guessedConfiguration() const { return m_guessedConfiguration; } bool guessedConfiguration() const { return m_guessedConfiguration; }
TestType testType() const { return m_type; } TestType testType() const { return m_type; }
@@ -85,7 +83,7 @@ private:
QString m_workingDir; QString m_workingDir;
QString m_displayName; QString m_displayName;
Utils::Environment m_environment; Utils::Environment m_environment;
ProjectExplorer::Project *m_project; QPointer<ProjectExplorer::Project> m_project;
bool m_guessedConfiguration; bool m_guessedConfiguration;
TestType m_type; TestType m_type;
}; };

View File

@@ -44,7 +44,7 @@ namespace Internal {
static TestRunner *m_instance = 0; static TestRunner *m_instance = 0;
void emitTestResultCreated(TestResult *testResult) static void emitTestResultCreated(TestResult *testResult)
{ {
emit m_instance->testResultCreated(testResult); emit m_instance->testResultCreated(testResult);
} }
@@ -105,9 +105,9 @@ void TestRunner::setSelectedTests(const QList<TestConfiguration *> &selected)
m_selectedTests = selected; m_selectedTests = selected;
} }
void performTestRun(QFutureInterface<void> &futureInterface, static void performTestRun(QFutureInterface<void> &futureInterface,
const QList<TestConfiguration *> selectedTests, const int timeout, const QList<TestConfiguration *> selectedTests, const int timeout,
const QString metricsOption, TestRunner* testRunner) const QString metricsOption)
{ {
int testCaseCount = 0; int testCaseCount = 0;
foreach (TestConfiguration *config, selectedTests) { foreach (TestConfiguration *config, selectedTests) {
@@ -124,9 +124,6 @@ void performTestRun(QFutureInterface<void> &futureInterface,
QProcess testProcess; QProcess testProcess;
testProcess.setReadChannelMode(QProcess::MergedChannels); testProcess.setReadChannelMode(QProcess::MergedChannels);
testProcess.setReadChannel(QProcess::StandardOutput); testProcess.setReadChannel(QProcess::StandardOutput);
QObject::connect(testRunner, &TestRunner::requestStopTestRun, &testProcess, [&] () {
futureInterface.cancel(); // this kills the process if that is still in the running loop
});
TestOutputReader outputReader(&testProcess); TestOutputReader outputReader(&testProcess);
QObject::connect(&outputReader, &TestOutputReader::increaseProgress, [&] () { QObject::connect(&outputReader, &TestOutputReader::increaseProgress, [&] () {
@@ -278,11 +275,15 @@ void TestRunner::runTests()
Qt::QueuedConnection); Qt::QueuedConnection);
QFuture<void> future = QtConcurrent::run(&performTestRun, m_selectedTests, settings->timeout, QFuture<void> future = QtConcurrent::run(&performTestRun, m_selectedTests, settings->timeout,
metricsOption, this); metricsOption);
Core::FutureProgress *progress = Core::ProgressManager::addTask(future, tr("Running Tests"), Core::FutureProgress *progress = Core::ProgressManager::addTask(future, tr("Running Tests"),
Autotest::Constants::TASK_INDEX); Autotest::Constants::TASK_INDEX);
connect(progress, &Core::FutureProgress::finished, connect(progress, &Core::FutureProgress::finished,
TestRunner::instance(), &TestRunner::onFinished); TestRunner::instance(), &TestRunner::onFinished);
connect(this, &TestRunner::requestStopTestRun, progress, [progress]() {
progress->future().cancel();
});
} }
void TestRunner::buildProject(ProjectExplorer::Project *project) void TestRunner::buildProject(ProjectExplorer::Project *project)