diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-08 16:34:19 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-10 22:19:45 +0200 |
commit | b8191f41c65a908d0529d235b0200e6de99c34fb (patch) | |
tree | 59d750687ba5896cd4638780bb32193a5f563961 /src/testlib/qjunittestlogger.cpp | |
parent | 4e0082a9cacfdfd0c43e6105274bc0d41dd18801 (diff) |
testlib: Replace custom QTestCoreList with std::vector
The custom linked list implementation was implemented using
recursion, and as a result didn't handle long lists of test
cases, exhausting the stack on e.g. Windows where the default
stack is only 1MB. This was the case with e.g. the tst_QChar
test that produces 20K test cases.
Replacing with a std::vector should do nicely for our use-case.
No attempt has been made at further reducing the complexity
of QTestElement/QTestCoreElement/QTestElementAttribute.
Pick-to: 6.2
Change-Id: Ie295f7cf937ec6abdc4606b6120818551ad285c7
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/testlib/qjunittestlogger.cpp')
-rw-r--r-- | src/testlib/qjunittestlogger.cpp | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/src/testlib/qjunittestlogger.cpp b/src/testlib/qjunittestlogger.cpp index 4b5de7b7c0..bc9d8f4df3 100644 --- a/src/testlib/qjunittestlogger.cpp +++ b/src/testlib/qjunittestlogger.cpp @@ -105,19 +105,19 @@ void QJUnitTestLogger::startLogging() property = new QTestElement(QTest::LET_Property); property->addAttribute(QTest::AI_Name, "QTestVersion"); property->addAttribute(QTest::AI_PropertyValue, QTEST_VERSION_STR); - properties->addLogElement(property); + properties->addChild(property); property = new QTestElement(QTest::LET_Property); property->addAttribute(QTest::AI_Name, "QtVersion"); property->addAttribute(QTest::AI_PropertyValue, qVersion()); - properties->addLogElement(property); + properties->addChild(property); property = new QTestElement(QTest::LET_Property); property->addAttribute(QTest::AI_Name, "QtBuild"); property->addAttribute(QTest::AI_PropertyValue, QLibraryInfo::build()); - properties->addLogElement(property); + properties->addChild(property); - currentTestSuite->addLogElement(properties); + currentTestSuite->addChild(properties); elapsedTestcaseTime.start(); } @@ -141,14 +141,9 @@ void QJUnitTestLogger::stopLogging() currentTestSuite->addAttribute(QTest::AI_Time, toSecondsFormat(QTestLog::msecsTotalTime()).constData()); - currentTestSuite->addLogElement(listOfTestcases); - - // For correct indenting, make sure every testcase knows its parent - QTestElement *testcase = listOfTestcases; - while (testcase) { - testcase->setParent(currentTestSuite); - testcase = testcase->nextElement(); - } + for (auto *testCase : listOfTestcases) + currentTestSuite->addChild(testCase); + listOfTestcases.clear(); logFormatter->output(currentTestSuite); @@ -168,7 +163,7 @@ void QJUnitTestLogger::enterTestCase(const char *name) currentTestCase = new QTestElement(QTest::LET_TestCase); currentTestCase->addAttribute(QTest::AI_Name, name); currentTestCase->addAttribute(QTest::AI_Classname, QTestResult::currentTestObjectName()); - currentTestCase->addToList(&listOfTestcases); + listOfTestcases.push_back(currentTestCase); Q_ASSERT(!systemOutputElement && !systemErrorElement); systemOutputElement = new QTestElement(QTest::LET_SystemOutput); @@ -212,13 +207,13 @@ void QJUnitTestLogger::leaveTestCase() currentTestCase->addAttribute(QTest::AI_Time, toSecondsFormat(elapsedTestCaseSeconds()).constData()); - if (systemOutputElement->childElements()) - currentTestCase->addLogElement(systemOutputElement); + if (!systemOutputElement->childElements().empty()) + currentTestCase->addChild(systemOutputElement); else delete systemOutputElement; - if (systemErrorElement->childElements()) - currentTestCase->addLogElement(systemErrorElement); + if (!systemErrorElement->childElements().empty()) + currentTestCase->addChild(systemErrorElement); else delete systemErrorElement; @@ -252,8 +247,7 @@ void QJUnitTestLogger::addFailure(QTest::LogElementType elementType, if (elementType == QTest::LET_Failure) { // Make sure we're not adding failure when we already have error, // or adding additional failures when we already have a failure. - for (auto *childElement = currentTestCase->childElements(); - childElement; childElement = childElement->nextElement()) { + for (auto *childElement : currentTestCase->childElements()) { if (childElement->elementType() == QTest::LET_Error || childElement->elementType() == QTest::LET_Failure) return; @@ -272,10 +266,10 @@ void QJUnitTestLogger::addFailure(QTest::LogElementType elementType, if (!details.isEmpty()) { auto textNode = new QTestElement(QTest::LET_Text); textNode->addAttribute(QTest::AI_Value, details.toUtf8().constData()); - failureElement->addLogElement(textNode); + failureElement->addChild(textNode); } - currentTestCase->addLogElement(failureElement); + currentTestCase->addChild(failureElement); switch (elementType) { case QTest::LET_Failure: ++failureCounter; break; @@ -292,7 +286,7 @@ void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, con if (type == QAbstractTestLogger::Skip) { auto skippedElement = new QTestElement(QTest::LET_Skipped); skippedElement->addAttribute(QTest::AI_Message, message.toUtf8().constData()); - currentTestCase->addLogElement(skippedElement); + currentTestCase->addChild(skippedElement); return; } else if (type == QAbstractTestLogger::QFatal) { addFailure(QTest::LET_Error, "qfatal", message); @@ -316,7 +310,7 @@ void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, con auto textNode = new QTestElement(QTest::LET_Text); textNode->addAttribute(QTest::AI_Value, message.toUtf8().constData()); - systemLogElement->addLogElement(textNode); + systemLogElement->addChild(textNode); } QT_END_NAMESPACE |