diff options
Diffstat (limited to 'src/testlib/qtestlog.cpp')
-rw-r--r-- | src/testlib/qtestlog.cpp | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index 560ddd9a640..29cafe9aea4 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -77,14 +77,14 @@ namespace { class LoggerRegistry { using LoggersContainer = std::vector<std::shared_ptr<QAbstractTestLogger>>; - using SharedLoggersContainer = std::shared_ptr<LoggersContainer>; + using SharedLoggersContainer = std::shared_ptr<const LoggersContainer>; public: void addLogger(std::unique_ptr<QAbstractTestLogger> logger) { // read/update/clone const SharedLoggersContainer currentLoggers = load(); - SharedLoggersContainer newLoggers = currentLoggers + auto newLoggers = currentLoggers ? std::make_shared<LoggersContainer>(*currentLoggers) : std::make_shared<LoggersContainer>(); newLoggers->emplace_back(std::move(logger)); @@ -115,20 +115,20 @@ public: private: #ifdef __cpp_lib_atomic_shared_ptr - SharedLoggersContainer load() const { return loggers.load(std::memory_order_relaxed); } + SharedLoggersContainer load() const { return loggers.load(std::memory_order_acquire); } void store(SharedLoggersContainer newLoggers) { - loggers.store(std::move(newLoggers), std::memory_order_relaxed); + loggers.store(std::move(newLoggers), std::memory_order_release); } - std::atomic<SharedLoggersContainer> loggers; + std::atomic<SharedLoggersContainer> loggers = nullptr; #else SharedLoggersContainer load() const { - return std::atomic_load_explicit(&loggers, std::memory_order_relaxed); + return std::atomic_load_explicit(&loggers, std::memory_order_acquire); } void store(SharedLoggersContainer newLoggers) { - std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_relaxed); + std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_release); } SharedLoggersContainer loggers; #endif @@ -187,14 +187,14 @@ namespace QTest { inline bool matches(QtMsgType tp, const QString &message) const { - return tp == type - && (pattern.userType() == QMetaType::QString ? - stringsMatch(pattern.toString(), message) : + if (tp != type) + return false; #if QT_CONFIG(regularexpression) - pattern.toRegularExpression().match(message).hasMatch()); -#else - false); + if (const auto *regex = get_if<QRegularExpression>(&pattern)) + return regex->match(message).hasMatch(); #endif + Q_ASSERT(pattern.metaType() == QMetaType::fromType<QString>()); + return stringsMatch(pattern.toString(), message); } QtMsgType type; @@ -258,16 +258,18 @@ namespace QTest { // failOnWarning can be called multiple times per test function, so let // each call cause a failure if required. for (const auto &pattern : failOnWarningList) { - if (pattern.metaType() == QMetaType::fromType<QString>()) { - if (message != pattern.toString()) + if (const auto *text = get_if<QString>(&pattern)) { + if (message != *text) continue; - } #if QT_CONFIG(regularexpression) - else if (pattern.metaType() == QMetaType::fromType<QRegularExpression>()) { - if (!message.contains(pattern.toRegularExpression())) + } else if (const auto *regex = get_if<QRegularExpression>(&pattern)) { + if (!message.contains(*regex)) continue; - } #endif + } else { + // The no-arg clearFailOnWarnings()'s null pattern matches all messages. + Q_ASSERT(pattern.isNull()); + } const size_t maxMsgLen = 1024; char msg[maxMsgLen] = {'\0'}; @@ -398,13 +400,16 @@ void QTestLog::printUnhandledIgnoreMessages() QString message; QTest::IgnoreResultList *list = QTest::ignoreResultList; while (list) { - if (list->pattern.userType() == QMetaType::QString) { - message = "Did not receive message: \"%1\""_L1.arg(list->pattern.toString()); - } else { + if (const auto *text = get_if<QString>(&list->pattern)) { + message = "Did not receive message: \"%1\""_L1.arg(*text); #if QT_CONFIG(regularexpression) - message = "Did not receive any message matching: \"%1\""_L1.arg( - list->pattern.toRegularExpression().pattern()); + } else if (const auto *regex = get_if<QRegularExpression>(&list->pattern)) { + message = "Did not receive any message matching: \"%1\""_L1.arg(regex->pattern()); #endif + } else { + Q_UNREACHABLE(); + message = "Missing message of unrecognized pattern type: \"%1\""_L1.arg( + list->pattern.metaType().name()); } for (auto &logger : QTest::loggers->allLoggers()) logger->addMessage(QAbstractTestLogger::Info, message); |