summaryrefslogtreecommitdiffstats
path: root/src/testlib/qjunittestlogger.cpp
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-08 16:34:19 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-10 22:19:45 +0200
commitb8191f41c65a908d0529d235b0200e6de99c34fb (patch)
tree59d750687ba5896cd4638780bb32193a5f563961 /src/testlib/qjunittestlogger.cpp
parent4e0082a9cacfdfd0c43e6105274bc0d41dd18801 (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.cpp40
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