diff options
author | Eike Ziller <[email protected]> | 2018-11-09 13:30:40 +0100 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2018-11-09 13:30:40 +0100 |
commit | 3666e3aaeb26f91097a473491ea4cf58219029ca (patch) | |
tree | 2d1387557e243eacfe78698371c7726aa9a19350 /src/plugins/autotest | |
parent | 951eb885af8692c2c4aac67d18e3cbf033b7e912 (diff) | |
parent | dc82e49b62d6b851900689321828aee95f8eab54 (diff) |
Merge remote-tracking branch 'origin/4.8'
Conflicts:
tests/unit/unittest/unittest.pro
Change-Id: I4f0ab05f96ee60900a3a35fad4c7331238367593
Diffstat (limited to 'src/plugins/autotest')
-rw-r--r-- | src/plugins/autotest/gtest/gtestoutputreader.cpp | 4 | ||||
-rw-r--r-- | src/plugins/autotest/gtest/gtestoutputreader.h | 2 | ||||
-rw-r--r-- | src/plugins/autotest/qtest/qttestoutputreader.cpp | 6 | ||||
-rw-r--r-- | src/plugins/autotest/qtest/qttestoutputreader.h | 6 | ||||
-rw-r--r-- | src/plugins/autotest/testoutputreader.cpp | 31 | ||||
-rw-r--r-- | src/plugins/autotest/testoutputreader.h | 9 | ||||
-rw-r--r-- | src/plugins/autotest/testresultspane.cpp | 3 | ||||
-rw-r--r-- | src/plugins/autotest/testresultspane.h | 2 | ||||
-rw-r--r-- | src/plugins/autotest/testrunner.cpp | 26 |
9 files changed, 58 insertions, 31 deletions
diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 8087639d3a3..d42390ef8dc 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -62,7 +62,7 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface<TestResultPtr> &futu } } -void GTestOutputReader::processOutput(const QByteArray &outputLine) +void GTestOutputReader::processOutputLine(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..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 &outputLine) 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 864d2190973..de46727b09e 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -139,7 +139,7 @@ QtTestOutputReader::QtTestOutputReader(const QFutureInterface<TestResultPtr> &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) { @@ -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..89da00a8b91 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.h +++ b/src/plugins/autotest/qtest/qttestoutputreader.h @@ -51,12 +51,12 @@ 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: - 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..ff96d10e793 100644 --- a/src/plugins/autotest/testoutputreader.cpp +++ b/src/plugins/autotest/testoutputreader.cpp @@ -27,6 +27,8 @@ #include "testresult.h" #include "testresultspane.h" +#include <utils/qtcassert.h> + #include <QDebug> #include <QProcess> @@ -44,27 +46,28 @@ TestOutputReader::TestOutputReader(const QFutureInterface<TestResultPtr> &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); - - emit newOutputAvailable(output); + const QByteArray output = m_testApplication->readLine(); processOutput(output); } }); connect(m_testApplication, &QProcess::readyReadStandardError, this, [this] () { const QByteArray output = m_testApplication->readAllStandardError(); - emit newOutputAvailable(output); processStdError(output); }); } } -void TestOutputReader::processStdError(const QByteArray &output) +void TestOutputReader::processOutput(const QByteArray &output) +{ + processOutputLine(output); + emit newOutputAvailable(output); +} + +void TestOutputReader::processStdError(const QByteArray &outputLineWithNewLine) { - qWarning() << "AutoTest.Run: Ignored plain output:" << output; + qWarning() << "AutoTest.Run: Ignored plain output:" << outputLineWithNewLine; + emit newOutputAvailable(outputLineWithNewLine); } void TestOutputReader::reportCrash() @@ -83,6 +86,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..7c1f7d0f137 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -42,17 +42,20 @@ public: TestOutputReader(const QFutureInterface<TestResultPtr> &futureInterface, QProcess *testApplication, const QString &buildDirectory); - virtual void processOutput(const QByteArray &outputLine) = 0; - virtual void processStdError(const QByteArray &output); + void processOutput(const QByteArray &output); + 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 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 277109b600a..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 <aggregation/aggregate.h> #include <coreplugin/actionmanager/actionmanager.h> @@ -236,7 +237,7 @@ void TestResultsPane::addTestResult(const TestResultPtr &result) void TestResultsPane::addOutput(const QByteArray &output) { - m_textOutput->appendPlainText(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 |