From 1a8aa8186693d8549d0bca774fdb6ceb0b9ad850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 19 Mar 2019 11:58:39 +0100 Subject: Apple test logger: Handle test log messages without a context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We may get calls to the MessageTypes-overload of addMessage via e.g. qSkip, or other functions in QTestLog, so we have to implement the function. Change-Id: I9d58c73e93ca918c42448c246c37cc9ae6aa04de Reviewed-by: Joerg Bornemann Reviewed-by: Edward Welbourne Reviewed-by: Tor Arne Vestbø --- src/testlib/qappletestlogger.cpp | 130 ++++++++++++++++++++++++++++----------- 1 file changed, 93 insertions(+), 37 deletions(-) (limited to 'src/testlib/qappletestlogger.cpp') diff --git a/src/testlib/qappletestlogger.cpp b/src/testlib/qappletestlogger.cpp index 959ff6cf64..dfeadebdef 100644 --- a/src/testlib/qappletestlogger.cpp +++ b/src/testlib/qappletestlogger.cpp @@ -83,56 +83,56 @@ void QAppleTestLogger::leaveTestFunction() testFunctionActivity.leave(); } -typedef QPair IncidentClassification; -static IncidentClassification incidentTypeToClassification(QAbstractTestLogger::IncidentTypes type) +struct MessageData { - switch (type) { - case QAbstractTestLogger::Pass: - return IncidentClassification(QtInfoMsg, "pass"); - case QAbstractTestLogger::XFail: - return IncidentClassification(QtInfoMsg, "xfail"); - case QAbstractTestLogger::Fail: - return IncidentClassification(QtCriticalMsg, "fail"); - case QAbstractTestLogger::XPass: - return IncidentClassification(QtInfoMsg, "xpass"); - case QAbstractTestLogger::BlacklistedPass: - return IncidentClassification(QtWarningMsg, "bpass"); - case QAbstractTestLogger::BlacklistedFail: - return IncidentClassification(QtInfoMsg, "bfail"); - case QAbstractTestLogger::BlacklistedXPass: - return IncidentClassification(QtWarningMsg, "bxpass"); - case QAbstractTestLogger::BlacklistedXFail: - return IncidentClassification(QtInfoMsg, "bxfail"); + QtMsgType messageType = QtFatalMsg; + const char *categorySuffix = nullptr; + + void generateCategory(QTestCharBuffer *category) + { + if (categorySuffix) + QTest::qt_asprintf(category, "qt.test.%s", categorySuffix); + else + QTest::qt_asprintf(category, "qt.test"); } - return IncidentClassification(QtFatalMsg, nullptr); -} +}; + void QAppleTestLogger::addIncident(IncidentTypes type, const char *description, const char *file, int line) { - - IncidentClassification incidentClassification = incidentTypeToClassification(type); + MessageData messageData = [=]() { + switch (type) { + case QAbstractTestLogger::Pass: + return MessageData{QtInfoMsg, "pass"}; + case QAbstractTestLogger::XFail: + return MessageData{QtInfoMsg, "xfail"}; + case QAbstractTestLogger::Fail: + return MessageData{QtCriticalMsg, "fail"}; + case QAbstractTestLogger::XPass: + return MessageData{QtInfoMsg, "xpass"}; + case QAbstractTestLogger::BlacklistedPass: + return MessageData{QtWarningMsg, "bpass"}; + case QAbstractTestLogger::BlacklistedFail: + return MessageData{QtInfoMsg, "bfail"}; + case QAbstractTestLogger::BlacklistedXPass: + return MessageData{QtWarningMsg, "bxpass"}; + case QAbstractTestLogger::BlacklistedXFail: + return MessageData{QtInfoMsg, "bxfail"}; + } + Q_UNREACHABLE(); + }(); QTestCharBuffer category; - QTest::qt_asprintf(&category, "qt.test.%s", incidentClassification.second); - QMessageLogContext context(file, line, /* function = */ nullptr, category.data()); + messageData.generateCategory(&category); - QTestCharBuffer subsystemBuffer; - // It would be nice to have the data tag as part of the subsystem too, but that - // will for some tests results in hundreds of thousands of log objects being - // created, so we limit the subsystem to test functions, which we can hope - // are reasonably limited. - generateTestIdentifier(&subsystemBuffer, TestObject | TestFunction); - QString subsystem = QString::fromLatin1(subsystemBuffer.data()); + QMessageLogContext context(file, line, /* function = */ nullptr, category.data()); - // We still want the full identifier as part of the message though - QTestCharBuffer testIdentifier; - generateTestIdentifier(&testIdentifier); - QString message = QString::fromLatin1(testIdentifier.data()); + QString message = testIdentifier(); if (qstrlen(description)) message += QLatin1Char('\n') % QString::fromLatin1(description); - AppleUnifiedLogger::messageHandler(incidentClassification.first, context, message, subsystem); + AppleUnifiedLogger::messageHandler(messageData.messageType, context, message, subsystem()); } void QAppleTestLogger::addMessage(QtMsgType type, const QMessageLogContext &context, const QString &message) @@ -140,6 +140,62 @@ void QAppleTestLogger::addMessage(QtMsgType type, const QMessageLogContext &cont AppleUnifiedLogger::messageHandler(type, context, message); } +void QAppleTestLogger::addMessage(MessageTypes type, const QString &message, const char *file, int line) +{ + MessageData messageData = [=]() { + switch (type) { + case QAbstractTestLogger::Warn: + case QAbstractTestLogger::QWarning: + return MessageData{QtWarningMsg, nullptr}; + case QAbstractTestLogger::QDebug: + return MessageData{QtDebugMsg, nullptr}; + case QAbstractTestLogger::QSystem: + return MessageData{QtWarningMsg, "system"}; + case QAbstractTestLogger::QFatal: + return MessageData{QtFatalMsg, nullptr}; + case QAbstractTestLogger::Skip: + return MessageData{QtInfoMsg, "skip"}; + case QAbstractTestLogger::Info: + case QAbstractTestLogger::QInfo: + return MessageData{QtInfoMsg, nullptr}; + } + Q_UNREACHABLE(); + }(); + + QTestCharBuffer category; + messageData.generateCategory(&category); + + QMessageLogContext context(file, line, /* function = */ nullptr, category.data()); + QString msg = message; + + if (type == Skip) { + if (!message.isNull()) + msg.prepend(testIdentifier() + QLatin1Char('\n')); + else + msg = testIdentifier(); + } + + AppleUnifiedLogger::messageHandler(messageData.messageType, context, msg, subsystem()); +} + +QString QAppleTestLogger::subsystem() const +{ + QTestCharBuffer buffer; + // It would be nice to have the data tag as part of the subsystem too, but that + // will for some tests result in hundreds of thousands of log objects being + // created, so we limit the subsystem to test functions, which we can hope + // are reasonably limited. + generateTestIdentifier(&buffer, TestObject | TestFunction); + return QString::fromLatin1(buffer.data()); +} + +QString QAppleTestLogger::testIdentifier() const +{ + QTestCharBuffer buffer; + generateTestIdentifier(&buffer); + return QString::fromLatin1(buffer.data()); +} + #endif // QT_USE_APPLE_UNIFIED_LOGGING QT_END_NAMESPACE -- cgit v1.2.3