testlib: Defer signal dumper start until tests are ready to run

We don't want the signal dumper to pick up signals that our own
test machinery produces, such as the ones emitted from the watchdog
thread startup and shutdown. This would otherwise produce:

 tst_Signaldumper::initTestCase() Signal: QThread(7fc969e0d870) started ()

At startup, and at shutdown even more confusingly:

 tst_Signaldumper::UnknownTestFunc() Signal: QThread(7fc969e0d870) finished ()

Change-Id: I9e81fa168eaa92551d38d5576973bbf95ac23364
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Tor Arne Vestbø 2020-07-21 22:38:47 +02:00
parent 304ec18a1a
commit e7371c19d9
9 changed files with 21 additions and 29 deletions

View File

@ -170,8 +170,16 @@ static void qSignalDumperCallbackEndSignal(QObject *caller, int /*signal_index*/
}
void QSignalDumper::setEnabled(bool enabled)
{
s_isEnabled = enabled;
}
void QSignalDumper::startDump()
{
if (!s_isEnabled)
return;
static QSignalSpyCallbackSet set = { QTest::qSignalDumperCallback,
QTest::qSignalDumperCallbackSlot, QTest::qSignalDumperCallbackEndSignal, nullptr };
qt_register_signal_spy_callbacks(&set);
@ -194,4 +202,6 @@ void QSignalDumper::clearIgnoredClasses()
QTest::ignoreClasses()->clear();
}
bool QSignalDumper::s_isEnabled = false;
QT_END_NAMESPACE

View File

@ -60,11 +60,14 @@ class QByteArray;
class QSignalDumper
{
public:
static void setEnabled(bool);
static void startDump();
static void endDump();
static void ignoreClass(const QByteArray &klass);
static void clearIgnoredClasses();
private:
static bool s_isEnabled;
};
QT_END_NAMESPACE

View File

@ -643,7 +643,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool
} else if (strcmp(argv[i], "-v2") == 0) {
QTestLog::setVerboseLevel(2);
} else if (strcmp(argv[i], "-vs") == 0) {
QSignalDumper::startDump();
QSignalDumper::setEnabled(true);
} else if (strcmp(argv[i], "-o") == 0) {
if (i + 1 >= argc) {
fprintf(stderr, "-o needs an extra parameter specifying the filename and optional format\n");
@ -1485,6 +1485,8 @@ void TestMethods::invokeTests(QObject *testObject) const
watchDog.reset(new WatchDog);
}
QSignalDumper::startDump();
if (!QTestResult::skipCurrentTest() && !QTest::currentTestFailed()) {
if (m_initTestCaseMethod.isValid())
m_initTestCaseMethod.invoke(testObject, Qt::DirectConnection);
@ -1517,6 +1519,8 @@ void TestMethods::invokeTests(QObject *testObject) const
}
QTestResult::finishedCurrentTestFunction();
QTestResult::setCurrentTestFunction(nullptr);
QSignalDumper::endDump();
}
#if defined(Q_OS_WIN)
@ -1965,8 +1969,6 @@ void QTest::qCleanup()
delete QBenchmarkGlobalData::current;
QBenchmarkGlobalData::current = nullptr;
QSignalDumper::endDump();
#if defined(Q_OS_MACOS)
IOPMAssertionRelease(macPowerSavingDisabled);
#endif

View File

@ -1,13 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="126" failures="0" tests="13" name="tst_Signaldumper">
<testsuite errors="124" failures="0" tests="13" name="tst_Signaldumper">
<properties>
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
<property value="" name="QtBuild"/>
</properties>
<testcase result="pass" name="initTestCase">
<!-- message="Signal: QThread(_POINTER_) started ()" type="info" -->
</testcase>
<testcase result="pass" name="initTestCase"/>
<testcase result="pass" name="noConnections">
<!-- message="Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()" type="info" -->
<!-- message="Signal: SignalSlotClass(_POINTER_) signalWithParameters (int(242), char(m))" type="info" -->
@ -154,11 +152,8 @@
<testcase result="pass" name="deletingSender">
<!-- message="Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()" type="info" -->
</testcase>
<testcase result="pass" name="cleanupTestCase">
<!-- message=" Signal: QThread(_POINTER_) finished ()" type="info" -->
</testcase>
<testcase result="pass" name="cleanupTestCase"/>
<system-err>
<![CDATA[Signal: QThread(_POINTER_) started ()]]>
<![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]>
<![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithParameters (int(242), char(m))]]>
<![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]>
@ -283,6 +278,5 @@
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
<![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]>
<![CDATA[ Signal: QThread(_POINTER_) finished ()]]>
</system-err>
</testsuite>

