summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-01-13 11:21:01 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-01-15 18:05:40 +0100
commit539553a57216c4ece292ff54fb623807c334cdb6 (patch)
tree55c4c80b5fe764717dbe32169dd1906a5cf6bcb5 /src/testlib
parent7f5d41e286e043c5f3061e2eb5a0128102a38c80 (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.cpp40
-rw-r--r--src/testlib/qjunittestlogger_p.h3
-rw-r--r--src/testlib/qtestcoreelement_p.h3
-rw-r--r--src/testlib/qtestelementattribute_p.h5
-rw-r--r--src/testlib/qtestjunitstreamer.cpp34
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;
}