summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp')
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp114
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"