4#include <QtTest/qtestassert.h>
6#include <QtTest/private/qtestlog_p.h>
7#include <QtTest/private/qtestresult_p.h>
8#include <QtTest/private/qabstracttestlogger_p.h>
9#include <QtTest/private/qplaintestlogger_p.h>
10#include <QtTest/private/qcsvbenchmarklogger_p.h>
11#include <QtTest/private/qjunittestlogger_p.h>
12#include <QtTest/private/qxmltestlogger_p.h>
13#include <QtTest/private/qteamcitylogger_p.h>
14#include <QtTest/private/qtaptestlogger_p.h>
15#if defined(HAVE_XCTEST)
16#include <QtTest/private/qxctestlogger_p.h>
19#if defined(Q_OS_DARWIN)
20#include <QtTest/private/qappletestlogger_p.h>
23#include <QtCore/qatomic.h>
24#include <QtCore/qbytearray.h>
25#include <QtCore/qelapsedtimer.h>
26#include <QtCore/qlist.h>
27#include <QtCore/qmutex.h>
28#include <QtCore/qvariant.h>
29#if QT_CONFIG(regularexpression)
30#include <QtCore/QRegularExpression>
45static void saveCoverageTool(
const char * appname,
bool testfailed,
bool installedTestCoverage)
47#ifdef __COVERAGESCANNER__
48# if QT_CONFIG(testlib_selfcover)
52 if (!installedTestCoverage)
56 __coveragescanner_install(appname);
57 __coveragescanner_teststate(testfailed ?
"FAILED" :
"PASSED");
58 __coveragescanner_save();
59 __coveragescanner_testname(
"");
60 __coveragescanner_clear();
61 unsetenv(
"QT_TESTCOCOON_ACTIVE");
73#define FOREACH_TEST_LOGGER for (const auto &logger : std::as_const(*QTest::loggers()))
106 for ( ; last->
next; last = last->
next) ;
127 && (
pattern.userType() == QMetaType::QString ?
129#if QT_CONFIG(regularexpression)
146 Q_GLOBAL_STATIC(std::vector<std::unique_ptr<QAbstractTestLogger>>, loggers)
185 if (
pattern.metaType() == QMetaType::fromType<QString>()) {
189#if QT_CONFIG(regularexpression)
190 else if (
pattern.metaType() == QMetaType::fromType<QRegularExpression>()) {
225 if (
counter.loadRelaxed() <= 0)
231 QStringLiteral(
"Maximum amount of warnings exceeded. Use -maxwarnings to override."));
256 if (printAvailableTags)
262 logger->enterTestFunction(function);
270 logger->enterTestData(
data);
287 if (printAvailableTags)
291 logger->leaveTestFunction();
300 if (
list->pattern.userType() == QMetaType::QString) {
301 message =
"Did not receive message: \"%1\""_L1.arg(
list->pattern.toString());
303#if QT_CONFIG(regularexpression)
304 message =
"Did not receive any message matching: \"%1\""_L1.arg(
305 list->pattern.toRegularExpression().pattern());
335 if (printAvailableTags)
478 logger->addBenchmarkResults(
results);
486 logger->startLogging();
494 logger->stopLogging();
496 QTest::loggers()->clear();
502 if (filename && strcmp(filename,
"-") == 0)
528#if defined(QT_USE_APPLE_UNIFIED_LOGGING)
529 case QTestLog::Apple:
530 logger =
new QAppleTestLogger;
533#if defined(HAVE_XCTEST)
534 case QTestLog::XCTest:
555 QTest::loggers()->emplace_back(logger);
560 return !QTest::loggers()->empty();
571 if (!logger->isRepeatSupported())
581 if (logger->isLoggingToStdout())
622#if QT_CONFIG(regularexpression)
642#if QT_CONFIG(regularexpression)
656bool QTestLog::printAvailableTags =
false;
660 printAvailableTags =
true;
717#include "moc_qtestlog_p.cpp"
Base class for test loggers.
\inmodule QtCore \reentrant
bool isValid() const
Returns true if the regular expression is a valid regular expression (that is, it contains no syntax ...
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static void clearCurrentTestState()
static void addPass(const char *msg)
static int verboseLevel()
static void addSkip(const char *msg, const char *file, int line)
static int blacklistCount()
static void addFail(const char *msg, const char *file, int line)
static void startLogging()
static void enterTestData(QTestData *data)
static void clearFailOnWarnings()
static void enterTestFunction(const char *function)
static void setInstalledTestCoverage(bool installed)
static void setVerboseLevel(int level)
static void addXPass(const char *msg, const char *file, int line)
static void addXFail(const char *msg, const char *file, int line)
static void addBPass(const char *msg)
static int unhandledIgnoreMessages()
static void addBFail(const char *msg, const char *file, int line)
static void clearIgnoreMessages()
static bool loggerUsingStdout()
static void setMaxWarnings(int max)
static bool installedTestCoverage()
static void addBXFail(const char *msg, const char *file, int line)
static void info(const char *msg, const char *file, int line)
static void setPrintAvailableTagsMode()
static qint64 nsecsTotalTime()
static void addBenchmarkResults(const QList< QBenchmarkResult > &result)
static qint64 nsecsFunctionTime()
static bool isRepeatSupported()
static void stopLogging()
static void leaveTestFunction()
static void failOnWarning()
static void warn(const char *msg, const char *file, int line)
static void addLogger(LogMode mode, const char *filename)
static void printUnhandledIgnoreMessages()
static void addBXPass(const char *msg, const char *file, int line)
static void ignoreMessage(QtMsgType type, const char *msg)
static void resetCounters()
static const char * currentAppName()
static void addFailure(const char *message, const char *file=nullptr, int line=0)
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
static Q_CONSTINIT QBasicAtomicPointer< void(QtMsgType, const QMessageLogContext &, const QString &) messageHandler)
QtMessageHandler qInstallMessageHandler(QtMessageHandler h)
Combined button and popup list for selecting options.
static bool handleIgnoredMessage(QtMsgType type, const QString &message)
static bool handleFailOnWarning(const QMessageLogContext &context, const QString &message)
enum QTest::@478 currentTestState
static Q_CONSTINIT QBasicMutex mutex
static IgnoreResultList * ignoreResultList
static bool installedTestCoverage
static std::vector< QVariant > failOnWarningList
static QtMessageHandler oldMessageHandler
static void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
#define Q_BASIC_ATOMIC_INITIALIZER(a)
Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt,...)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
void(* QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &)
GLenum GLuint GLint level
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint GLsizei const GLchar * message
#define qPrintable(string)
#define QStringLiteral(str)
#define QTEST_ASSERT(cond)
static void saveCoverageTool(const char *appname, bool testfailed, bool installedTestCoverage)
static Q_CONSTINIT QElapsedTimer elapsedFunctionTime
#define FOREACH_TEST_LOGGER
static Q_CONSTINIT QElapsedTimer elapsedTotalTime
static constexpr size_t maxMsgLen
IgnoreResultList(QtMsgType tp, const QVariant &patternIn)
static void clearList(IgnoreResultList *&list)
bool matches(QtMsgType tp, const QString &message) const
static bool stringsMatch(const QString &expected, const QString &actual)
static void append(IgnoreResultList *&list, QtMsgType type, const QVariant &patternIn)