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