From 3ee6d8d336db2d9d15818b234ce16531ea0cdd48 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 25 Oct 2016 09:09:18 +0200 Subject: Split QTest::qExec() Split into (internal) QTest::qInit(), qRun(), and qCleanup(), that allow qtquickcontrols2 to initialize the test framework once, repeat the tests for all built-in styles (Default, Material, Universal), and finally cleanup things: $ ./tst_qquickbutton text ********* Start testing of tst_QQuickButton ********* Config: Using QtTest library 5.10.0, Qt 5.10.0 (...) PASS : tst_QQuickButton::Default::initTestCase() PASS : tst_QQuickButton::Default::text() PASS : tst_QQuickButton::Default::cleanupTestCase() PASS : tst_QQuickButton::Material::initTestCase() PASS : tst_QQuickButton::Material::text() PASS : tst_QQuickButton::Material::cleanupTestCase() PASS : tst_QQuickButton::Universal::initTestCase() PASS : tst_QQuickButton::Universal::text() PASS : tst_QQuickButton::Universal::cleanupTestCase() Totals: 9 passed, 0 failed, 0 skipped, 0 blacklisted, 2215ms ********* Finished testing of tst_QQuickButton ********* Notice that QTest::qExec() cannot be called multiple times, because it would print the headers/footers/results separately for each round. Change-Id: Ibb24b694491d4e790db32e40837c3a5c6d9d2840 Reviewed-by: Edward Welbourne --- src/testlib/qtestcase.cpp | 89 +++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 30 deletions(-) (limited to 'src/testlib/qtestcase.cpp') diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 1470f3cf91..a4099c3cd8 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -275,6 +275,11 @@ namespace QTest static QObject *currentTestObject = 0; static QString mainSourcePath; +#if defined(Q_OS_MACOS) + bool macNeedsActivate = false; + IOPMAssertionID powerID; +#endif + class TestMethods { Q_DISABLE_COPY(TestMethods) public: @@ -1357,9 +1362,7 @@ void TestMethods::invokeTests(QObject *testObject) const { const QMetaObject *metaObject = testObject->metaObject(); QTEST_ASSERT(metaObject); - QTestLog::startLogging(); QTestResult::setCurrentTestFunction("initTestCase"); - QTestTable::globalTestTable(); if (m_initTestCaseDataMethod.isValid()) m_initTestCaseDataMethod.invoke(testObject, Qt::DirectConnection); @@ -1404,9 +1407,6 @@ void TestMethods::invokeTests(QObject *testObject) const } QTestResult::finishedCurrentTestFunction(); QTestResult::setCurrentTestFunction(0); - QTestTable::clearGlobalTestTable(); - - QTestLog::stopLogging(); } #if defined(Q_OS_UNIX) @@ -1710,24 +1710,25 @@ static void initEnvironment() int QTest::qExec(QObject *testObject, int argc, char **argv) { - initEnvironment(); - QBenchmarkGlobalData benchmarkData; - QBenchmarkGlobalData::current = &benchmarkData; + qInit(testObject, argc, argv); + int ret = qRun(); + qCleanup(); + return ret; +} -#ifdef QTESTLIB_USE_VALGRIND - int callgrindChildExitCode = 0; -#endif +/*! \internal + */ +void QTest::qInit(QObject *testObject, int argc, char **argv) +{ + initEnvironment(); + QBenchmarkGlobalData::current = new QBenchmarkGlobalData; #if defined(Q_OS_MACX) - bool macNeedsActivate = qApp && (qstrcmp(qApp->metaObject()->className(), "QApplication") == 0); - IOPMAssertionID powerID; + macNeedsActivate = qApp && (qstrcmp(qApp->metaObject()->className(), "QApplication") == 0); // Don't restore saved window state for auto tests. QTestPrivate::disableWindowRestore(); #endif -#ifndef QT_NO_EXCEPTIONS - try { -#endif #if defined(Q_OS_MACX) if (macNeedsActivate) { @@ -1757,6 +1758,24 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) qtest_qParseArgs(argc, argv, false); + QTestTable::globalTestTable(); + QTestLog::startLogging(); +} + +/*! \internal + */ +int QTest::qRun() +{ + QTEST_ASSERT(currentTestObject); + +#ifdef QTESTLIB_USE_VALGRIND + int callgrindChildExitCode = 0; +#endif + +#ifndef QT_NO_EXCEPTIONS + try { +#endif + #if defined(Q_OS_WIN) if (!noCrashHandler) { # ifndef Q_CC_MINGW @@ -1792,17 +1811,17 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) for (const QString &tf : qAsConst(QTest::testFunctions)) { const QByteArray tfB = tf.toLatin1(); const QByteArray signature = tfB + QByteArrayLiteral("()"); - QMetaMethod m = TestMethods::findMethod(testObject, signature.constData()); + QMetaMethod m = TestMethods::findMethod(currentTestObject, signature.constData()); if (!m.isValid() || !isValidSlot(m)) { fprintf(stderr, "Unknown test function: '%s'. Possible matches:\n", tfB.constData()); qPrintTestSlots(stderr, tfB.constData()); - fprintf(stderr, "\n%s -functions\nlists all available test functions.\n", argv[0]); + fprintf(stderr, "\n%s -functions\nlists all available test functions.\n", QTestResult::currentAppName()); exit(1); } commandLineMethods.push_back(m); } - TestMethods test(testObject, commandLineMethods); - test.invokeTests(testObject); + TestMethods test(currentTestObject, commandLineMethods); + test.invokeTests(currentTestObject); } #ifndef QT_NO_EXCEPTIONS @@ -1827,16 +1846,6 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) } #endif - currentTestObject = 0; - - QSignalDumper::endDump(); - -#if defined(Q_OS_MACX) - if (macNeedsActivate) { - IOPMAssertionRelease(powerID); - } -#endif - #ifdef QTESTLIB_USE_VALGRIND if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) return callgrindChildExitCode; @@ -1846,6 +1855,26 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) return qMin(QTestLog::failCount(), 127); } +/*! \internal + */ +void QTest::qCleanup() +{ + currentTestObject = 0; + + QTestTable::clearGlobalTestTable(); + QTestLog::stopLogging(); + + delete QBenchmarkGlobalData::current; + QBenchmarkGlobalData::current = 0; + + QSignalDumper::endDump(); + +#if defined(Q_OS_MACOS) + if (macNeedsActivate) + IOPMAssertionRelease(powerID); +#endif +} + /*! \overload \since 4.4 -- cgit v1.2.3