AutoTest: Fix result tree for google test

Change-Id: I1f4a361a3c4ceb77c221d6549e42a1b7803ef305
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2016-12-14 13:30:33 +01:00
parent 41ceac474b
commit b9fc628bb9
6 changed files with 39 additions and 28 deletions

View File

@@ -45,15 +45,15 @@ GTestOutputReader::GTestOutputReader(const QFutureInterface<TestResultPtr> &futu
void GTestOutputReader::processOutput(const QByteArray &outputLine) void GTestOutputReader::processOutput(const QByteArray &outputLine)
{ {
static QRegExp newTestStarts(QStringLiteral("^\\[-{10}\\] \\d+ tests? from (.*)$")); static QRegExp newTestStarts("^\\[-{10}\\] \\d+ tests? from (.*)$");
static QRegExp testEnds(QStringLiteral("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$")); static QRegExp testEnds("^\\[-{10}\\] \\d+ tests? from (.*) \\((.*)\\)$");
static QRegExp newTestSetStarts(QStringLiteral("^\\[ RUN \\] (.*)$")); static QRegExp newTestSetStarts("^\\[ RUN \\] (.*)$");
static QRegExp testSetSuccess(QStringLiteral("^\\[ OK \\] (.*) \\((.*)\\)$")); static QRegExp testSetSuccess("^\\[ OK \\] (.*) \\((.*)\\)$");
static QRegExp testSetFail(QStringLiteral("^\\[ FAILED \\] (.*) \\((.*)\\)$")); static QRegExp testSetFail("^\\[ FAILED \\] (.*) \\((.*)\\)$");
static QRegExp disabledTests(QStringLiteral("^ YOU HAVE (\\d+) DISABLED TESTS?$")); static QRegExp disabledTests("^ YOU HAVE (\\d+) DISABLED TESTS?$");
static QRegExp failureLocation(QStringLiteral("^(.*):(\\d+): Failure$")); static QRegExp failureLocation("^(.*):(\\d+): Failure$");
static QRegExp errorLocation(QStringLiteral("^(.*)\\((\\d+)\\): error:.*$")); static QRegExp errorLocation("^(.*)\\((\\d+)\\): error:.*$");
static QRegExp iterations(QStringLiteral("^Repeating all tests \\(iteration (\\d+)\\) . . .$")); static QRegExp iterations("^Repeating all tests \\(iteration (\\d+)\\) \\. \\. \\.$");
QByteArray read = outputLine; QByteArray read = outputLine;
if (!m_unprocessed.isEmpty()) { if (!m_unprocessed.isEmpty()) {
@@ -78,9 +78,12 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
m_iteration = iterations.cap(1).toInt(); m_iteration = iterations.cap(1).toInt();
m_description.clear(); m_description.clear();
} else if (line.startsWith(QStringLiteral("Note:"))) { } else if (line.startsWith(QStringLiteral("Note:"))) {
TestResultPtr testResult = TestResultPtr(new GTestResult()); m_description = line;
if (m_iteration > 1)
m_description.append(' ' + tr("(iteration %1)").arg(m_iteration));
TestResultPtr testResult = TestResultPtr(new GTestResult);
testResult->setResult(Result::MessageInternal); testResult->setResult(Result::MessageInternal);
testResult->setDescription(line); testResult->setDescription(m_description);
m_futureInterface.reportResult(testResult); m_futureInterface.reportResult(testResult);
m_description.clear(); m_description.clear();
} else if (disabledTests.exactMatch(line)) { } else if (disabledTests.exactMatch(line)) {
@@ -92,12 +95,11 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
m_futureInterface.reportResult(testResult); m_futureInterface.reportResult(testResult);
m_description.clear(); m_description.clear();
} }
return; //continue; return;
} }
if (testEnds.exactMatch(line)) { if (testEnds.exactMatch(line)) {
GTestResult *testResult = new GTestResult(m_currentTestName); GTestResult *testResult = createDefaultResult();
testResult->setTestSetName(m_currentTestSet);
testResult->setResult(Result::MessageTestCaseEnd); testResult->setResult(Result::MessageTestCaseEnd);
testResult->setDescription(tr("Test execution took %1").arg(testEnds.cap(2))); testResult->setDescription(tr("Test execution took %1").arg(testEnds.cap(2)));
m_futureInterface.reportResult(TestResultPtr(testResult)); m_futureInterface.reportResult(TestResultPtr(testResult));
@@ -105,13 +107,12 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
m_currentTestSet.clear(); m_currentTestSet.clear();
} else if (newTestStarts.exactMatch(line)) { } else if (newTestStarts.exactMatch(line)) {
m_currentTestName = newTestStarts.cap(1); m_currentTestName = newTestStarts.cap(1);
TestResultPtr testResult = TestResultPtr(new GTestResult(m_currentTestName)); TestResultPtr testResult = TestResultPtr(createDefaultResult());
testResult->setResult(Result::MessageTestCaseStart);
if (m_iteration > 1) { if (m_iteration > 1) {
testResult->setResult(Result::MessageTestCaseRepetition);
testResult->setDescription(tr("Repeating test case %1 (iteration %2)") testResult->setDescription(tr("Repeating test case %1 (iteration %2)")
.arg(m_currentTestName).arg(m_iteration)); .arg(m_currentTestName).arg(m_iteration));
} else { } else {
testResult->setResult(Result::MessageTestCaseStart);
testResult->setDescription(tr("Executing test case %1").arg(m_currentTestName)); testResult->setDescription(tr("Executing test case %1").arg(m_currentTestName));
} }
m_futureInterface.reportResult(testResult); m_futureInterface.reportResult(testResult);
@@ -123,21 +124,18 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
m_futureInterface.reportResult(testResult); m_futureInterface.reportResult(testResult);
m_description.clear(); m_description.clear();
} else if (testSetSuccess.exactMatch(line)) { } else if (testSetSuccess.exactMatch(line)) {
GTestResult *testResult = new GTestResult(m_currentTestName); GTestResult *testResult = createDefaultResult();
testResult->setTestSetName(m_currentTestSet);
testResult->setResult(Result::Pass); testResult->setResult(Result::Pass);
testResult->setDescription(m_description); testResult->setDescription(m_description);
m_futureInterface.reportResult(TestResultPtr(testResult)); m_futureInterface.reportResult(TestResultPtr(testResult));
m_description.clear(); m_description.clear();
testResult = new GTestResult(m_currentTestName); testResult = createDefaultResult();
testResult->setTestSetName(m_currentTestSet);
testResult->setResult(Result::MessageInternal); testResult->setResult(Result::MessageInternal);
testResult->setDescription(tr("Execution took %1.").arg(testSetSuccess.cap(2))); testResult->setDescription(tr("Execution took %1.").arg(testSetSuccess.cap(2)));
m_futureInterface.reportResult(TestResultPtr(testResult)); m_futureInterface.reportResult(TestResultPtr(testResult));
m_futureInterface.setProgressValue(m_futureInterface.progressValue() + 1); m_futureInterface.setProgressValue(m_futureInterface.progressValue() + 1);
} else if (testSetFail.exactMatch(line)) { } else if (testSetFail.exactMatch(line)) {
GTestResult *testResult = new GTestResult(m_currentTestName); GTestResult *testResult = createDefaultResult();
testResult->setTestSetName(m_currentTestSet);
testResult->setResult(Result::Fail); testResult->setResult(Result::Fail);
m_description.chop(1); m_description.chop(1);
testResult->setDescription(m_description); testResult->setDescription(m_description);
@@ -160,8 +158,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
} }
m_futureInterface.reportResult(TestResultPtr(testResult)); m_futureInterface.reportResult(TestResultPtr(testResult));
m_description.clear(); m_description.clear();
testResult = new GTestResult(m_currentTestName); testResult = createDefaultResult();
testResult->setTestSetName(m_currentTestSet);
testResult->setResult(Result::MessageInternal); testResult->setResult(Result::MessageInternal);
testResult->setDescription(tr("Execution took %1.").arg(testSetFail.cap(2))); testResult->setDescription(tr("Execution took %1.").arg(testSetFail.cap(2)));
m_futureInterface.reportResult(TestResultPtr(testResult)); m_futureInterface.reportResult(TestResultPtr(testResult));
@@ -169,5 +166,13 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine)
} }
} }
GTestResult *GTestOutputReader::createDefaultResult() const
{
GTestResult *result = new GTestResult(m_currentTestName);
result->setTestSetName(m_currentTestSet);
result->setIteration(m_iteration);
return result;
}
} // namespace Internal } // namespace Internal
} // namespace Autotest } // namespace Autotest