View File

@ -4,9 +4,6 @@
<QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
</Environment>
<TestFunction name="initTestCase">
<Message type="info" file="" line="0">
<Description><![CDATA[Signal: QThread(_POINTER_) started ()]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
</TestFunction>
@ -579,7 +576,4 @@
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
</TestFunction>
<Message type="info" file="" line="0">
<Description><![CDATA[ Signal: QThread(_POINTER_) finished ()]]></Description>
</Message>
<Duration msecs="0"/>

View File

@ -1,6 +1,5 @@
TAP version 13
# tst_Signaldumper
# Signal: QThread(_POINTER_) started ()
ok 1 - initTestCase()
# Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
# Signal: SignalSlotClass(_POINTER_) signalWithParameters (int(242), char(m))
@ -146,7 +145,6 @@ ok 19 - variousTypes()
# Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
ok 20 - deletingSender()
ok 21 - cleanupTestCase()
# Signal: QThread(_POINTER_) finished ()
1..21
# tests 21
# pass 21

View File

@ -1,6 +1,5 @@
##teamcity[testSuiteStarted name='tst_Signaldumper' flowId='tst_Signaldumper']
##teamcity[testStarted name='initTestCase()' flowId='tst_Signaldumper']
##teamcity[testStdOut name='initTestCase()' out='INFO: Signal: QThread(_POINTER_) started ()' flowId='tst_Signaldumper']
##teamcity[testFinished name='initTestCase()' flowId='tst_Signaldumper']
##teamcity[testStarted name='noConnections()' flowId='tst_Signaldumper']
##teamcity[testStdOut name='noConnections()' out='INFO: Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()|nINFO: Signal: SignalSlotClass(_POINTER_) signalWithParameters (int(242), char(m))' flowId='tst_Signaldumper']

View File

@ -1,6 +1,5 @@
********* Start testing of tst_Signaldumper *********
Config: Using QtTest library
INFO : tst_Signaldumper::initTestCase() Signal: QThread(_POINTER_) started ()
PASS : tst_Signaldumper::initTestCase()
INFO : tst_Signaldumper::noConnections() Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
INFO : tst_Signaldumper::noConnections() Signal: SignalSlotClass(_POINTER_) signalWithParameters (int(242), char(m))
@ -146,6 +145,5 @@ PASS : tst_Signaldumper::variousTypes()
INFO : tst_Signaldumper::deletingSender() Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
PASS : tst_Signaldumper::deletingSender()
PASS : tst_Signaldumper::cleanupTestCase()
INFO : tst_Signaldumper::UnknownTestFunc() Signal: QThread(_POINTER_) finished ()
Totals: 21 passed, 0 failed, 0 skipped, 0 blacklisted, 0ms
********* Finished testing of tst_Signaldumper *********

View File

@ -6,9 +6,6 @@
<QTestVersion>@INSERT_QT_VERSION_HERE@</QTestVersion>
</Environment>
<TestFunction name="initTestCase">
<Message type="info" file="" line="0">
<Description><![CDATA[Signal: QThread(_POINTER_) started ()]]></Description>
</Message>
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
</TestFunction>
@ -581,8 +578,5 @@
<Incident type="pass" file="" line="0" />
<Duration msecs="0"/>
</TestFunction>
<Message type="info" file="" line="0">
<Description><![CDATA[ Signal: QThread(_POINTER_) finished ()]]></Description>
</Message>
<Duration msecs="0"/>
</TestCase>