summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2019-03-06 14:09:30 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2019-03-06 15:57:13 +0000
commitc01b07a810914b2f0da8d44d471b4408841d2345 (patch)
tree97b4e514ebda03e5209fc0f427e85d0ebf70d13c /src/testlib
parent1d58d2e987bb12b2d79c7a8bb80e14955dadded6 (diff)
parent2add2dbdaa9ff6ca6637ca22d6a9b7c7027751be (diff)
Merge "Merge remote-tracking branch 'origin/5.12' into 5.13" into refs/staging/5.13
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qappletestlogger.cpp20
-rw-r--r--src/testlib/qappletestlogger_p.h17
-rw-r--r--src/testlib/qtestcase.cpp31
-rw-r--r--src/testlib/qtestlog.cpp195
-rw-r--r--src/testlib/qtestlog_p.h11
5 files changed, 102 insertions, 172 deletions
diff --git a/src/testlib/qappletestlogger.cpp b/src/testlib/qappletestlogger.cpp
index 8e75da88f8..959ff6cf64 100644
--- a/src/testlib/qappletestlogger.cpp
+++ b/src/testlib/qappletestlogger.cpp
@@ -55,9 +55,8 @@ bool QAppleTestLogger::debugLoggingEnabled()
return os_log_type_enabled(OS_LOG_DEFAULT, OS_LOG_TYPE_DEBUG);
}
-QAppleTestLogger::QAppleTestLogger(QAbstractTestLogger *logger)
+QAppleTestLogger::QAppleTestLogger()
: QAbstractTestLogger(nullptr)
- , m_logger(logger)
{
}
@@ -65,6 +64,8 @@ static QAppleLogActivity testFunctionActivity;
void QAppleTestLogger::enterTestFunction(const char *function)
{
+ Q_UNUSED(function);
+
// Re-create activity each time
testFunctionActivity = QT_APPLE_LOG_ACTIVITY("Running test function").enter();
@@ -73,15 +74,12 @@ void QAppleTestLogger::enterTestFunction(const char *function)
QString identifier = QString::fromLatin1(testIdentifier.data());
QMessageLogContext context(nullptr, 0, nullptr, "qt.test.enter");
QString message = identifier;
- if (AppleUnifiedLogger::messageHandler(QtDebugMsg, context, message, identifier))
- return; // AUL already printed to stderr
- m_logger->enterTestFunction(function);
+ AppleUnifiedLogger::messageHandler(QtDebugMsg, context, message, identifier);
}
void QAppleTestLogger::leaveTestFunction()
{
- m_logger->leaveTestFunction();
testFunctionActivity.leave();
}
@@ -134,18 +132,12 @@ void QAppleTestLogger::addIncident(IncidentTypes type, const char *description,
if (qstrlen(description))
message += QLatin1Char('\n') % QString::fromLatin1(description);
- if (AppleUnifiedLogger::messageHandler(incidentClassification.first, context, message, subsystem))
- return; // AUL already printed to stderr
-
- m_logger->addIncident(type, description, file, line);
+ AppleUnifiedLogger::messageHandler(incidentClassification.first, context, message, subsystem);
}
void QAppleTestLogger::addMessage(QtMsgType type, const QMessageLogContext &context, const QString &message)
{
- if (AppleUnifiedLogger::messageHandler(type, context, message))
- return; // AUL already printed to stderr
-
- m_logger->addMessage(type, context, message);
+ AppleUnifiedLogger::messageHandler(type, context, message);
}
#endif // QT_USE_APPLE_UNIFIED_LOGGING
diff --git a/src/testlib/qappletestlogger_p.h b/src/testlib/qappletestlogger_p.h
index 5a45fad7a0..4217f4e6a2 100644
--- a/src/testlib/qappletestlogger_p.h
+++ b/src/testlib/qappletestlogger_p.h
@@ -63,12 +63,7 @@ class QAppleTestLogger : public QAbstractTestLogger
public:
static bool debugLoggingEnabled();
- QAppleTestLogger(QAbstractTestLogger *logger);
-
- void startLogging() override
- { m_logger->startLogging(); }
- void stopLogging() override
- { m_logger->stopLogging(); }
+ QAppleTestLogger();
void enterTestFunction(const char *function) override;
void leaveTestFunction() override;
@@ -77,16 +72,12 @@ public:
const char *file = 0, int line = 0) override;
void addMessage(QtMsgType, const QMessageLogContext &,
const QString &) override;
-
- void addBenchmarkResult(const QBenchmarkResult &result) override
- { m_logger->addBenchmarkResult(result); }
-
void addMessage(MessageTypes type, const QString &message,
const char *file = 0, int line = 0) override
- { m_logger->addMessage(type, message, file, line); }
+ { Q_UNUSED(type); Q_UNUSED(message); Q_UNUSED(file); Q_UNUSED(line); Q_UNREACHABLE(); }
-private:
- QScopedPointer<QAbstractTestLogger> m_logger;
+ void addBenchmarkResult(const QBenchmarkResult &result) override
+ { Q_UNUSED(result); }
};
#endif
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index caeb67b6d9..1f69429053 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -78,6 +78,10 @@
#include <QtTest/private/qtestutil_macos_p.h>
#endif
+#if defined(Q_OS_DARWIN)
+#include <QtTest/private/qappletestlogger_p.h>
+#endif
+
#include <cmath>
#include <numeric>
#include <algorithm>
@@ -511,7 +515,7 @@ static int qToInt(const char *str)
Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool qml)
{
- QTestLog::LogMode logFormat = QTestLog::Plain;
+ int logFormat = -1; // Not set
const char *logFilename = 0;
QTest::testFunctions.clear();
@@ -679,7 +683,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool
fprintf(stderr, "only one logger can log to stdout\n");
exit(1);
}
- QTestLog::addLogger(logFormat, filename);
+ QTestLog::addLogger(QTestLog::LogMode(logFormat), filename);
}
delete [] filename;
delete [] format;
@@ -841,10 +845,25 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool
QTestLog::setInstalledTestCoverage(installedTestCoverage);
// If no loggers were created by the long version of the -o command-line
- // option, create a logger using whatever filename and format were
- // set using the old-style command-line options.
- if (QTestLog::loggerCount() == 0)
- QTestLog::addLogger(logFormat, logFilename);
+ // option, but a logger was requested via the old-style option, add it.
+ const bool explicitLoggerRequested = logFormat != -1;
+ if (QTestLog::loggerCount() == 0 && explicitLoggerRequested)
+ QTestLog::addLogger(QTestLog::LogMode(logFormat), logFilename);
+
+ bool addFallbackLogger = !explicitLoggerRequested;
+
+#if defined(QT_USE_APPLE_UNIFIED_LOGGING)
+ // Any explicitly requested loggers will be added by now, so we can check if they use stdout
+ const bool safeToAddAppleLogger = !AppleUnifiedLogger::willMirrorToStderr() || !QTestLog::loggerUsingStdout();
+ if (safeToAddAppleLogger && QAppleTestLogger::debugLoggingEnabled()) {
+ QTestLog::addLogger(QTestLog::Apple, nullptr);
+ if (AppleUnifiedLogger::willMirrorToStderr() && !logFilename)
+ addFallbackLogger = false; // Prevent plain test logger fallback below
+ }
+#endif
+
+ if (addFallbackLogger)
+ QTestLog::addLogger(QTestLog::Plain, logFilename);
}
// Temporary, backwards compatibility, until qtdeclarative's use of it is converted
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index 32be7f6f10..faef3912c4 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -60,6 +60,7 @@
#include <QtCore/qbytearray.h>
#include <QtCore/QElapsedTimer>
#include <QtCore/QVariant>
+#include <QtCore/qvector.h>
#if QT_CONFIG(regularexpression)
#include <QtCore/QRegularExpression>
#endif
@@ -98,6 +99,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;
@@ -165,109 +168,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<QAbstractTestLogger*> loggers;
static bool loggerUsingStdout = false;
static int verbosity = 0;
@@ -306,10 +207,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)) {
@@ -322,13 +223,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
@@ -351,13 +255,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()
@@ -376,7 +283,8 @@ void QTestLog::leaveTestFunction()
if (printAvailableTags)
return;
- QTest::TestLoggers::leaveTestFunction();
+ FOREACH_TEST_LOGGER
+ logger->leaveTestFunction();
}
void QTestLog::printUnhandledIgnoreMessages()
@@ -391,7 +299,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;
}
@@ -411,7 +320,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)
@@ -420,7 +330,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)
@@ -428,7 +339,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)
@@ -438,7 +350,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)
@@ -447,7 +360,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)
@@ -457,7 +371,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)
@@ -467,7 +382,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)
@@ -477,7 +393,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)
@@ -487,27 +404,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());
}
@@ -542,6 +465,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;
@@ -549,21 +477,13 @@ 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::TestLoggers::addLogger(logger);
+ QTest::loggers.append(logger);
}
int QTestLog::loggerCount()
{
- return QTest::TestLoggers::loggerCount();
+ return QTest::loggers.size();
}
bool QTestLog::loggerUsingStdout()
@@ -575,15 +495,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)
diff --git a/src/testlib/qtestlog_p.h b/src/testlib/qtestlog_p.h
index 0bdd6290e1..e63e89a78e 100644
--- a/src/testlib/qtestlog_p.h
+++ b/src/testlib/qtestlog_p.h
@@ -53,6 +53,10 @@
#include <QtTest/qttestglobal.h>
+#if defined(Q_OS_DARWIN)
+#include <QtCore/private/qcore_mac_p.h>
+#endif
+
QT_BEGIN_NAMESPACE
class QBenchmarkResult;
@@ -63,9 +67,12 @@ class Q_TESTLIB_EXPORT QTestLog
{
public:
enum LogMode {
- Plain = 0, XML, LightXML, XunitXML, CSV, TeamCity, TAP,
+ Plain = 0, XML, LightXML, XunitXML, CSV, TeamCity, TAP
+#if defined(QT_USE_APPLE_UNIFIED_LOGGING)
+ , Apple
+#endif
#if defined(HAVE_XCTEST)
- XCTest
+ , XCTest
#endif
};