From 54f024dba419b7680453c16bdfc1b84706d0209c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 16 Apr 2018 09:45:01 +0200 Subject: [PATCH] AutoTest: Fix handling exceptions while environment setup If setting up the environment for gtest fails due to an exception we might end up having no reportable result but we get a return code of 1 for the test application. Inform the results pane instead of just ignoring the return code and explicitly send a fatal result for this. Task-number: QTCREATORBUG-20280 Change-Id: I05e522764d6302c5b0760c4bc10e01a2248a4494 Reviewed-by: David Schulz --- src/plugins/autotest/gtest/gtestoutputreader.cpp | 12 ++++++++---- src/plugins/autotest/testoutputreader.cpp | 8 ++++++++ src/plugins/autotest/testoutputreader.h | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index d3d915d96f2..bb4e13f6224 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -48,15 +48,19 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface &futu , m_executable(testApplication ? testApplication->program() : QString()) , m_projectFile(projectFile) { - // on Windows abort() will result in normal termination, but exit code will be set to 3 - if (Utils::HostOsInfo::isWindowsHost()) { connect(m_testApplication, static_cast(&QProcess::finished), this, [this] (int exitCode, QProcess::ExitStatus /*exitStatus*/) { - if (exitCode == 3) + if (exitCode == 1 && !m_description.isEmpty()) { + // TODO tr() + const QString message{"Running test(s) failed\n" + m_description + + "\nExecutable: " + m_executable}; + createAndReportResult(message, Result::MessageFatal); + } + // on Windows abort() will result in normal termination, but exit code will be set to 3 + if (Utils::HostOsInfo::isWindowsHost() && exitCode == 3) reportCrash(); }); - } } void GTestOutputReader::processOutput(const QByteArray &outputLine) diff --git a/src/plugins/autotest/testoutputreader.cpp b/src/plugins/autotest/testoutputreader.cpp index c4215b68521..a0e5807298d 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -74,6 +74,14 @@ void TestOutputReader::reportCrash() m_futureInterface.reportResult(result); } +void TestOutputReader::createAndReportResult(const QString &message, Result::Type type) +{ + TestResultPtr result = createDefaultResult(); + result->setDescription(message); + result->setResult(type); + reportResult(result); +} + void TestOutputReader::reportResult(const TestResultPtr &result) { m_futureInterface.reportResult(result); diff --git a/src/plugins/autotest/testoutputreader.h b/src/plugins/autotest/testoutputreader.h index bcb5e4614ed..e4935a11497 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -45,6 +45,7 @@ public: virtual void processOutput(const QByteArray &outputLine) = 0; virtual void processStdError(const QByteArray &output); void reportCrash(); + void createAndReportResult(const QString &message, Result::Type type); bool hadValidOutput() const { return m_hadValidOutput; } signals: