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>()) {
196 const size_t maxMsgLen = 1024;
197 char msg[maxMsgLen] = {
'\0'};
198 qsnprintf(msg, maxMsgLen,
"Received a warning that resulted in a failure:\n%s",
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());
334 if (printAvailableTags)
477 logger->addBenchmarkResults(
results);
485 logger->startLogging();
493 logger->stopLogging();
495 QTest::loggers()->clear();
501 if (filename && strcmp(filename,
"-") == 0)
527#if defined(QT_USE_APPLE_UNIFIED_LOGGING)
528 case QTestLog::Apple:
529 logger =
new QAppleTestLogger;
532#if defined(HAVE_XCTEST)
533 case QTestLog::XCTest:
554 QTest::loggers()->emplace_back(logger);
559 return !QTest::loggers()->empty();
565 if (logger->isLoggingToStdout())
606#if QT_CONFIG(regularexpression)
621#if QT_CONFIG(regularexpression)
635bool QTestLog::printAvailableTags =
false;
639 printAvailableTags =
true;
696#include "moc_qtestlog_p.cpp"
Base class for test loggers.
qint64 restart() noexcept
Restarts the timer and returns the number of milliseconds elapsed since the previous start.
void start() noexcept
Starts this timer.
qint64 nsecsElapsed() const noexcept
\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 void stopLogging()
static void leaveTestFunction()
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)
static Q_CONSTINIT QBasicMutex mutex
static IgnoreResultList * ignoreResultList
enum QTest::@481 currentTestState
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,...)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
void(* QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &)
GLenum GLuint GLint level
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
#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
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)