Document QAbstractTestLogger's virtual method API
Provide the information an implementor needs in order to be able to implement an logging backend. Change-Id: I7bb522de57149dad843e01a8afa9f8891d011d29 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
78c8f0cd4d
commit
2c2cdb959f
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
** Copyright (C) 2021 The Qt Company Ltd.
|
||||||
** Contact: https://www.qt.io/licensing/
|
** Contact: https://www.qt.io/licensing/
|
||||||
**
|
**
|
||||||
** This file is part of the QtTest module of the Qt Toolkit.
|
** This file is part of the QtTest module of the Qt Toolkit.
|
||||||
@ -57,7 +57,53 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
/*!
|
||||||
|
\internal
|
||||||
|
\class QAbstractTestLogger
|
||||||
|
\inmodule QtTest
|
||||||
|
\brief Base class for test loggers
|
||||||
|
|
||||||
|
Implementations of logging for QtTest should implement all pure virtual
|
||||||
|
methods of this class and may implement the other virtual methods. This
|
||||||
|
class's documentation of each virtual method sets out how those
|
||||||
|
implementations are invoked by the QtTest code and offers guidance on how
|
||||||
|
the logging class should use the data. Actual implementations may have
|
||||||
|
different requirements - such as a file format with a defined schema, or a
|
||||||
|
target audience to serve - that affect how it interprets that guidance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum QAbstractTestLogger::IncidentTypes
|
||||||
|
|
||||||
|
\value Pass
|
||||||
|
\value XFail
|
||||||
|
\value Fail
|
||||||
|
\value XPass
|
||||||
|
\value BlacklistedPass
|
||||||
|
\value BlacklistedFail
|
||||||
|
\value BlacklistedXPass
|
||||||
|
\value BlacklistedXFail
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\enum QAbstractTestLogger::MessageTypes
|
||||||
|
\value Warn
|
||||||
|
\value QWarning
|
||||||
|
\value QDebug
|
||||||
|
\value QCritical
|
||||||
|
\value QFatal
|
||||||
|
\value Skip
|
||||||
|
\value Info
|
||||||
|
\value QInfo
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Constructs the base-class parts of the logger.
|
||||||
|
|
||||||
|
Derived classes should pass this base-constructor the \a filename of the
|
||||||
|
file to which they shall log test results, or \nullptr to write to standard
|
||||||
|
output. The protected member \c stream is set to the open file desriptor.
|
||||||
|
*/
|
||||||
QAbstractTestLogger::QAbstractTestLogger(const char *filename)
|
QAbstractTestLogger::QAbstractTestLogger(const char *filename)
|
||||||
{
|
{
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
@ -81,20 +127,34 @@ QAbstractTestLogger::QAbstractTestLogger(const char *filename)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Destroys the logger object.
|
||||||
|
|
||||||
|
If the protected \c stream is not standard output, it is closed. In any
|
||||||
|
case it is cleared.
|
||||||
|
*/
|
||||||
QAbstractTestLogger::~QAbstractTestLogger()
|
QAbstractTestLogger::~QAbstractTestLogger()
|
||||||
{
|
{
|
||||||
QTEST_ASSERT(stream);
|
QTEST_ASSERT(stream);
|
||||||
if (stream != stdout) {
|
if (stream != stdout)
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
}
|
|
||||||
stream = nullptr;
|
stream = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns true precisely if the \c output stream is standard output.
|
||||||
|
*/
|
||||||
bool QAbstractTestLogger::isLoggingToStdout() const
|
bool QAbstractTestLogger::isLoggingToStdout() const
|
||||||
{
|
{
|
||||||
return stream == stdout;
|
return stream == stdout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Helper utility to blot out unprintable characters in \a str.
|
||||||
|
|
||||||
|
Takes a \c{'\0'}-terminated mutable string and changes any characters of it
|
||||||
|
that are not suitable for printing to \c{'?'} characters.
|
||||||
|
*/
|
||||||
void QAbstractTestLogger::filterUnprintable(char *str) const
|
void QAbstractTestLogger::filterUnprintable(char *str) const
|
||||||
{
|
{
|
||||||
unsigned char *idx = reinterpret_cast<unsigned char *>(str);
|
unsigned char *idx = reinterpret_cast<unsigned char *>(str);
|
||||||
@ -105,6 +165,13 @@ void QAbstractTestLogger::filterUnprintable(char *str) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Convenience method to write \a msg to the output stream.
|
||||||
|
|
||||||
|
The output \a msg must be a \c{'\0'}-terminated string (and not \nullptr).
|
||||||
|
A copy of it is passed to \l filterUnprintable() and the result written to
|
||||||
|
the output \c stream, which is then flushed.
|
||||||
|
*/
|
||||||
void QAbstractTestLogger::outputString(const char *msg)
|
void QAbstractTestLogger::outputString(const char *msg)
|
||||||
{
|
{
|
||||||
QTEST_ASSERT(stream);
|
QTEST_ASSERT(stream);
|
||||||
@ -120,14 +187,153 @@ void QAbstractTestLogger::outputString(const char *msg)
|
|||||||
delete [] filtered;
|
delete [] filtered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called before the start of a test run.
|
||||||
|
|
||||||
|
This virtual method is called before the first tests are run. A logging
|
||||||
|
implementation might open a file, write some preamble or prepare in other
|
||||||
|
ways, such as setting up initial values of variables. It can use the usual
|
||||||
|
Qt logging infrastucture, since it is also called before QtTest installs its
|
||||||
|
own custom message handler.
|
||||||
|
|
||||||
|
\sa stopLogging()
|
||||||
|
*/
|
||||||
void QAbstractTestLogger::startLogging()
|
void QAbstractTestLogger::startLogging()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called after the end of a test run.
|
||||||
|
|
||||||
|
This virtual method is called after all tests have run. A logging
|
||||||
|
implementation might collate information gathered from the run, write a
|
||||||
|
summary or close a file. It can use the usual Qt logging infrastucture,
|
||||||
|
since it is also called after QtTest has restored the default message
|
||||||
|
handler it replaced with its own custom message handler.
|
||||||
|
|
||||||
|
\sa startLogging()
|
||||||
|
*/
|
||||||
void QAbstractTestLogger::stopLogging()
|
void QAbstractTestLogger::stopLogging()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn void QAbstractTestLogger::enterTestFunction(const char *function)
|
||||||
|
|
||||||
|
This virtual method is called before each test function is invoked. It is
|
||||||
|
passed the name of the test function (without its class prefix) as \a
|
||||||
|
function. It is likewise called for \c{initTestCase()} at the start of
|
||||||
|
testing, after \l startLogging(), and for \c{cleanupTestCase()} at the end
|
||||||
|
of testing, in each case passing the name of the function. It is also called
|
||||||
|
with \nullptr as \function after the last of these functions, or in the
|
||||||
|
event of an early end to testing, before \l stopLogging().
|
||||||
|
|
||||||
|
For data-driven test functions, this is called only once, before the data
|
||||||
|
function is called to set up the table of datasets and the test is run with
|
||||||
|
its first dataset.
|
||||||
|
|
||||||
|
Every logging implementation must implement this method. It shall typically
|
||||||
|
need to record the name of the function for later use in log messages.
|
||||||
|
|
||||||
|
\sa leaveTestFunction(), enterTestData()
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
\fn void QAbstractTestLogger::leaveTestFunction()
|
||||||
|
|
||||||
|
This virtual method is called after a test function has completed, to match
|
||||||
|
\l enterTestFunction(). For data-driven test functions, this is called only
|
||||||
|
once, after the test is run with its last dataset.
|
||||||
|
|
||||||
|
Every logging implementation must implement this method. In some cases it
|
||||||
|
may be called more than once without an intervening call to \l
|
||||||
|
enterTestFunction(); in such cases, the implementation should ignore the
|
||||||
|
second (and later) calls.
|
||||||
|
|
||||||
|
\sa enterTestFunction(), enterTestData()
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
\fn void QAbstractTestLogger::enterTestData(QTestData *)
|
||||||
|
|
||||||
|
This virtual method is called before and after each call to a test
|
||||||
|
function. For a data-driven test, the call before is passed the name of the
|
||||||
|
test data row. This may combine a global data row name with a local data row
|
||||||
|
name. For non-data-driven tests and for the call after a test function,
|
||||||
|
\nullptr is passed
|
||||||
|
|
||||||
|
A logging implementation might chose to record the data row name for
|
||||||
|
reporting of results from the test for that data row. It should, in such a
|
||||||
|
case, clear its record of the name when called with \nullptr.
|
||||||
|
|
||||||
|
\sa enterTestFunction(), leaveTestFunction()
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
\fn void QAbstractTestLogger::addIncident(IncidentTypes type, const char *description, const char *file, int line)
|
||||||
|
|
||||||
|
This virtual method is called when an event occurs that bears on whether the
|
||||||
|
test passes or fails. The \a type indicates whether this was a pass or a
|
||||||
|
fail, whether a failure was expected and whether the test being run is
|
||||||
|
blacklisted. The \a description may be empty (for a pass), a message
|
||||||
|
describing the failure or, for an expected failure, the explanation of why a
|
||||||
|
failure was expected. Where the location in code of the incident is known,
|
||||||
|
it is indicated by \a file and \a line; otherwise, these are \a nullptr and
|
||||||
|
0, respectively.
|
||||||
|
|
||||||
|
Every logging implementation must implement this method. Note that there are
|
||||||
|
circumstances where more than one incident may be reported, in this way, for
|
||||||
|
a single run of a test on a single dataset. It is (for now) the
|
||||||
|
implementation's responsibility to recognize such cases and decide what to
|
||||||
|
do about them.
|
||||||
|
|
||||||
|
\sa addMessage(), addBenchmarkResult()
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
\fn void QAbstractTestLogger::addBenchmarkResult(const QBenchmarkResult &result)
|
||||||
|
|
||||||
|
This virtual method is called after a benchmark has been run enough times to
|
||||||
|
produce usable data. It is passed the median \a result from all cycles of
|
||||||
|
the code controlled by the test's QBENCHMARK loop.
|
||||||
|
|
||||||
|
Every logging implementation must implement this method.
|
||||||
|
|
||||||
|
\sa addIncident(), addMessage()
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
\overload
|
||||||
|
\fn void QAbstractTestLogger::addMessage(MessageTypes type, const QString &message, const char *file, int line)
|
||||||
|
|
||||||
|
This virtual method is called, via its \c QtMsgType overload, from the
|
||||||
|
custom message handler QtTest installs. It is also used by the
|
||||||
|
implementations of QSKIP(), to warn about various situations detected by
|
||||||
|
QtTest itself, such as \e failure to see a message anticipated by
|
||||||
|
QTest::ignoreMessage() and, particularly when verbosity options have been
|
||||||
|
enabled via the command-line, to log some extra information.
|
||||||
|
|
||||||
|
Every logging implementation must implement this method. The \a type
|
||||||
|
indicates the category of message and the \a message is the content to be
|
||||||
|
reported. When the message is associated with specific code, the name of the
|
||||||
|
\a file and \a line number within it are also supplied (otherwise, these are
|
||||||
|
\nullptr and 0, respectively).
|
||||||
|
|
||||||
|
\sa QTest::ignoreMessage(), addIncident()
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\overload
|
||||||
|
|
||||||
|
This virtual method is called from the custom message handler QtTest
|
||||||
|
installs in place of Qt's default message handler for the duration of
|
||||||
|
testing, unless QTest::ignoreMessage() was used to ignore it, or too many
|
||||||
|
messages have previously been processed. (The limiting number of messages is
|
||||||
|
controlled by the -maxwarnings option to a test and defaults to 2002.)
|
||||||
|
|
||||||
|
Logging implementation should not normally need to over-ride this method.
|
||||||
|
The base implementation converts \a type to the matching \l MessageType,
|
||||||
|
formats the given \a message suitably for the specified \a context and
|
||||||
|
forwards the converted type and formatted message to the overload taking
|
||||||
|
MessageType and QString.
|
||||||
|
|
||||||
|
\sa QTest::ignoreMessage(), addIncident()
|
||||||
|
*/
|
||||||
void QAbstractTestLogger::addMessage(QtMsgType type, const QMessageLogContext &context,
|
void QAbstractTestLogger::addMessage(QtMsgType type, const QMessageLogContext &context,
|
||||||
const QString &message)
|
const QString &message)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user