From 83864b315ff48bca33c39e1bdc03e522f68214fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 17 Jan 2019 15:19:13 +0100 Subject: testlib: Replace manual logger linked list with QVector Removes useless indirection and builds on existing primitives in Qt. Change-Id: I9fe50b21f5f77fc02566d5f5ff04c3e94c830e81 Reviewed-by: Edward Welbourne --- src/testlib/qtestlog.cpp | 182 ++++++++++++++--------------------------------- 1 file changed, 53 insertions(+), 129 deletions(-) (limited to 'src/testlib/qtestlog.cpp') diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index c3e7385217..80f905e962 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #if QT_CONFIG(regularexpression) #include #endif @@ -93,6 +94,8 @@ static void saveCoverageTool(const char * appname, bool testfailed, bool install static QElapsedTimer elapsedFunctionTime; static QElapsedTimer elapsedTotalTime; +#define FOREACH_TEST_LOGGER for (QAbstractTestLogger *logger : QTest::loggers) + namespace QTest { int fails = 0; @@ -160,109 +163,7 @@ namespace QTest { static IgnoreResultList *ignoreResultList = 0; - struct LoggerList - { - QAbstractTestLogger *logger; - LoggerList *next; - }; - - class TestLoggers - { - public: - static void addLogger(QAbstractTestLogger *logger) - { - LoggerList *l = new LoggerList; - l->logger = logger; - l->next = loggers; - loggers = l; - } - - static void destroyLoggers() - { - while (loggers) { - LoggerList *l = loggers; - loggers = loggers->next; - delete l->logger; - delete l; - } - } - -#define FOREACH_LOGGER(operation) \ - LoggerList *l = loggers; \ - while (l) { \ - QAbstractTestLogger *logger = l->logger; \ - Q_UNUSED(logger); \ - operation; \ - l = l->next; \ - } - - static void startLogging() - { - FOREACH_LOGGER(logger->startLogging()); - } - - static void stopLogging() - { - FOREACH_LOGGER(logger->stopLogging()); - } - - static void enterTestFunction(const char *function) - { - FOREACH_LOGGER(logger->enterTestFunction(function)); - } - - static void leaveTestFunction() - { - FOREACH_LOGGER(logger->leaveTestFunction()); - } - - static void enterTestData(QTestData *data) - { - FOREACH_LOGGER(logger->enterTestData(data)); - } - - static void addIncident(QAbstractTestLogger::IncidentTypes type, const char *description, - const char *file = 0, int line = 0) - { - FOREACH_LOGGER(logger->addIncident(type, description, file, line)); - } - - static void addBenchmarkResult(const QBenchmarkResult &result) - { - FOREACH_LOGGER(logger->addBenchmarkResult(result)); - } - - static void addMessage(QtMsgType type, const QMessageLogContext &context, - const QString &message) - { - FOREACH_LOGGER(logger->addMessage(type, context, message)); - } - - static void addMessage(QAbstractTestLogger::MessageTypes type, const QString &message, - const char *file = 0, int line = 0) - { - FOREACH_LOGGER(logger->addMessage(type, message, file, line)); - } - - static void outputString(const char *msg) - { - FOREACH_LOGGER(logger->outputString(msg)); - } - - static int loggerCount() - { - int count = 0; - FOREACH_LOGGER(++count); - return count; - } - - private: - static LoggerList *loggers; - }; - -#undef FOREACH_LOGGER - - LoggerList *TestLoggers::loggers = 0; + static QVector loggers; static bool loggerUsingStdout = false; static int verbosity = 0; @@ -301,10 +202,10 @@ namespace QTest { { static QBasicAtomicInt counter = Q_BASIC_ATOMIC_INITIALIZER(QTest::maxWarnings); - if (QTest::TestLoggers::loggerCount() == 0) { + if (QTestLog::loggerCount() == 0) { // if this goes wrong, something is seriously broken. qInstallMessageHandler(oldMessageHandler); - QTEST_ASSERT(QTest::TestLoggers::loggerCount() != 0); + QTEST_ASSERT(QTestLog::loggerCount() != 0); } if (handleIgnoredMessage(type, message)) { @@ -317,13 +218,16 @@ namespace QTest { return; if (!counter.deref()) { - QTest::TestLoggers::addMessage(QAbstractTestLogger::QSystem, + FOREACH_TEST_LOGGER { + logger->addMessage(QAbstractTestLogger::QSystem, QStringLiteral("Maximum amount of warnings exceeded. Use -maxwarnings to override.")); + } return; } } - QTest::TestLoggers::addMessage(type, context, message); + FOREACH_TEST_LOGGER + logger->addMessage(type, context, message); if (type == QtFatalMsg) { /* Right now, we're inside the custom message handler and we're @@ -346,13 +250,16 @@ void QTestLog::enterTestFunction(const char* function) QTEST_ASSERT(function); - QTest::TestLoggers::enterTestFunction(function); + FOREACH_TEST_LOGGER + logger->enterTestFunction(function); } void QTestLog::enterTestData(QTestData *data) { QTEST_ASSERT(data); - QTest::TestLoggers::enterTestData(data); + + FOREACH_TEST_LOGGER + logger->enterTestData(data); } int QTestLog::unhandledIgnoreMessages() @@ -371,7 +278,8 @@ void QTestLog::leaveTestFunction() if (printAvailableTags) return; - QTest::TestLoggers::leaveTestFunction(); + FOREACH_TEST_LOGGER + logger->leaveTestFunction(); } void QTestLog::printUnhandledIgnoreMessages() @@ -386,7 +294,8 @@ void QTestLog::printUnhandledIgnoreMessages() message = QStringLiteral("Did not receive any message matching: \"") + list->pattern.toRegularExpression().pattern() + QLatin1Char('"'); #endif } - QTest::TestLoggers::addMessage(QAbstractTestLogger::Info, message); + FOREACH_TEST_LOGGER + logger->addMessage(QAbstractTestLogger::Info, message); list = list->next; } @@ -406,7 +315,8 @@ void QTestLog::addPass(const char *msg) ++QTest::passes; - QTest::TestLoggers::addIncident(QAbstractTestLogger::Pass, msg); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::Pass, msg); } void QTestLog::addFail(const char *msg, const char *file, int line) @@ -415,7 +325,8 @@ void QTestLog::addFail(const char *msg, const char *file, int line) ++QTest::fails; - QTest::TestLoggers::addIncident(QAbstractTestLogger::Fail, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::Fail, msg, file, line); } void QTestLog::addXFail(const char *msg, const char *file, int line) @@ -423,7 +334,8 @@ void QTestLog::addXFail(const char *msg, const char *file, int line) QTEST_ASSERT(msg); QTEST_ASSERT(file); - QTest::TestLoggers::addIncident(QAbstractTestLogger::XFail, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::XFail, msg, file, line); } void QTestLog::addXPass(const char *msg, const char *file, int line) @@ -433,7 +345,8 @@ void QTestLog::addXPass(const char *msg, const char *file, int line) ++QTest::fails; - QTest::TestLoggers::addIncident(QAbstractTestLogger::XPass, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::XPass, msg, file, line); } void QTestLog::addBPass(const char *msg) @@ -442,7 +355,8 @@ void QTestLog::addBPass(const char *msg) ++QTest::blacklists; - QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedPass, msg); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::BlacklistedPass, msg); } void QTestLog::addBFail(const char *msg, const char *file, int line) @@ -452,7 +366,8 @@ void QTestLog::addBFail(const char *msg, const char *file, int line) ++QTest::blacklists; - QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedFail, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::BlacklistedFail, msg, file, line); } void QTestLog::addBXPass(const char *msg, const char *file, int line) @@ -462,7 +377,8 @@ void QTestLog::addBXPass(const char *msg, const char *file, int line) ++QTest::blacklists; - QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedXPass, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::BlacklistedXPass, msg, file, line); } void QTestLog::addBXFail(const char *msg, const char *file, int line) @@ -472,7 +388,8 @@ void QTestLog::addBXFail(const char *msg, const char *file, int line) ++QTest::blacklists; - QTest::TestLoggers::addIncident(QAbstractTestLogger::BlacklistedXFail, msg, file, line); + FOREACH_TEST_LOGGER + logger->addIncident(QAbstractTestLogger::BlacklistedXFail, msg, file, line); } void QTestLog::addSkip(const char *msg, const char *file, int line) @@ -482,27 +399,33 @@ void QTestLog::addSkip(const char *msg, const char *file, int line) ++QTest::skips; - QTest::TestLoggers::addMessage(QAbstractTestLogger::Skip, QString::fromUtf8(msg), file, line); + FOREACH_TEST_LOGGER + logger->addMessage(QAbstractTestLogger::Skip, QString::fromUtf8(msg), file, line); } void QTestLog::addBenchmarkResult(const QBenchmarkResult &result) { - QTest::TestLoggers::addBenchmarkResult(result); + FOREACH_TEST_LOGGER + logger->addBenchmarkResult(result); } void QTestLog::startLogging() { elapsedTotalTime.start(); elapsedFunctionTime.start(); - QTest::TestLoggers::startLogging(); + FOREACH_TEST_LOGGER + logger->startLogging(); QTest::oldMessageHandler = qInstallMessageHandler(QTest::messageHandler); } void QTestLog::stopLogging() { qInstallMessageHandler(QTest::oldMessageHandler); - QTest::TestLoggers::stopLogging(); - QTest::TestLoggers::destroyLoggers(); + FOREACH_TEST_LOGGER { + logger->stopLogging(); + delete logger; + } + QTest::loggers.clear(); QTest::loggerUsingStdout = false; saveCoverageTool(QTestResult::currentAppName(), failCount() != 0, QTestLog::installedTestCoverage()); } @@ -553,12 +476,12 @@ void QTestLog::addLogger(LogMode mode, const char *filename) #endif QTEST_ASSERT(logger); - QTest::TestLoggers::addLogger(logger); + QTest::loggers.append(logger); } int QTestLog::loggerCount() { - return QTest::TestLoggers::loggerCount(); + return QTest::loggers.size(); } bool QTestLog::loggerUsingStdout() @@ -570,15 +493,16 @@ void QTestLog::warn(const char *msg, const char *file, int line) { QTEST_ASSERT(msg); - if (QTest::TestLoggers::loggerCount() > 0) - QTest::TestLoggers::addMessage(QAbstractTestLogger::Warn, QString::fromUtf8(msg), file, line); + FOREACH_TEST_LOGGER + logger->addMessage(QAbstractTestLogger::Warn, QString::fromUtf8(msg), file, line); } void QTestLog::info(const char *msg, const char *file, int line) { QTEST_ASSERT(msg); - QTest::TestLoggers::addMessage(QAbstractTestLogger::Info, QString::fromUtf8(msg), file, line); + FOREACH_TEST_LOGGER + logger->addMessage(QAbstractTestLogger::Info, QString::fromUtf8(msg), file, line); } void QTestLog::setVerboseLevel(int level) -- cgit v1.2.3 From 18da1dac20c7d27342e987586a16d125e39197c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 17 Jan 2019 16:03:03 +0100 Subject: testlib: Prevent Apple test logger from stomping on other loggers We were potentially adding the Apple test logger multiple times, and we didn't consider whether the existing loggers were logging to file or not when circumventing them. We now don't use the Apple logger if it would touch stderr and some other logger is using stdout. In the case of no explicit logger being specified on the command line, we allow the Apple logger to take priority over the default plain test logger. Change-Id: I31bbec4f4b3ab84ba9a2be35e8e5db08fee071a7 Reviewed-by: Edward Welbourne --- src/testlib/qtestlog.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'src/testlib/qtestlog.cpp') diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index 80f905e962..57bb7d95a7 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -460,6 +460,11 @@ void QTestLog::addLogger(LogMode mode, const char *filename) case QTestLog::TAP: logger = new QTapTestLogger(filename); break; +#if defined(QT_USE_APPLE_UNIFIED_LOGGING) + case QTestLog::Apple: + logger = new QAppleTestLogger; + break; +#endif #if defined(HAVE_XCTEST) case QTestLog::XCTest: logger = new QXcodeTestLogger; @@ -467,14 +472,6 @@ void QTestLog::addLogger(LogMode mode, const char *filename) #endif } -#if defined(QT_USE_APPLE_UNIFIED_LOGGING) - // Logger that also feeds messages to AUL. It needs to wrap the existing - // logger, as it needs to be able to short circuit the existing logger - // in case AUL prints to stderr. - if (QAppleTestLogger::debugLoggingEnabled()) - logger = new QAppleTestLogger(logger); -#endif - QTEST_ASSERT(logger); QTest::loggers.append(logger); } -- cgit v1.2.3