From 3056105c661697839671d2277c6167ea0c97e30c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 5 Nov 2018 15:58:27 +0100 Subject: 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 --- src/plugins/autotest/gtest/gtestoutputreader.cpp | 4 ++-- src/plugins/autotest/gtest/gtestoutputreader.h | 2 +- src/plugins/autotest/qtest/qttestoutputreader.cpp | 4 ++-- src/plugins/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(-) (limited to 'src/plugins/autotest') 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) -- cgit v1.2.3 From 1cfaa828a8004285bb21c4bb264e5c636df2f9a6 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 6 Nov 2018 16:00:48 +0100 Subject: AutoTest: Fix outputparser This patch amends 3056105c6616. This patch fixes handling of output while debugging and appending to the "real" output if the user interacts with the output while the test is running. Change-Id: I1db54382f1df3e2b9a5a860002aac8fb208ee5b9 Reviewed-by: David Schulz --- src/plugins/autotest/gtest/gtestoutputreader.cpp | 2 +- src/plugins/autotest/gtest/gtestoutputreader.h | 2 +- src/plugins/autotest/qtest/qttestoutputreader.cpp | 2 +- src/plugins/autotest/qtest/qttestoutputreader.h | 2 +- src/plugins/autotest/testoutputreader.cpp | 7 +++++- src/plugins/autotest/testoutputreader.h | 3 ++- src/plugins/autotest/testresultspane.cpp | 3 ++- src/plugins/autotest/testresultspane.h | 2 +- src/plugins/autotest/testrunner.cpp | 26 ++++++++++++++++------- 9 files changed, 33 insertions(+), 16 deletions(-) (limited to 'src/plugins/autotest') diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 41b8133626b..d42390ef8dc 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 &outputLineWithNewLine) +void GTestOutputReader::processOutputLine(const QByteArray &outputLineWithNewLine) { static QRegExp newTestStarts("^\\[-{10}\\] \\d+ tests? from (.*)$"); static QRegExp testEnds("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$"); diff --git a/src/plugins/autotest/gtest/gtestoutputreader.h b/src/plugins/autotest/gtest/gtestoutputreader.h index e02975bea50..8f29ae73e17 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 &outputLineWithNewLine) override; + void processOutputLine(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 b145864cca2..de46727b09e 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -139,7 +139,7 @@ QtTestOutputReader::QtTestOutputReader(const QFutureInterface &fu { } -void QtTestOutputReader::processOutput(const QByteArray &outputLine) +void QtTestOutputReader::processOutputLine(const QByteArray &outputLine) { static const QByteArray qmlDebug = "QML Debugger: Waiting for connection on port"; switch (m_mode) { diff --git a/src/plugins/autotest/qtest/qttestoutputreader.h b/src/plugins/autotest/qtest/qttestoutputreader.h index 3393a123d22..89da00a8b91 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.h +++ b/src/plugins/autotest/qtest/qttestoutputreader.h @@ -51,7 +51,7 @@ public: QProcess *testApplication, const QString &buildDirectory, const QString &projectFile, OutputMode mode, TestType type); protected: - void processOutput(const QByteArray &outputLine) override; + void processOutputLine(const QByteArray &outputLine) override; TestResultPtr createDefaultResult() const override; private: diff --git a/src/plugins/autotest/testoutputreader.cpp b/src/plugins/autotest/testoutputreader.cpp index 6107ffdaca1..e442afd4995 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -47,7 +47,6 @@ TestOutputReader::TestOutputReader(const QFutureInterface &future this, [this] () { while (m_testApplication->canReadLine()) { const QByteArray output = m_testApplication->readLine(); - emit newOutputAvailable(output); processOutput(output); } }); @@ -60,6 +59,12 @@ TestOutputReader::TestOutputReader(const QFutureInterface &future } } +void TestOutputReader::processOutput(const QByteArray &output) +{ + processOutputLine(output); + emit newOutputAvailable(output); +} + void TestOutputReader::processStdError(const QByteArray &outputLineWithNewLine) { qWarning() << "AutoTest.Run: Ignored plain output:" << outputLineWithNewLine; diff --git a/src/plugins/autotest/testoutputreader.h b/src/plugins/autotest/testoutputreader.h index 3c9fe0bb774..7c1f7d0f137 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -42,7 +42,7 @@ public: TestOutputReader(const QFutureInterface &futureInterface, QProcess *testApplication, const QString &buildDirectory); - virtual void processOutput(const QByteArray &outputLineWithNewLine) = 0; + void processOutput(const QByteArray &output); virtual void processStdError(const QByteArray &outputLineWithNewLine); void reportCrash(); void createAndReportResult(const QString &message, Result::Type type); @@ -55,6 +55,7 @@ public: signals: void newOutputAvailable(const QByteArray &outputWithLineBreak); protected: + virtual void processOutputLine(const QByteArray &outputLineWithNewLine) = 0; virtual TestResultPtr createDefaultResult() const = 0; void reportResult(const TestResultPtr &result); diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index 8856b8a259d..c67cd15ae56 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -33,6 +33,7 @@ #include "testtreemodel.h" #include "testcodeparser.h" #include "testeditormark.h" +#include "testoutputreader.h" #include #include @@ -236,7 +237,7 @@ void TestResultsPane::addTestResult(const TestResultPtr &result) void TestResultsPane::addOutput(const QByteArray &output) { - m_textOutput->insertPlainText(QString::fromLatin1(output)); + m_textOutput->appendPlainText(QString::fromLatin1(TestOutputReader::chopLineBreak(output))); } QWidget *TestResultsPane::outputWidget(QWidget *parent) diff --git a/src/plugins/autotest/testresultspane.h b/src/plugins/autotest/testresultspane.h index 7dcd1f94be7..862270534c3 100644 --- a/src/plugins/autotest/testresultspane.h +++ b/src/plugins/autotest/testresultspane.h @@ -92,7 +92,7 @@ public: void goToPrev() override; void addTestResult(const TestResultPtr &result); - void addOutput(const QByteArray &output); + void addOutput(const QByteArray &outputWithNewLine); void showTestResult(const QModelIndex &index); private: diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index 78780f4a03f..6792b96cb38 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -471,25 +471,35 @@ void TestRunner::runTests() static void processOutput(TestOutputReader *outputreader, const QString &msg, Utils::OutputFormat format) { + QByteArray message = msg.toUtf8(); switch (format) { case Utils::OutputFormat::StdOutFormatSameLine: case Utils::OutputFormat::DebugFormat: { - static const QString gdbSpecialOut = "Qt: gdb: -nograb added to command-line options.\n" - "\t Use the -dograb option to enforce grabbing."; - int start = msg.startsWith(gdbSpecialOut) ? gdbSpecialOut.length() + 1 : 0; + static const QByteArray gdbSpecialOut = "Qt: gdb: -nograb added to command-line options.\n" + "\t Use the -dograb option to enforce grabbing."; + int start = message.startsWith(gdbSpecialOut) ? gdbSpecialOut.length() + 1 : 0; if (start) { - int maxIndex = msg.length() - 1; + int maxIndex = message.length() - 1; while (start < maxIndex && msg.at(start + 1) == '\n') ++start; - if (start >= msg.length()) // we cut out the whole message + if (start >= message.length()) // we cut out the whole message break; } - for (const QString &line : msg.mid(start).split('\n')) - outputreader->processOutput(line.toUtf8()); + + int index = message.indexOf('\n', start); + while (index != -1) { + const QByteArray line = message.mid(start, index - start + 1); + outputreader->processOutput(line); + start = index + 1; + index = message.indexOf('\n', start); + } + if (!QTC_GUARD(start == message.length())) // paranoia + outputreader->processOutput(message.mid(start).append('\n')); + break; } case Utils::OutputFormat::StdErrFormatSameLine: - outputreader->processStdError(msg.toUtf8()); + outputreader->processStdError(message); break; default: break; // channels we're not caring about -- cgit v1.2.3 From d84672226447259166fb2f897ca1915b8b234ba5 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 8 Nov 2018 07:53:23 +0100 Subject: AutoTest: Move signal emission ... to location where the output gets processed. Change-Id: I293f1dbd67e4c8969f60305768e1ce5bc8cba063 Reviewed-by: David Schulz --- src/plugins/autotest/testoutputreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins/autotest') diff --git a/src/plugins/autotest/testoutputreader.cpp b/src/plugins/autotest/testoutputreader.cpp index e442afd4995..ff96d10e793 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -53,7 +53,6 @@ TestOutputReader::TestOutputReader(const QFutureInterface &future connect(m_testApplication, &QProcess::readyReadStandardError, this, [this] () { const QByteArray output = m_testApplication->readAllStandardError(); - emit newOutputAvailable(output); processStdError(output); }); } @@ -68,6 +67,7 @@ void TestOutputReader::processOutput(const QByteArray &output) void TestOutputReader::processStdError(const QByteArray &outputLineWithNewLine) { qWarning() << "AutoTest.Run: Ignored plain output:" << outputLineWithNewLine; + emit newOutputAvailable(outputLineWithNewLine); } void TestOutputReader::reportCrash() -- cgit v1.2.3