From b4b260071587d681c78768a7a84807226857b081 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 16 Jan 2023 22:10:10 +0100 Subject: [PATCH] TestOutputReader: Don't store test process Test process may be deleted when reader is still alive. Change-Id: I534d5bcebc6040305c4d937174db9444f6633df8 Reviewed-by: Christian Stenger Reviewed-by: --- .../autotest/boost/boosttestoutputreader.cpp | 14 +++++++++----- src/plugins/autotest/boost/boosttestoutputreader.h | 2 +- src/plugins/autotest/gtest/gtestoutputreader.cpp | 6 +++--- src/plugins/autotest/testoutputreader.cpp | 7 +++---- src/plugins/autotest/testoutputreader.h | 1 - 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/plugins/autotest/boost/boosttestoutputreader.cpp b/src/plugins/autotest/boost/boosttestoutputreader.cpp index 57d8503d277..5f549cca320 100644 --- a/src/plugins/autotest/boost/boosttestoutputreader.cpp +++ b/src/plugins/autotest/boost/boosttestoutputreader.cpp @@ -31,8 +31,12 @@ BoostTestOutputReader::BoostTestOutputReader(const QFutureInterface , m_logLevel(log) , m_reportLevel(report) { - if (m_testApplication) - connect(m_testApplication, &QtcProcess::done, this, &BoostTestOutputReader::onDone); + if (!testApplication) + return; + + connect(testApplication, &QtcProcess::done, this, [this, testApplication] { + onDone(testApplication->exitCode()); + }); } // content of "error:..." / "info:..." / ... messages @@ -378,10 +382,10 @@ TestResult BoostTestOutputReader::createDefaultResult() const return BoostTestResult(id(), m_currentModule, m_projectFile, m_currentTest, m_currentSuite); } -void BoostTestOutputReader::onDone() { - int exitCode = m_testApplication->exitCode(); +void BoostTestOutputReader::onDone(int exitCode) +{ if (m_reportLevel == ReportLevel::No && m_testCaseCount != -1) { - int reportedFailsAndSkips = m_summary[ResultType::Fail] + m_summary[ResultType::Skip]; + const int reportedFailsAndSkips = m_summary[ResultType::Fail] + m_summary[ResultType::Skip]; m_summary.insert(ResultType::Pass, m_testCaseCount - reportedFailsAndSkips); } // boost::exit_success (0), boost::exit_test_failure (201) diff --git a/src/plugins/autotest/boost/boosttestoutputreader.h b/src/plugins/autotest/boost/boosttestoutputreader.h index 33bc8c1e916..8449a0708ab 100644 --- a/src/plugins/autotest/boost/boosttestoutputreader.h +++ b/src/plugins/autotest/boost/boosttestoutputreader.h @@ -24,7 +24,7 @@ protected: TestResult createDefaultResult() const override; private: - void onDone(); + void onDone(int exitCode); void sendCompleteInformation(); void handleMessageMatch(const QRegularExpressionMatch &match); void reportNoOutputFinish(const QString &description, ResultType type); diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 2d08cfa62fe..4ad273063e9 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -24,9 +24,9 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface &futureI : TestOutputReader(futureInterface, testApplication, buildDirectory) , m_projectFile(projectFile) { - if (m_testApplication) { - connect(m_testApplication, &QtcProcess::done, this, [this] { - const int exitCode = m_testApplication->exitCode(); + if (testApplication) { + connect(testApplication, &QtcProcess::done, this, [this, testApplication] { + const int exitCode = testApplication->exitCode(); if (exitCode == 1 && !m_description.isEmpty()) { createAndReportResult(Tr::tr("Running tests failed.\n %1\nExecutable: %2") .arg(m_description).arg(id()), ResultType::MessageFatal); diff --git a/src/plugins/autotest/testoutputreader.cpp b/src/plugins/autotest/testoutputreader.cpp index 6595cc7762d..2f1dc75e485 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -29,7 +29,6 @@ FilePath TestOutputReader::constructSourceFilePath(const FilePath &path, const Q TestOutputReader::TestOutputReader(const QFutureInterface &futureInterface, QtcProcess *testApplication, const FilePath &buildDirectory) : m_futureInterface(futureInterface) - , m_testApplication(testApplication) , m_buildDir(buildDirectory) , m_id(testApplication ? testApplication->commandLine().executable().toUserOutput() : QString()) { @@ -41,11 +40,11 @@ TestOutputReader::TestOutputReader(const QFutureInterface &futureInt return line; }; - if (m_testApplication) { - m_testApplication->setStdOutLineCallback([this, &chopLineBreak](const QString &line) { + if (testApplication) { + testApplication->setStdOutLineCallback([this, &chopLineBreak](const QString &line) { processStdOutput(chopLineBreak(line.toUtf8())); }); - m_testApplication->setStdErrLineCallback([this, &chopLineBreak](const QString &line) { + testApplication->setStdErrLineCallback([this, &chopLineBreak](const QString &line) { processStdError(chopLineBreak(line.toUtf8())); }); } diff --git a/src/plugins/autotest/testoutputreader.h b/src/plugins/autotest/testoutputreader.h index e0ff74b399c..55c645d87c4 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -47,7 +47,6 @@ protected: void reportResult(const TestResult &result); QFutureInterface m_futureInterface; - Utils::QtcProcess *m_testApplication; // not owned Utils::FilePath m_buildDir; QString m_id; QHash m_summary;