summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-08-14 09:05:42 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-08-14 09:06:31 +0200
commit5c23199d4e8ff21661dfa5aacc13149178e78cab (patch)
tree322aee61581d7c85f1ccb65e47d1e79eba1ba6c9 /tests/auto/corelib/kernel
parent252bad7c589e03d3e12df02354b00a84d8e3159a (diff)
parentc8d9b17367cfdcb034d11f8a168ca4ae3993e7c3 (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: configure mkspecs/macx-xcode/Info.plist.app mkspecs/macx-xcode/Info.plist.lib qmake/doc/qmake.qdocconf src/corelib/global/qglobal.h tests/auto/other/exceptionsafety/exceptionsafety.pro tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp Change-Id: I3c769a4a82dc2e99a12c69123fbf17613fd2ac2a
Diffstat (limited to 'tests/auto/corelib/kernel')
-rw-r--r--tests/auto/corelib/kernel/qeventloop/qeventloop.pro4
-rw-r--r--tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp27
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp58
3 files changed, 76 insertions, 13 deletions
diff --git a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
index c510052298..e5bcc31e6a 100644
--- a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
+++ b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
@@ -2,7 +2,9 @@ CONFIG += testcase
CONFIG += parallel_test
TARGET = tst_qeventloop
QT = core network testlib core-private
-SOURCES = tst_qeventloop.cpp
+SOURCES = $$PWD/tst_qeventloop.cpp
win32:!wince*:LIBS += -luser32
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+
+contains(QT_CONFIG, glib): DEFINES += HAVE_GLIB
diff --git a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp
index 73f8365ce5..c6d04e64db 100644
--- a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp
+++ b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp
@@ -46,6 +46,12 @@
#include <qcoreevent.h>
#include <qeventloop.h>
#include <private/qeventloop_p.h>
+#if defined(Q_OS_UNIX)
+ #include <private/qeventdispatcher_unix_p.h>
+ #if defined(HAVE_GLIB)
+ #include <private/qeventdispatcher_glib_p.h>
+ #endif
+#endif
#include <qmutex.h>
#include <qthread.h>
#include <qtimer.h>
@@ -159,6 +165,10 @@ public slots:
}
};
+#ifdef QT_GUI_LIB
+ #define tst_QEventLoop tst_QGuiEventLoop
+#endif
+
class tst_QEventLoop : public QObject
{
Q_OBJECT
@@ -491,11 +501,19 @@ void tst_QEventLoop::processEventsExcludeTimers()
QCOMPARE(timerReceiver.gotTimerEvent, timerId);
timerReceiver.gotTimerEvent = -1;
- // normal process events will send timers
+ // but not if we exclude timers
eventLoop.processEvents(QEventLoop::X11ExcludeTimers);
-#if !defined(Q_OS_UNIX)
- QEXPECT_FAIL("", "X11ExcludeTimers only works on UN*X", Continue);
+
+ QAbstractEventDispatcher *eventDispatcher = QCoreApplication::eventDispatcher();
+#if defined(Q_OS_UNIX)
+ if (!qobject_cast<QEventDispatcherUNIX *>(eventDispatcher)
+ #if defined(HAVE_GLIB)
+ && !qobject_cast<QEventDispatcherGlib *>(eventDispatcher)
+ #endif
+ )
#endif
+ QEXPECT_FAIL("", "X11ExcludeTimers only supported in the UNIX/Glib dispatchers", Continue);
+
QCOMPARE(timerReceiver.gotTimerEvent, -1);
timerReceiver.gotTimerEvent = -1;
@@ -580,7 +598,7 @@ class JobObject : public QObject
public:
explicit JobObject(QEventLoop *loop, QObject *parent = 0)
- : QObject(parent), loop(loop), locker(loop)
+ : QObject(parent), locker(loop)
{
}
@@ -606,7 +624,6 @@ signals:
void done();
private:
- QEventLoop *loop;
QEventLoopLocker locker;
};
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 9bf28430b0..8d1ea3b510 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -5727,27 +5727,44 @@ void tst_QObject::connectFunctorOverloads()
#endif
}
+class GetSenderObject : public QObject
+{
+ Q_OBJECT
+public:
+ QObject *accessSender() { return sender(); }
+
+public Q_SLOTS:
+ void triggerSignal() { Q_EMIT aSignal(); }
+
+Q_SIGNALS:
+ void aSignal();
+};
+
static int countedStructObjectsCount = 0;
struct CountedStruct
{
- CountedStruct() { ++countedStructObjectsCount; }
- CountedStruct(const CountedStruct &) { ++countedStructObjectsCount; }
+ CountedStruct() : sender(Q_NULLPTR) { ++countedStructObjectsCount; }
+ CountedStruct(GetSenderObject *sender) : sender(sender) { ++countedStructObjectsCount; }
+ CountedStruct(const CountedStruct &o) : sender(o.sender) { ++countedStructObjectsCount; }
CountedStruct &operator=(const CountedStruct &) { return *this; }
- ~CountedStruct() { --countedStructObjectsCount; }
- void operator()() const {}
+ // accessSender here allows us to check if there's a deadlock
+ ~CountedStruct() { --countedStructObjectsCount; if (sender != Q_NULLPTR) (void)sender->accessSender(); }
+ void operator()() const { }
+
+ GetSenderObject *sender;
};
void tst_QObject::disconnectDoesNotLeakFunctor()
{
QCOMPARE(countedStructObjectsCount, 0);
{
+ GetSenderObject obj;
QMetaObject::Connection c;
{
- CountedStruct s;
+ CountedStruct s(&obj);
QCOMPARE(countedStructObjectsCount, 1);
- QTimer timer;
- c = connect(&timer, &QTimer::timeout, s);
+ c = connect(&obj, &GetSenderObject::aSignal, s);
QVERIFY(c);
QCOMPARE(countedStructObjectsCount, 2);
QVERIFY(QObject::disconnect(c));
@@ -5798,6 +5815,33 @@ void tst_QObject::disconnectDoesNotLeakFunctor()
}
QCOMPARE(countedStructObjectsCount, 0);
{
+ QTimer *timer = new QTimer;
+ QEventLoop e;
+
+ connect(timer, &QTimer::timeout, CountedStruct());
+ QCOMPARE(countedStructObjectsCount, 1); // only one instance, in Qt internals
+ timer->deleteLater();
+ connect(timer, &QObject::destroyed, &e, &QEventLoop::quit, Qt::QueuedConnection);
+ e.exec();
+ QCOMPARE(countedStructObjectsCount, 0); // functor being destroyed
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ GetSenderObject obj;
+
+ connect(&obj, &GetSenderObject::aSignal, CountedStruct(&obj));
+ QCOMPARE(countedStructObjectsCount, 1);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ GetSenderObject obj;
+
+ connect(&obj, &GetSenderObject::aSignal, CountedStruct(&obj));
+ QCOMPARE(countedStructObjectsCount, 1);
+ QObject::disconnect(&obj, &GetSenderObject::aSignal, 0, 0);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
#if defined(Q_COMPILER_LAMBDA)
CountedStruct s;
QCOMPARE(countedStructObjectsCount, 1);