View File

@@ -32,6 +32,8 @@
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
class GTestResult;
class GTestOutputReader : public TestOutputReader class GTestOutputReader : public TestOutputReader
{ {
Q_DECLARE_TR_FUNCTIONS(Autotest::Internal::GTestOutputReader) Q_DECLARE_TR_FUNCTIONS(Autotest::Internal::GTestOutputReader)
@@ -44,11 +46,12 @@ protected:
void processOutput(const QByteArray &outputLine) override; void processOutput(const QByteArray &outputLine) override;
private: private:
GTestResult *createDefaultResult() const;
QString m_currentTestName; QString m_currentTestName;
QString m_currentTestSet; QString m_currentTestSet;
QString m_description; QString m_description;
QByteArray m_unprocessed; QByteArray m_unprocessed;
int m_iteration = 0; int m_iteration = 1;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -58,6 +58,8 @@ bool GTestResult::isDirectParentOf(const TestResult *other, bool *needsIntermedi
return false; return false;
const GTestResult *gtOther = static_cast<const GTestResult *>(other); const GTestResult *gtOther = static_cast<const GTestResult *>(other);
if (m_iteration != gtOther->m_iteration)
return false;
return isTest() && gtOther->isTestSet(); return isTest() && gtOther->isTestSet();
} }

View File

@@ -37,11 +37,13 @@ public:
const QString outputString(bool selected) const override; const QString outputString(bool selected) const override;
void setTestSetName(const QString &testSetName) { m_testSetName = testSetName; } void setTestSetName(const QString &testSetName) { m_testSetName = testSetName; }
void setIteration(int iteration) { m_iteration = iteration; }
bool isDirectParentOf(const TestResult *other, bool *needsIntermediate) const override; bool isDirectParentOf(const TestResult *other, bool *needsIntermediate) const override;
private: private:
bool isTest() const { return m_testSetName.isEmpty(); } bool isTest() const { return m_testSetName.isEmpty(); }
bool isTestSet() const { return !m_testSetName.isEmpty(); } bool isTestSet() const { return !m_testSetName.isEmpty(); }
QString m_testSetName; QString m_testSetName;
int m_iteration = 1;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -58,7 +58,6 @@ enum Type {
MessageTestCaseWarn, MessageTestCaseWarn,
MessageTestCaseFail, MessageTestCaseFail,
MessageTestCaseEnd, MessageTestCaseEnd,
MessageTestCaseRepetition,
MessageIntermediate, MessageIntermediate,
MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest, MessageCurrentTest, INTERNAL_MESSAGES_END = MessageCurrentTest,

View File

@@ -342,7 +342,7 @@ void TestResultFilterModel::enableAllResultTypes()
<< Result::MessageCurrentTest << Result::MessageTestCaseStart << Result::MessageCurrentTest << Result::MessageTestCaseStart
<< Result::MessageTestCaseSuccess << Result::MessageTestCaseWarn << Result::MessageTestCaseSuccess << Result::MessageTestCaseWarn
<< Result::MessageTestCaseFail << Result::MessageTestCaseEnd << Result::MessageTestCaseFail << Result::MessageTestCaseEnd
<< Result::MessageTestCaseRepetition << Result::MessageInfo << Result::MessageSystem; << Result::MessageInfo << Result::MessageSystem;
invalidateFilter(); invalidateFilter();
} }