From 3056105c661697839671d2277c6167ea0c97e30c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 5 Nov 2018 15:58:27 +0100 Subject: [PATCH] AutoTest: Fix displaying XML content CDATA sections that have line breaks at their line ends within a multiline CDATA section should get handled that these (inner) line breaks do not get lost. This patch fixes displaying failed Qt tests when using the XML output. Change-Id: I3aa7100836613372ac5b2b409c5cfacfb34209ba Reviewed-by: David Schulz --- .../autotest/gtest/gtestoutputreader.cpp | 4 ++-- .../autotest/gtest/gtestoutputreader.h | 2 +- .../autotest/qtest/qttestoutputreader.cpp | 4 ++-- .../autotest/qtest/qttestoutputreader.h | 4 ++-- src/plugins/autotest/testoutputreader.cpp | 22 +++++++++++++------ src/plugins/autotest/testoutputreader.h | 8 ++++--- src/plugins/autotest/testresultspane.cpp | 2 +- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 8087639d3a3..41b8133626b 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -62,7 +62,7 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface &futu } } -void GTestOutputReader::processOutput(const QByteArray &outputLine) +void GTestOutputReader::processOutput(const QByteArray &outputLineWithNewLine) { static QRegExp newTestStarts("^\\[-{10}\\] \\d+ tests? from (.*)$"); static QRegExp testEnds("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$"); @@ -74,7 +74,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine) static QRegExp errorLocation("^(.*)\\((\\d+)\\): error:.*$"); static QRegExp iterations("^Repeating all tests \\(iteration (\\d+)\\) \\. \\. \\.$"); - const QString line = QString::fromLatin1(outputLine); + const QString line = QString::fromLatin1(chopLineBreak(outputLineWithNewLine)); if (line.trimmed().isEmpty()) return; diff --git a/src/plugins/autotest/gtest/gtestoutputreader.h b/src/plugins/autotest/gtest/gtestoutputreader.h index fd60b9fbedd..e02975bea50 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.h +++ b/src/plugins/autotest/gtest/gtestoutputreader.h @@ -44,7 +44,7 @@ public: QProcess *testApplication, const QString &buildDirectory, const QString &projectFile); protected: - void processOutput(const QByteArray &outputLine) override; + void processOutput(const QByteArray &outputLineWithNewLine) override; TestResultPtr createDefaultResult() const override; private: diff --git a/src/plugins/autotest/qtest/qttestoutputreader.cpp b/src/plugins/autotest/qtest/qttestoutputreader.cpp index 864d2190973..b145864cca2 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -329,7 +329,7 @@ static QStringList extractFunctionInformation(const QString &testClassName, return result; } -void QtTestOutputReader::processPlainTextOutput(const QByteArray &outputLine) +void QtTestOutputReader::processPlainTextOutput(const QByteArray &outputLineWithNewLine) { static QRegExp start("^[*]{9} Start testing of (.*) [*]{9}$"); static QRegExp config("^Config: Using QtTest library (.*), (Qt (\\d+(\\.\\d+){2}) \\(.*\\))$"); @@ -346,7 +346,7 @@ void QtTestOutputReader::processPlainTextOutput(const QByteArray &outputLine) if (m_futureInterface.isCanceled()) return; - const QString &line = QString::fromLatin1(outputLine); + const QString line = QString::fromLatin1(chopLineBreak(outputLineWithNewLine)); if (result.exactMatch(line)) { processResultOutput(result.cap(1).toLower().trimmed(), result.cap(2)); diff --git a/src/plugins/autotest/qtest/qttestoutputreader.h b/src/plugins/autotest/qtest/qttestoutputreader.h index 3487cce066c..3393a123d22 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.h +++ b/src/plugins/autotest/qtest/qttestoutputreader.h @@ -55,8 +55,8 @@ protected: TestResultPtr createDefaultResult() const override; private: - void processXMLOutput(const QByteArray &outputLine); - void processPlainTextOutput(const QByteArray &outputLine); + void processXMLOutput(const QByteArray &outputLineWithNewline); + void processPlainTextOutput(const QByteArray &outputLineWithNewline); void processResultOutput(const QString &result, const QString &message); void processLocationOutput(const QString &fileWithLine); void processSummaryFinishOutput(); diff --git a/src/plugins/autotest/testoutputreader.cpp b/src/plugins/autotest/testoutputreader.cpp index f888f7b34c0..6107ffdaca1 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -27,6 +27,8 @@ #include "testresult.h" #include "testresultspane.h" +#include + #include #include @@ -44,11 +46,7 @@ TestOutputReader::TestOutputReader(const QFutureInterface &future connect(m_testApplication, &QProcess::readyRead, this, [this] () { while (m_testApplication->canReadLine()) { - QByteArray output = m_testApplication->readLine(); - output.chop(1); // remove the newline from the output - if (output.endsWith('\r')) - output.chop(1); - + const QByteArray output = m_testApplication->readLine(); emit newOutputAvailable(output); processOutput(output); } @@ -62,9 +60,9 @@ TestOutputReader::TestOutputReader(const QFutureInterface &future } } -void TestOutputReader::processStdError(const QByteArray &output) +void TestOutputReader::processStdError(const QByteArray &outputLineWithNewLine) { - qWarning() << "AutoTest.Run: Ignored plain output:" << output; + qWarning() << "AutoTest.Run: Ignored plain output:" << outputLineWithNewLine; } void TestOutputReader::reportCrash() @@ -83,6 +81,16 @@ void TestOutputReader::createAndReportResult(const QString &message, Result::Typ reportResult(result); } +QByteArray TestOutputReader::chopLineBreak(const QByteArray &original) +{ + QTC_ASSERT(original.endsWith('\n'), return original); + QByteArray output(original); + output.chop(1); // remove the newline from the output + if (output.endsWith('\r')) + output.chop(1); + return output; +} + 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 225ad3de33a..3c9fe0bb774 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -42,16 +42,18 @@ public: TestOutputReader(const QFutureInterface &futureInterface, QProcess *testApplication, const QString &buildDirectory); - virtual void processOutput(const QByteArray &outputLine) = 0; - virtual void processStdError(const QByteArray &output); + virtual void processOutput(const QByteArray &outputLineWithNewLine) = 0; + virtual void processStdError(const QByteArray &outputLineWithNewLine); void reportCrash(); void createAndReportResult(const QString &message, Result::Type type); bool hadValidOutput() const { return m_hadValidOutput; } void setId(const QString &id) { m_id = id; } QString id() const { return m_id; } + static QByteArray chopLineBreak(const QByteArray &original); + signals: - void newOutputAvailable(const QByteArray &output); + void newOutputAvailable(const QByteArray &outputWithLineBreak); protected: virtual TestResultPtr createDefaultResult() const = 0; diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index 277109b600a..8856b8a259d 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -236,7 +236,7 @@ void TestResultsPane::addTestResult(const TestResultPtr &result) void TestResultsPane::addOutput(const QByteArray &output) { - m_textOutput->appendPlainText(QString::fromLatin1(output)); + m_textOutput->insertPlainText(QString::fromLatin1(output)); } QWidget *TestResultsPane::outputWidget(QWidget *parent)