From 6f2fb55ea115b89ed6b89488220af8467b80f8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 21 Jul 2020 12:04:44 +0200 Subject: [PATCH] testlib: Track current test suite in JUnit test logger Instead of deferring the creation of the test suite until logging stops, we create it up front, matching the logic of adding test elements on test function enter. Change-Id: I78b1ccdfde5493d78ef478d4b3c45d5a49358979 Reviewed-by: Volker Hilsheimer --- src/testlib/qjunittestlogger.cpp | 58 +++++++++++++++++--------------- src/testlib/qjunittestlogger_p.h | 1 + 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/testlib/qjunittestlogger.cpp b/src/testlib/qjunittestlogger.cpp index 2d71f7967b..62cbac4164 100644 --- a/src/testlib/qjunittestlogger.cpp +++ b/src/testlib/qjunittestlogger.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #ifdef min // windows.h without NOMINMAX is included by the benchmark headers. # undef min @@ -64,7 +65,7 @@ QJUnitTestLogger::QJUnitTestLogger(const char *filename) QJUnitTestLogger::~QJUnitTestLogger() { - delete currentLogElement; + Q_ASSERT(!currentTestSuite); delete logFormatter; } @@ -75,25 +76,10 @@ void QJUnitTestLogger::startLogging() logFormatter = new QTestJUnitStreamer(this); delete errorLogElement; errorLogElement = new QTestElement(QTest::LET_SystemError); -} -void QJUnitTestLogger::stopLogging() -{ - QTestElement *iterator = listOfTestcases; - - char buf[10]; - - currentLogElement = new QTestElement(QTest::LET_TestSuite); - currentLogElement->addAttribute(QTest::AI_Name, QTestResult::currentTestObjectName()); - - qsnprintf(buf, sizeof(buf), "%i", testCounter); - currentLogElement->addAttribute(QTest::AI_Tests, buf); - - qsnprintf(buf, sizeof(buf), "%i", failureCounter); - currentLogElement->addAttribute(QTest::AI_Failures, buf); - - qsnprintf(buf, sizeof(buf), "%i", errorCounter); - currentLogElement->addAttribute(QTest::AI_Errors, buf); + Q_ASSERT(!currentTestSuite); + currentTestSuite = new QTestElement(QTest::LET_TestSuite); + currentTestSuite->addAttribute(QTest::AI_Name, QTestResult::currentTestObjectName()); QTestElement *property; QTestElement *properties = new QTestElement(QTest::LET_Properties); @@ -113,21 +99,37 @@ void QJUnitTestLogger::stopLogging() property->addAttribute(QTest::AI_PropertyValue, QLibraryInfo::build()); properties->addLogElement(property); - currentLogElement->addLogElement(properties); + currentTestSuite->addLogElement(properties); +} - currentLogElement->addLogElement(iterator); +void QJUnitTestLogger::stopLogging() +{ + char buf[10]; - /* For correct indenting, make sure every testcase knows its parent */ - QTestElement* testcase = iterator; + qsnprintf(buf, sizeof(buf), "%i", testCounter); + currentTestSuite->addAttribute(QTest::AI_Tests, buf); + + qsnprintf(buf, sizeof(buf), "%i", failureCounter); + currentTestSuite->addAttribute(QTest::AI_Failures, buf); + + qsnprintf(buf, sizeof(buf), "%i", errorCounter); + currentTestSuite->addAttribute(QTest::AI_Errors, buf); + + currentTestSuite->addLogElement(listOfTestcases); + + // For correct indenting, make sure every testcase knows its parent + QTestElement *testcase = listOfTestcases; while (testcase) { - testcase->setParent(currentLogElement); + testcase->setParent(currentTestSuite); testcase = testcase->nextElement(); } - currentLogElement->addLogElement(errorLogElement); + currentTestSuite->addLogElement(errorLogElement); - QTestElement *it = currentLogElement; - logFormatter->output(it); + logFormatter->output(currentTestSuite); + + delete currentTestSuite; + currentTestSuite = nullptr; QAbstractTestLogger::stopLogging(); } @@ -138,6 +140,8 @@ void QJUnitTestLogger::enterTestFunction(const char *function) currentLogElement->addAttribute(QTest::AI_Name, function); currentLogElement->addToList(&listOfTestcases); + // The element will be deleted when the suite is deleted + ++testCounter; } diff --git a/src/testlib/qjunittestlogger_p.h b/src/testlib/qjunittestlogger_p.h index 6fd4e4c331..2784f00dd4 100644 --- a/src/testlib/qjunittestlogger_p.h +++ b/src/testlib/qjunittestlogger_p.h @@ -79,6 +79,7 @@ class QJUnitTestLogger : public QAbstractTestLogger const char *file = nullptr, int line = 0) override; private: + QTestElement *currentTestSuite = nullptr; QTestElement *listOfTestcases = nullptr; QTestElement *currentLogElement = nullptr; QTestElement *errorLogElement = nullptr;