diff options
Diffstat (limited to 'tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp')
-rw-r--r-- | tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp index fc3d8e0fbb..97c9757107 100644 --- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp +++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp @@ -39,10 +39,13 @@ ** ****************************************************************************/ - #include <QtCore/QtCore> #include <QtTest/QtTest> +#include <private/qcoreapplication_p.h> +#include <private/qeventloop_p.h> +#include <private/qthread_p.h> + class tst_QCoreApplication: public QObject { Q_OBJECT @@ -63,6 +66,7 @@ private slots: void execAfterExit(); void eventLoopExecAfterExit(); void customEventDispatcher(); + void testQuitLock(); }; class EventSpy : public QObject @@ -640,5 +644,113 @@ void tst_QCoreApplication::customEventDispatcher() QVERIFY(weak_ed.isNull()); } +class JobObject : public QObject +{ + Q_OBJECT +public: + + explicit JobObject(QEventLoop *loop, QObject *parent = 0) + : QObject(parent), locker(loop) + { + QTimer::singleShot(1000, this, SLOT(timeout())); + } + + explicit JobObject(QObject *parent = 0) + : QObject(parent) + { + QTimer::singleShot(1000, this, SLOT(timeout())); + } + +public slots: + void startSecondaryJob() + { + new JobObject(); + } + +private slots: + void timeout() + { + emit done(); + deleteLater(); + } + +signals: + void done(); + +private: + QEventLoopLocker locker; +}; + +class QuitTester : public QObject +{ + Q_OBJECT +public: + QuitTester(QObject *parent = 0) + : QObject(parent) + { + QTimer::singleShot(0, this, SLOT(doTest())); + } + +private slots: + void doTest() + { + QCoreApplicationPrivate *privateClass = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(qApp)); + + { + QCOMPARE(privateClass->quitLockRef.load(), 0); + // Test with a lock active so that the refcount doesn't drop to zero during these tests, causing a quit. + // (until we exit the scope) + QEventLoopLocker locker; + + QCOMPARE(privateClass->quitLockRef.load(), 1); + + JobObject *job1 = new JobObject(this); + + QCOMPARE(privateClass->quitLockRef.load(), 2); + + delete job1; + + QCOMPARE(privateClass->quitLockRef.load(), 1); + + job1 = new JobObject(this); + + QCOMPARE(privateClass->quitLockRef.load(), 2); + + JobObject *job2 = new JobObject(this); + + QCOMPARE(privateClass->quitLockRef.load(), 3); + + delete job1; + + QCOMPARE(privateClass->quitLockRef.load(), 2); + + JobObject *job3 = new JobObject(job2); + + QCOMPARE(privateClass->quitLockRef.load(), 3); + + JobObject *job4 = new JobObject(job2); + + QCOMPARE(privateClass->quitLockRef.load(), 4); + + delete job2; + + QCOMPARE(privateClass->quitLockRef.load(), 1); + + } + QCOMPARE(privateClass->quitLockRef.load(), 0); + } +}; + +void tst_QCoreApplication::testQuitLock() +{ + int argc = 1; + char *argv[] = { "tst_qcoreapplication" }; + QCoreApplication app(argc, argv); + + QuitTester tester; + app.exec(); +} + + QTEST_APPLESS_MAIN(tst_QCoreApplication) #include "tst_qcoreapplication.moc" |