summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2020-02-13 09:14:09 +0100
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-02-13 18:31:40 +0100
commit6b2535ea15cdbdb2355416b604f072fc13ff36b2 (patch)
tree4bf1560bab77c8b315850c5337ba31a0ea87b5f0 /tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
parent54c2cebabdda0280b8443c6947b6fee02445e138 (diff)
parent67491e2df5357706dbf88ddaf1f030ff095b4528 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts: examples/widgets/graphicsview/boxes/scene.h src/corelib/Qt5CoreMacros.cmake src/corelib/Qt6CoreMacros.cmake src/network/ssl/qsslsocket.cpp src/network/ssl/qsslsocket.h src/platformsupport/fontdatabases/windows/qwindowsfontenginedirectwrite.cpp src/testlib/CMakeLists.txt src/testlib/.prev_CMakeLists.txt tests/auto/corelib/tools/qscopeguard/tst_qscopeguard.cpp Disabled building manual tests with CMake for now, because qmake doesn't do it, and it confuses people. Done-With: Alexandru Croitor <alexandru.croitor@qt.io> Done-With: Volker Hilsheimer <volker.hilsheimer@qt.io> Change-Id: I865ae347bd01f4e59f16d007b66d175a52f1f152
Diffstat (limited to 'tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp')
-rw-r--r--tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp44
1 files changed, 39 insertions, 5 deletions
diff --git a/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
index 365508024b..85a2dae3b6 100644
--- a/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
+++ b/tests/auto/corelib/kernel/qeventdispatcher/tst_qeventdispatcher.cpp
@@ -45,8 +45,10 @@ class tst_QEventDispatcher : public QObject
Q_OBJECT
QAbstractEventDispatcher *eventDispatcher;
- int receivedEventType;
- int timerIdFromEvent;
+
+ int receivedEventType = -1;
+ int timerIdFromEvent = -1;
+ bool doubleTimer = false;
protected:
bool event(QEvent *e);
@@ -54,9 +56,7 @@ protected:
public:
inline tst_QEventDispatcher()
: QObject(),
- eventDispatcher(QAbstractEventDispatcher::instance(thread())),
- receivedEventType(-1),
- timerIdFromEvent(-1)
+ eventDispatcher(QAbstractEventDispatcher::instance(thread()))
{ }
private slots:
@@ -75,6 +75,9 @@ bool tst_QEventDispatcher::event(QEvent *e)
switch (receivedEventType = e->type()) {
case QEvent::Timer:
{
+ // sometimes, two timers fire during a single QTRY_xxx wait loop
+ if (timerIdFromEvent != -1)
+ doubleTimer = true;
timerIdFromEvent = static_cast<QTimerEvent *>(e)->timerId();
return true;
}
@@ -206,10 +209,31 @@ void tst_QEventDispatcher::registerTimer()
QVERIFY(timers.foundCoarse());
QVERIFY(timers.foundVeryCoarse());
+#ifdef Q_OS_DARWIN
+ /*
+ We frequently experience flaky failures on macOS. Assumption is that this is
+ due to undeterministic VM scheduling, making us process events for significantly
+ longer than expected and resulting in timers firing in undefined order.
+ To detect this condition, we use a QElapsedTimer, and skip the test.
+ */
+ QElapsedTimer elapsedTimer;
+ elapsedTimer.start();
+#endif
+
// process events, waiting for the next event... this should only fire the precise timer
receivedEventType = -1;
timerIdFromEvent = -1;
+ doubleTimer = false;
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), PreciseTimerInterval * 2);
+
+#ifdef Q_OS_DARWIN
+ if (doubleTimer)
+ QSKIP("Double timer during a single timeout - aborting test as flaky on macOS");
+ if (timerIdFromEvent != timers.preciseTimerId()
+ && elapsedTimer.elapsed() > PreciseTimerInterval * 3)
+ QSKIP("Ignore flaky test behavior due to VM scheduling on macOS");
+#endif
+
QCOMPARE(timerIdFromEvent, timers.preciseTimerId());
// now unregister it and make sure it's gone
timers.unregister(timers.preciseTimerId());
@@ -223,7 +247,17 @@ void tst_QEventDispatcher::registerTimer()
// do the same again for the coarse timer
receivedEventType = -1;
timerIdFromEvent = -1;
+ doubleTimer = false;
QTRY_COMPARE_WITH_TIMEOUT(receivedEventType, int(QEvent::Timer), CoarseTimerInterval * 2);
+
+#ifdef Q_OS_DARWIN
+ if (doubleTimer)
+ QSKIP("Double timer during a single timeout - aborting test as flaky on macOS");
+ if (timerIdFromEvent != timers.coarseTimerId()
+ && elapsedTimer.elapsed() > CoarseTimerInterval * 3)
+ QSKIP("Ignore flaky test behavior due to VM scheduling on macOS");
+#endif
+
QCOMPARE(timerIdFromEvent, timers.coarseTimerId());
// now unregister it and make sure it's gone
timers.unregister(timers.coarseTimerId());