From 56335c9891230de3b87d401110b83656381729ac Mon Sep 17 00:00:00 2001 From: Rohan McGovern Date: Thu, 7 May 2009 14:09:08 +1000 Subject: Fixed qDebugs within tests being written as "error" tags in the xunitxml testlog. `error' in xunit causes many xunit processing tools to consider the test as failing. This is different semantics from native testlib XML, where a qDebug is considered a message and not a failure. Change it to put qDebugs under the "system-err" tag when using xunitxml to retain semantic compatibility with testlib XML. Autotest: tst_selftests --- src/testlib/qtestbasicstreamer.cpp | 8 +++--- src/testlib/qtestbasicstreamer.h | 4 +-- src/testlib/qtestcoreelement.h | 3 ++- src/testlib/qtestelementattribute.h | 3 ++- src/testlib/qtestlogger.cpp | 13 +++++++++- src/testlib/qtestlogger_p.h | 1 + src/testlib/qtestxunitstreamer.cpp | 44 +++++++++++++++++++++++++++----- src/testlib/qtestxunitstreamer.h | 2 +- src/testlib/qxmltestlogger.cpp | 4 +++ tests/auto/selftests/expected_xunit.txt | 11 +++++--- tests/auto/selftests/xunit/tst_xunit.cpp | 2 +- 11 files changed, 75 insertions(+), 20 deletions(-) diff --git a/src/testlib/qtestbasicstreamer.cpp b/src/testlib/qtestbasicstreamer.cpp index b133aae..35574d5 100644 --- a/src/testlib/qtestbasicstreamer.cpp +++ b/src/testlib/qtestbasicstreamer.cpp @@ -55,7 +55,7 @@ void QTestBasicStreamer::formatAfterAttributes(const QTestElement *element, char QTest::qt_snprintf(formatted, 10, ""); } -void QTestBasicStreamer::formatAttributes(const QTestElementAttribute *attribute, char *formatted) const +void QTestBasicStreamer::formatAttributes(const QTestElement *, const QTestElementAttribute *attribute, char *formatted) const { if(!attribute || !formatted ) return; @@ -90,7 +90,7 @@ void QTestBasicStreamer::outputElements(QTestElement *element, bool) const formatBeforeAttributes(element, buf); outputString(buf); - outputElementAttributes(element->attributes()); + outputElementAttributes(element, element->attributes()); formatAfterAttributes(element, buf); outputString(buf); @@ -105,11 +105,11 @@ void QTestBasicStreamer::outputElements(QTestElement *element, bool) const } } -void QTestBasicStreamer::outputElementAttributes(QTestElementAttribute *attribute) const +void QTestBasicStreamer::outputElementAttributes(const QTestElement* element, QTestElementAttribute *attribute) const { char buf[1024]; while(attribute){ - formatAttributes(attribute, buf); + formatAttributes(element, attribute, buf); outputString(buf); attribute = attribute->nextElement(); } diff --git a/src/testlib/qtestbasicstreamer.h b/src/testlib/qtestbasicstreamer.h index cfd6b94..5a6b0b6 100644 --- a/src/testlib/qtestbasicstreamer.h +++ b/src/testlib/qtestbasicstreamer.h @@ -30,9 +30,9 @@ class QTestBasicStreamer virtual void formatEnd(const QTestElement *element = 0, char *formatted = 0) const; virtual void formatBeforeAttributes(const QTestElement *element = 0, char *formatted = 0) const; virtual void formatAfterAttributes(const QTestElement *element = 0, char *formatted = 0) const; - virtual void formatAttributes(const QTestElementAttribute *attribute = 0, char *formatted = 0) const; + virtual void formatAttributes(const QTestElement *element = 0, const QTestElementAttribute *attribute = 0, char *formatted = 0) const; virtual void outputElements(QTestElement *element, bool isChildElement = false) const; - virtual void outputElementAttributes(QTestElementAttribute *attribute) const; + virtual void outputElementAttributes(const QTestElement *element, QTestElementAttribute *attribute) const; private: const QTestLogger *testLogger; diff --git a/src/testlib/qtestcoreelement.h b/src/testlib/qtestcoreelement.h index ea05c19..63c4efa 100644 --- a/src/testlib/qtestcoreelement.h +++ b/src/testlib/qtestcoreelement.h @@ -90,7 +90,8 @@ const char *QTestCoreElement::elementName() const "error", "testcase", "testsuite", - "benchmark" + "benchmark", + "system-err" }; if(type != QTest::LET_Undefined) diff --git a/src/testlib/qtestelementattribute.h b/src/testlib/qtestelementattribute.h index 2e23cd9..ccbe8e4 100644 --- a/src/testlib/qtestelementattribute.h +++ b/src/testlib/qtestelementattribute.h @@ -37,7 +37,8 @@ namespace QTest { LET_Error = 3, LET_TestCase = 4, LET_TestSuite = 5, - LET_Benchmark = 6 + LET_Benchmark = 6, + LET_SystemError = 7 }; } diff --git a/src/testlib/qtestlogger.cpp b/src/testlib/qtestlogger.cpp index a1a6d52..ffc73ae 100644 --- a/src/testlib/qtestlogger.cpp +++ b/src/testlib/qtestlogger.cpp @@ -14,7 +14,7 @@ QT_BEGIN_NAMESPACE QTestLogger::QTestLogger(int fm) - :listOfTestcases(0), currentLogElement(0), + :listOfTestcases(0), currentLogElement(0), errorLogElement(0), logFormatter(0), format( (TestLoggerFormat)fm ), filelogger(new QTestFileLogger), testCounter(0), passCounter(0), failureCounter(0), errorCounter(0), @@ -49,6 +49,8 @@ void QTestLogger::startLogging() break; }case TLF_XunitXml:{ logFormatter = new QTestXunitStreamer; + delete errorLogElement; + errorLogElement = new QTestElement(QTest::LET_SystemError); filelogger->init(); break; } @@ -101,6 +103,8 @@ void QTestLogger::stopLogging() testcase = testcase->nextElement(); } + currentLogElement->addLogElement(errorLogElement); + QTestElement *it = currentLogElement; logFormatter->output(it); }else{ @@ -276,6 +280,13 @@ void QTestLogger::addMessage(MessageTypes type, const char *message, const char currentLogElement->addLogElement(errorElement); ++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); + errorLogElement->addLogElement(systemErrorElement); + } } void QTestLogger::setLogFormat(TestLoggerFormat fm) diff --git a/src/testlib/qtestlogger_p.h b/src/testlib/qtestlogger_p.h index 3badb1d..f695069 100644 --- a/src/testlib/qtestlogger_p.h +++ b/src/testlib/qtestlogger_p.h @@ -52,6 +52,7 @@ class QTestLogger : public QAbstractTestLogger private: QTestElement *listOfTestcases; QTestElement *currentLogElement; + QTestElement *errorLogElement; QTestBasicStreamer *logFormatter; TestLoggerFormat format; QTestFileLogger *filelogger; diff --git a/src/testlib/qtestxunitstreamer.cpp b/src/testlib/qtestxunitstreamer.cpp index 2d8b7c4..42dc56c 100644 --- a/src/testlib/qtestxunitstreamer.cpp +++ b/src/testlib/qtestxunitstreamer.cpp @@ -40,6 +40,17 @@ void QTestXunitStreamer::formatStart(const QTestElement *element, char *formatte 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) { + QTest::qt_snprintf(formatted, 1024, "elementName()); } @@ -59,13 +70,23 @@ void QTestXunitStreamer::formatEnd(const QTestElement *element, char *formatted) QTest::qt_snprintf(formatted, 1024, "%s\n", indent, element->elementName()); } -void QTestXunitStreamer::formatAttributes(const QTestElementAttribute *attribute, char *formatted) const +void QTestXunitStreamer::formatAttributes(const QTestElement* element, const QTestElementAttribute *attribute, char *formatted) const { if(!attribute || !formatted ) return; 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) { + + if (attrindex != QTest::AI_Description) return; + + QXmlTestLogger::xmlCdata(formatted, attribute->value(), 1024); + return; + } + char const* key = 0; if (attrindex == QTest::AI_Description) key = "message"; @@ -87,10 +108,21 @@ void QTestXunitStreamer::formatAfterAttributes(const QTestElement *element, char if(!element || !formatted ) return; - if(!element->childElements()) - QTest::qt_snprintf(formatted, 10, "/>\n"); - else - QTest::qt_snprintf(formatted, 10, ">\n"); + // Errors are written as CDATA within system-err, comments elsewhere + if (element->elementType() == QTest::LET_Error) { + if (element->parentElement()->elementType() == QTest::LET_SystemError) { + QTest::qt_snprintf(formatted, 1024, "]]>\n"); + } + else { + QTest::qt_snprintf(formatted, 1024, " -->\n"); + } + return; + } + + if(!element->childElements()) + QTest::qt_snprintf(formatted, 10, "/>\n"); + else + QTest::qt_snprintf(formatted, 10, ">\n"); } void QTestXunitStreamer::output(QTestElement *element) const @@ -122,7 +154,7 @@ void QTestXunitStreamer::outputElements(QTestElement *element, bool) const formatBeforeAttributes(element, buf); outputString(buf); - outputElementAttributes(element->attributes()); + outputElementAttributes(element, element->attributes()); formatAfterAttributes(element, buf); outputString(buf); diff --git a/src/testlib/qtestxunitstreamer.h b/src/testlib/qtestxunitstreamer.h index 1ce9576..a6554af 100644 --- a/src/testlib/qtestxunitstreamer.h +++ b/src/testlib/qtestxunitstreamer.h @@ -16,7 +16,7 @@ class QTestXunitStreamer: public QTestBasicStreamer void formatStart(const QTestElement *element = 0, char *formatted = 0) const; void formatEnd(const QTestElement *element = 0, char *formatted = 0) const; void formatAfterAttributes(const QTestElement *element = 0, char *formatted = 0) const; - void formatAttributes(const QTestElementAttribute *attribute = 0, char *formatted = 0) const; + void formatAttributes(const QTestElement *element = 0, const QTestElementAttribute *attribute = 0, char *formatted = 0) const; void output(QTestElement *element) const; void outputElements(QTestElement *element, bool isChildElement = false) const; diff --git a/src/testlib/qxmltestlogger.cpp b/src/testlib/qxmltestlogger.cpp index ec9a5d2..0606ced 100644 --- a/src/testlib/qxmltestlogger.cpp +++ b/src/testlib/qxmltestlogger.cpp @@ -325,6 +325,10 @@ void QXmlTestLogger::xmlQuote(char* dest, char const* src, size_t n) MAP_ENTITY('"', """); MAP_ENTITY('&', "&"); + // not strictly necessary, but allows handling of comments without + // having to explicitly look for `--' + MAP_ENTITY('-', "-"); + #undef MAP_ENTITY case 0: diff --git a/tests/auto/selftests/expected_xunit.txt b/tests/auto/selftests/expected_xunit.txt index 0f7e70a..875dda6 100644 --- a/tests/auto/selftests/expected_xunit.txt +++ b/tests/auto/selftests/expected_xunit.txt @@ -6,19 +6,24 @@ - + - + - + + + +]]> + + diff --git a/tests/auto/selftests/xunit/tst_xunit.cpp b/tests/auto/selftests/xunit/tst_xunit.cpp index d0b585f..dbe9fec 100644 --- a/tests/auto/selftests/xunit/tst_xunit.cpp +++ b/tests/auto/selftests/xunit/tst_xunit.cpp @@ -67,7 +67,7 @@ void tst_Xunit::testFunc1() void tst_Xunit::testFunc2() { - qDebug("a qDebug() call!"); + qDebug("a qDebug() call with comment-ending stuff -->"); QCOMPARE(2, 3); } -- cgit v0.12