diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-01-13 11:21:01 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-01-15 18:05:40 +0100 |
commit | 539553a57216c4ece292ff54fb623807c334cdb6 (patch) | |
tree | 55c4c80b5fe764717dbe32169dd1906a5cf6bcb5 /src/testlib | |
parent | 7f5d41e286e043c5f3061e2eb5a0128102a38c80 (diff) |
QTestlib/JUnit XML: Log most messages to standard output instead of error output
Add an enumeration for system-out and alog element
for it. Redirect the messages types that are not warnings/errors
to this element. For compatibility, write it out only
if it is not empty. Rename enumerations and members accordingly.
[ChangeLog][QtTestLib] In JUnit XML, output that is
not a warning/error is now logged under <system-out>
instead of <system-err>.
Fixes: QTBUG-86540
Change-Id: I55598eafa7dafa486ac5a8221029c332ff47413b
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/testlib')
-rw-r--r-- | src/testlib/qjunittestlogger.cpp | 40 | ||||
-rw-r--r-- | src/testlib/qjunittestlogger_p.h | 3 | ||||
-rw-r--r-- | src/testlib/qtestcoreelement_p.h | 3 | ||||
-rw-r--r-- | src/testlib/qtestelementattribute_p.h | 5 | ||||
-rw-r--r-- | src/testlib/qtestjunitstreamer.cpp | 34 |
5 files changed, 54 insertions, 31 deletions
diff --git a/src/testlib/qjunittestlogger.cpp b/src/testlib/qjunittestlogger.cpp index bba1c777c5..147777f77c 100644 --- a/src/testlib/qjunittestlogger.cpp +++ b/src/testlib/qjunittestlogger.cpp @@ -74,8 +74,10 @@ void QJUnitTestLogger::startLogging() QAbstractTestLogger::startLogging(); logFormatter = new QTestJUnitStreamer(this); - delete errorLogElement; - errorLogElement = new QTestElement(QTest::LET_SystemError); + delete systemOutputElement; + systemOutputElement = new QTestElement(QTest::LET_SystemOutput); + delete systemErrorElement; + systemErrorElement = new QTestElement(QTest::LET_SystemError); Q_ASSERT(!currentTestSuite); currentTestSuite = new QTestElement(QTest::LET_TestSuite); @@ -132,7 +134,9 @@ void QJUnitTestLogger::stopLogging() testcase = testcase->nextElement(); } - currentTestSuite->addLogElement(errorLogElement); + if (systemOutputElement->childElements()) + currentTestSuite->addLogElement(systemOutputElement); + currentTestSuite->addLogElement(systemErrorElement); logFormatter->output(currentTestSuite); @@ -305,11 +309,13 @@ void QJUnitTestLogger::addTag(QTestElement* element) void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, const char *file, int line) { - QTestElement *errorElement = new QTestElement(QTest::LET_Error); + auto messageElement = new QTestElement(QTest::LET_Message); + auto systemLogElement = systemOutputElement; const char *typeBuf = nullptr; switch (type) { case QAbstractTestLogger::Warn: + systemLogElement = systemErrorElement; typeBuf = "warn"; break; case QAbstractTestLogger::QSystem: @@ -322,9 +328,11 @@ void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, con typeBuf = "qinfo"; break; case QAbstractTestLogger::QWarning: + systemLogElement = systemErrorElement; typeBuf = "qwarn"; break; case QAbstractTestLogger::QFatal: + systemLogElement = systemErrorElement; typeBuf = "qfatal"; break; case QAbstractTestLogger::Skip: @@ -338,27 +346,27 @@ void QJUnitTestLogger::addMessage(MessageTypes type, const QString &message, con break; } - errorElement->addAttribute(QTest::AI_Type, typeBuf); - errorElement->addAttribute(QTest::AI_Description, message.toUtf8().constData()); - addTag(errorElement); + messageElement->addAttribute(QTest::AI_Type, typeBuf); + messageElement->addAttribute(QTest::AI_Description, message.toUtf8().constData()); + addTag(messageElement); if (file) - errorElement->addAttribute(QTest::AI_File, file); + messageElement->addAttribute(QTest::AI_File, file); else - errorElement->addAttribute(QTest::AI_File, ""); + messageElement->addAttribute(QTest::AI_File, ""); char buf[100]; qsnprintf(buf, sizeof(buf), "%i", line); - errorElement->addAttribute(QTest::AI_Line, buf); + messageElement->addAttribute(QTest::AI_Line, buf); - currentLogElement->addLogElement(errorElement); + currentLogElement->addLogElement(messageElement); ++errorCounter; - // Also add the message to the system error log (i.e. stderr), if one exists - if (errorLogElement) { - QTestElement *systemErrorElement = new QTestElement(QTest::LET_Error); - systemErrorElement->addAttribute(QTest::AI_Description, message.toUtf8().constData()); - errorLogElement->addLogElement(systemErrorElement); + // Also add the message to the system log (stdout/stderr), if one exists + if (systemLogElement) { + auto messageElement = new QTestElement(QTest::LET_Message); + messageElement->addAttribute(QTest::AI_Description, message.toUtf8().constData()); + systemLogElement->addLogElement(messageElement); } } diff --git a/src/testlib/qjunittestlogger_p.h b/src/testlib/qjunittestlogger_p.h index 2784f00dd4..0be9e8aeb0 100644 --- a/src/testlib/qjunittestlogger_p.h +++ b/src/testlib/qjunittestlogger_p.h @@ -82,7 +82,8 @@ class QJUnitTestLogger : public QAbstractTestLogger QTestElement *currentTestSuite = nullptr; QTestElement *listOfTestcases = nullptr; QTestElement *currentLogElement = nullptr; - QTestElement *errorLogElement = nullptr; + QTestElement *systemOutputElement = nullptr; + QTestElement *systemErrorElement = nullptr; QTestJUnitStreamer *logFormatter = nullptr; int testCounter = 0; diff --git a/src/testlib/qtestcoreelement_p.h b/src/testlib/qtestcoreelement_p.h index a101ab5ea3..4eb7361a5c 100644 --- a/src/testlib/qtestcoreelement_p.h +++ b/src/testlib/qtestcoreelement_p.h @@ -139,7 +139,8 @@ const char *QTestCoreElement<ElementType>::elementName() const "testcase", "testsuite", "benchmark", - "system-err" + "system-err", + "system-out" }; if (type != QTest::LET_Undefined) diff --git a/src/testlib/qtestelementattribute_p.h b/src/testlib/qtestelementattribute_p.h index 4f899c3a80..523dd7435e 100644 --- a/src/testlib/qtestelementattribute_p.h +++ b/src/testlib/qtestelementattribute_p.h @@ -87,11 +87,12 @@ namespace QTest { LET_Property = 0, LET_Properties = 1, LET_Failure = 2, - LET_Error = 3, + LET_Message = 3, LET_TestCase = 4, LET_TestSuite = 5, LET_Benchmark = 6, - LET_SystemError = 7 + LET_SystemError = 7, + LET_SystemOutput = 8 }; } diff --git a/src/testlib/qtestjunitstreamer.cpp b/src/testlib/qtestjunitstreamer.cpp index 844f80f90c..28879c6e06 100644 --- a/src/testlib/qtestjunitstreamer.cpp +++ b/src/testlib/qtestjunitstreamer.cpp @@ -82,12 +82,17 @@ void QTestJUnitStreamer::formatStart(const QTestElement *element, QTestCharBuffe char indent[20]; indentForElement(element, indent, sizeof(indent)); - // Errors are written as CDATA within system-err, comments elsewhere - if (element->elementType() == QTest::LET_Error) { - if (element->parentElement()->elementType() == QTest::LET_SystemError) { + // Messages/errors are written as CDATA within system-out, system-err, + // respectively, comments elsewhere + if (element->elementType() == QTest::LET_Message) { + switch (element->parentElement()->elementType()) { + case QTest::LET_SystemOutput: + case QTest::LET_SystemError: QTest::qt_asprintf(formatted, "<![CDATA["); - } else { + break; + default: QTest::qt_asprintf(formatted, "%s<!--", indent); + break; } return; } @@ -118,9 +123,11 @@ void QTestJUnitStreamer::formatAttributes(const QTestElement* element, const QTe QTest::AttributeIndex attrindex = attribute->index(); - // For errors within system-err, we only want to output `message' - if (element && element->elementType() == QTest::LET_Error - && element->parentElement()->elementType() == QTest::LET_SystemError) { + // For messages/errors within system-out, system-err, respectively, + // we only want to output `message' + if (element && element->elementType() == QTest::LET_Message + && (element->parentElement()->elementType() == QTest::LET_SystemOutput + || element->parentElement()->elementType() == QTest::LET_SystemError)) { if (attrindex != QTest::AI_Description) return; @@ -148,12 +155,17 @@ void QTestJUnitStreamer::formatAfterAttributes(const QTestElement *element, QTes if (!element || !formatted ) return; - // Errors are written as CDATA within system-err, comments elsewhere - if (element->elementType() == QTest::LET_Error) { - if (element->parentElement()->elementType() == QTest::LET_SystemError) { + // Messages/errors are written as CDATA within system-out, system-err, + // respectively, comments elsewhere + if (element->elementType() == QTest::LET_Message) { + switch (element->parentElement()->elementType()) { + case QTest::LET_SystemOutput: + case QTest::LET_SystemError: QTest::qt_asprintf(formatted, "]]>\n"); - } else { + break; + default: QTest::qt_asprintf(formatted, " -->\n"); + break; } return; } |