From 625129d29c38c8902a3f654d58da9d4cb1a5a712 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 27 Jun 2017 15:15:43 +0200 Subject: [PATCH] AutoTest: Fix appending test results with the same name If two test cases had the same name but came from a different executable the results pane still might have shown any later one (badly) cascaded inside the first one. Avoid this by providing an additional unique information (the respective executable for the test case) Task-number: QTCREATORBUG-18502 Change-Id: Ib071e389758b6269a9a90cc4c4afbcf86ca583ac Reviewed-by: David Schulz --- src/plugins/autotest/gtest/gtestoutputreader.cpp | 7 ++++--- src/plugins/autotest/gtest/gtestoutputreader.h | 1 + src/plugins/autotest/gtest/gtestresult.cpp | 5 +++++ src/plugins/autotest/gtest/gtestresult.h | 1 + src/plugins/autotest/qtest/qttestoutputreader.cpp | 3 ++- src/plugins/autotest/qtest/qttestoutputreader.h | 1 + src/plugins/autotest/qtest/qttestresult.cpp | 9 +++++++-- src/plugins/autotest/qtest/qttestresult.h | 1 + src/plugins/autotest/testresult.cpp | 14 +++++++++++--- src/plugins/autotest/testresult.h | 5 ++++- src/plugins/autotest/testresultmodel.cpp | 4 +++- 11 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/plugins/autotest/gtest/gtestoutputreader.cpp b/src/plugins/autotest/gtest/gtestoutputreader.cpp index 96382f5f896..a455282476c 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.cpp +++ b/src/plugins/autotest/gtest/gtestoutputreader.cpp @@ -41,6 +41,7 @@ static QString constructSourceFilePath(const QString &path, const QString &fileP GTestOutputReader::GTestOutputReader(const QFutureInterface &futureInterface, QProcess *testApplication, const QString &buildDirectory) : TestOutputReader(futureInterface, testApplication, buildDirectory) + , m_executable(testApplication ? testApplication->program() : QString()) { } @@ -75,7 +76,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine) m_futureInterface.reportResult(testResult); m_description.clear(); } else if (disabledTests.exactMatch(line)) { - TestResultPtr testResult = TestResultPtr(new GTestResult()); + TestResultPtr testResult = TestResultPtr(new GTestResult); testResult->setResult(Result::MessageDisabledTests); int disabled = disabledTests.cap(1).toInt(); testResult->setDescription(tr("You have %n disabled test(s).", 0, disabled)); @@ -106,7 +107,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine) m_futureInterface.reportResult(testResult); } else if (newTestSetStarts.exactMatch(line)) { m_currentTestSet = newTestSetStarts.cap(1); - TestResultPtr testResult = TestResultPtr(new GTestResult()); + TestResultPtr testResult = TestResultPtr(new GTestResult); testResult->setResult(Result::MessageCurrentTest); testResult->setDescription(tr("Entering test set %1").arg(m_currentTestSet)); m_futureInterface.reportResult(testResult); @@ -156,7 +157,7 @@ void GTestOutputReader::processOutput(const QByteArray &outputLine) GTestResult *GTestOutputReader::createDefaultResult() const { - GTestResult *result = new GTestResult(m_currentTestName); + GTestResult *result = new GTestResult(m_executable, m_currentTestName); result->setTestSetName(m_currentTestSet); result->setIteration(m_iteration); return result; diff --git a/src/plugins/autotest/gtest/gtestoutputreader.h b/src/plugins/autotest/gtest/gtestoutputreader.h index 0ed2bf878cb..5cedffed006 100644 --- a/src/plugins/autotest/gtest/gtestoutputreader.h +++ b/src/plugins/autotest/gtest/gtestoutputreader.h @@ -47,6 +47,7 @@ protected: private: GTestResult *createDefaultResult() const; + QString m_executable; QString m_currentTestName; QString m_currentTestSet; QString m_description; diff --git a/src/plugins/autotest/gtest/gtestresult.cpp b/src/plugins/autotest/gtest/gtestresult.cpp index 604f5cedaac..cbccaea837e 100644 --- a/src/plugins/autotest/gtest/gtestresult.cpp +++ b/src/plugins/autotest/gtest/gtestresult.cpp @@ -33,6 +33,11 @@ GTestResult::GTestResult(const QString &name) { } +GTestResult::GTestResult(const QString &executable, const QString &name) + : TestResult(executable, name) +{ +} + const QString GTestResult::outputString(bool selected) const { const QString &desc = description(); diff --git a/src/plugins/autotest/gtest/gtestresult.h b/src/plugins/autotest/gtest/gtestresult.h index 74a8e1e9c3b..491fe41662f 100644 --- a/src/plugins/autotest/gtest/gtestresult.h +++ b/src/plugins/autotest/gtest/gtestresult.h @@ -34,6 +34,7 @@ class GTestResult : public TestResult { public: explicit GTestResult(const QString &name = QString()); + GTestResult(const QString &executable, const QString &name); const QString outputString(bool selected) const override; void setTestSetName(const QString &testSetName) { m_testSetName = testSetName; } diff --git a/src/plugins/autotest/qtest/qttestoutputreader.cpp b/src/plugins/autotest/qtest/qttestoutputreader.cpp index e7c7725d02e..d1999bba395 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.cpp +++ b/src/plugins/autotest/qtest/qttestoutputreader.cpp @@ -132,6 +132,7 @@ QtTestOutputReader::QtTestOutputReader(const QFutureInterface &fu QProcess *testApplication, const QString &buildDirectory, OutputMode mode) : TestOutputReader(futureInterface, testApplication, buildDirectory) + , m_executable(testApplication ? testApplication->program() : QString()) , m_mode(mode) { } @@ -419,7 +420,7 @@ void QtTestOutputReader::processSummaryFinishOutput() QtTestResult *QtTestOutputReader::createDefaultResult() const { - QtTestResult *result = new QtTestResult(m_className); + QtTestResult *result = new QtTestResult(m_executable, m_className); result->setFunctionName(m_testCase); result->setDataTag(m_dataTag); return result; diff --git a/src/plugins/autotest/qtest/qttestoutputreader.h b/src/plugins/autotest/qtest/qttestoutputreader.h index 28305160642..75f0b9a42ea 100644 --- a/src/plugins/autotest/qtest/qttestoutputreader.h +++ b/src/plugins/autotest/qtest/qttestoutputreader.h @@ -78,6 +78,7 @@ private: }; CDATAMode m_cdataMode = None; + QString m_executable; QString m_className; QString m_testCase; QString m_formerTestCase; diff --git a/src/plugins/autotest/qtest/qttestresult.cpp b/src/plugins/autotest/qtest/qttestresult.cpp index 50d64d72901..68c9f2bf3f3 100644 --- a/src/plugins/autotest/qtest/qttestresult.cpp +++ b/src/plugins/autotest/qtest/qttestresult.cpp @@ -35,6 +35,11 @@ QtTestResult::QtTestResult(const QString &className) { } +QtTestResult::QtTestResult(const QString &executable, const QString &className) + : TestResult(executable, className) +{ +} + const QString QtTestResult::outputString(bool selected) const { const QString &desc = description(); @@ -101,14 +106,14 @@ bool QtTestResult::isIntermediateFor(const TestResult *other) const QTC_ASSERT(other, return false); const QtTestResult *qtOther = static_cast(other); return m_dataTag == qtOther->m_dataTag && m_function == qtOther->m_function - && name() == qtOther->name(); + && name() == qtOther->name() && executable() == qtOther->executable(); } TestResult *QtTestResult::createIntermediateResultFor(const TestResult *other) { QTC_ASSERT(other, return nullptr); const QtTestResult *qtOther = static_cast(other); - QtTestResult *intermediate = new QtTestResult(qtOther->name()); + QtTestResult *intermediate = new QtTestResult(qtOther->executable(), qtOther->name()); intermediate->m_function = qtOther->m_function; intermediate->m_dataTag = qtOther->m_dataTag; // intermediates will be needed only for data tags diff --git a/src/plugins/autotest/qtest/qttestresult.h b/src/plugins/autotest/qtest/qttestresult.h index 216b6ef3327..c7c9e8ae2a9 100644 --- a/src/plugins/autotest/qtest/qttestresult.h +++ b/src/plugins/autotest/qtest/qttestresult.h @@ -34,6 +34,7 @@ class QtTestResult : public TestResult { public: explicit QtTestResult(const QString &className = QString()); + QtTestResult(const QString &executable, const QString &className); const QString outputString(bool selected) const override; void setFunctionName(const QString &functionName) { m_function = functionName; } diff --git a/src/plugins/autotest/testresult.cpp b/src/plugins/autotest/testresult.cpp index bfef7164034..fce6f05c856 100644 --- a/src/plugins/autotest/testresult.cpp +++ b/src/plugins/autotest/testresult.cpp @@ -47,6 +47,12 @@ TestResult::TestResult(const QString &name) { } +TestResult::TestResult(const QString &executable, const QString &name) + : m_executable(executable) + , m_name(name) +{ +} + const QString TestResult::outputString(bool selected) const { return selected ? m_description : m_description.split('\n').first(); @@ -173,19 +179,21 @@ bool TestResult::isMessageCaseStart(const Result::Type type) bool TestResult::isDirectParentOf(const TestResult *other, bool * /*needsIntermediate*/) const { QTC_ASSERT(other, return false); - return m_name == other->m_name; + return !m_executable.isEmpty() && m_executable == other->m_executable + && m_name == other->m_name; } bool TestResult::isIntermediateFor(const TestResult *other) const { QTC_ASSERT(other, return false); - return m_name == other->m_name; + return !m_executable.isEmpty() && m_executable == other->m_executable + && m_name == other->m_name; } TestResult *TestResult::createIntermediateResultFor(const TestResult *other) { QTC_ASSERT(other, return nullptr); - TestResult *intermediate = new TestResult(other->m_name); + TestResult *intermediate = new TestResult(other->m_executable, other->m_name); return intermediate; } diff --git a/src/plugins/autotest/testresult.h b/src/plugins/autotest/testresult.h index e53e6fcce41..267b7be4196 100644 --- a/src/plugins/autotest/testresult.h +++ b/src/plugins/autotest/testresult.h @@ -69,12 +69,14 @@ enum Type { class TestResult { public: - explicit TestResult(); + TestResult(); explicit TestResult(const QString &name); + TestResult(const QString &executable, const QString &name); virtual ~TestResult() {} virtual const QString outputString(bool selected) const; + QString executable() const { return m_executable; } QString name() const { return m_name; } Result::Type result() const { return m_result; } QString description() const { return m_description; } @@ -97,6 +99,7 @@ public: virtual TestResult *createIntermediateResultFor(const TestResult *other); private: + QString m_executable; QString m_name; Result::Type m_result = Result::Invalid; QString m_description; diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index 3bfdba93573..ec996f1b353 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -295,11 +295,13 @@ TestResultItem *TestResultModel::findParentItemFor(const TestResultItem *item, TestResultItem *root = startItem ? const_cast(startItem) : nullptr; const TestResult *result = item->testResult(); const QString &name = result->name(); + const QString &executable = result->executable(); if (root == nullptr && !name.isEmpty()) { for (int row = rootItem()->childCount() - 1; row >= 0; --row) { TestResultItem *tmp = static_cast(rootItem()->childAt(row)); - if (tmp->testResult()->name() == name) { + auto tmpTestResult = tmp->testResult(); + if (tmpTestResult->executable() == executable && tmpTestResult->name() == name) { root = tmp; break; }