tests/auto/qtimer/tst_qtimer.cpp
changeset 37 758a864f9613
parent 30 5dc02b23752f
--- a/tests/auto/qtimer/tst_qtimer.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/tests/auto/qtimer/tst_qtimer.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -86,6 +86,7 @@
     void timerIdPersistsAfterThreadExit();
     void cancelLongTimer();
     void singleShotStaticFunctionZeroTimeout();
+    void recurseOnTimeoutAndStopTimer();
 };
 
 class TimerHelper : public QObject
@@ -160,8 +161,9 @@
     QCOMPARE(helper.count, 1);
 }
 
-#if defined(Q_OS_SYMBIAN) && defined(Q_CC_NOKIAX86)
-// Increase wait as emulator startup can cause unexpected delays
+#if defined(Q_OS_SYMBIAN)
+// Increase wait as emulator startup can cause unexpected delays, and
+// on hardware there are sometimes spikes right after process startup.
 #define TIMEOUT_TIMEOUT 2000
 #else
 #define TIMEOUT_TIMEOUT 200
@@ -623,5 +625,48 @@
     QCOMPARE(helper.count, 1);
 }
 
+class RecursOnTimeoutAndStopTimerTimer : public QObject
+{
+    Q_OBJECT
+
+public:
+    QTimer *one;
+    QTimer *two;
+
+public slots:
+    void onetrigger()
+    {
+        QCoreApplication::processEvents();
+    }
+
+    void twotrigger()
+    {
+        one->stop();
+    }
+};
+
+void tst_QTimer::recurseOnTimeoutAndStopTimer()
+{
+    QEventLoop eventLoop;
+    QTimer::singleShot(1000, &eventLoop, SLOT(quit()));
+
+    RecursOnTimeoutAndStopTimerTimer t;
+    t.one = new QTimer(&t);
+    t.two = new QTimer(&t);
+
+    QObject::connect(t.one, SIGNAL(timeout()), &t, SLOT(onetrigger()));
+    QObject::connect(t.two, SIGNAL(timeout()), &t, SLOT(twotrigger()));
+
+    t.two->setSingleShot(true);
+
+    t.one->start();
+    t.two->start();
+
+    (void) eventLoop.exec();
+
+    QVERIFY(!t.one->isActive());
+    QVERIFY(!t.two->isActive());
+}
+
 QTEST_MAIN(tst_QTimer)
 #include "tst_qtimer.moc"