Line data Source code
1 : /****************************************************************************
2 : **
3 : ** Copyright (C) 2016 The Qt Company Ltd.
4 : ** Contact: https://www.qt.io/licensing/
5 : **
6 : ** This file is part of the QtTest module of the Qt Toolkit.
7 : **
8 : ** $QT_BEGIN_LICENSE:LGPL$
9 : ** Commercial License Usage
10 : ** Licensees holding valid commercial Qt licenses may use this file in
11 : ** accordance with the commercial license agreement provided with the
12 : ** Software or, alternatively, in accordance with the terms contained in
13 : ** a written agreement between you and The Qt Company. For licensing terms
14 : ** and conditions see https://www.qt.io/terms-conditions. For further
15 : ** information use the contact form at https://www.qt.io/contact-us.
16 : **
17 : ** GNU Lesser General Public License Usage
18 : ** Alternatively, this file may be used under the terms of the GNU Lesser
19 : ** General Public License version 3 as published by the Free Software
20 : ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 : ** packaging of this file. Please review the following information to
22 : ** ensure the GNU Lesser General Public License version 3 requirements
23 : ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 : **
25 : ** GNU General Public License Usage
26 : ** Alternatively, this file may be used under the terms of the GNU
27 : ** General Public License version 2.0 or (at your option) the GNU General
28 : ** Public license version 3 or any later version approved by the KDE Free
29 : ** Qt Foundation. The licenses are as published by the Free Software
30 : ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 : ** included in the packaging of this file. Please review the following
32 : ** information to ensure the GNU General Public License requirements will
33 : ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 : ** https://www.gnu.org/licenses/gpl-3.0.html.
35 : **
36 : ** $QT_END_LICENSE$
37 : **
38 : ****************************************************************************/
39 :
40 : #ifndef QTESTEVENTLOOP_H
41 : #define QTESTEVENTLOOP_H
42 :
43 : #include <QtTest/qtest_global.h>
44 :
45 : #include <QtCore/qcoreapplication.h>
46 : #include <QtCore/qeventloop.h>
47 : #include <QtCore/qobject.h>
48 : #include <QtCore/qpointer.h>
49 : #include <QtCore/qthread.h>
50 :
51 : QT_BEGIN_NAMESPACE
52 :
53 :
54 6 : class Q_TESTLIB_EXPORT QTestEventLoop : public QObject
55 : {
56 : Q_OBJECT
57 :
58 : public:
59 6 : inline QTestEventLoop(QObject *aParent = Q_NULLPTR)
60 6 : : QObject(aParent), inLoop(false), _timeout(false), timerId(-1), loop(Q_NULLPTR) {}
61 :
62 : inline void enterLoopMSecs(int ms);
63 : inline void enterLoop(int secs) { enterLoopMSecs(secs * 1000); }
64 :
65 : inline void changeInterval(int secs)
66 : { killTimer(timerId); timerId = startTimer(secs * 1000); }
67 :
68 : inline bool timeout() const
69 : { return _timeout; }
70 :
71 : inline static QTestEventLoop &instance()
72 : {
73 : static QPointer<QTestEventLoop> testLoop;
74 : if (testLoop.isNull())
75 : testLoop = new QTestEventLoop(QCoreApplication::instance());
76 : return *static_cast<QTestEventLoop *>(testLoop);
77 : }
78 :
79 : public Q_SLOTS:
80 : inline void exitLoop();
81 :
82 : protected:
83 : inline void timerEvent(QTimerEvent *e) override;
84 :
85 : private:
86 : bool inLoop;
87 : bool _timeout;
88 : int timerId;
89 :
90 : QEventLoop *loop;
91 : };
92 :
93 7 : inline void QTestEventLoop::enterLoopMSecs(int ms)
94 : {
95 7 : Q_ASSERT(!loop);
96 :
97 14 : QEventLoop l;
98 :
99 7 : inLoop = true;
100 7 : _timeout = false;
101 :
102 7 : timerId = startTimer(ms);
103 :
104 7 : loop = &l;
105 7 : l.exec();
106 7 : loop = Q_NULLPTR;
107 7 : }
108 :
109 7 : inline void QTestEventLoop::exitLoop()
110 : {
111 7 : if (thread() != QThread::currentThread())
112 : {
113 0 : QMetaObject::invokeMethod(this, "exitLoop", Qt::QueuedConnection);
114 0 : return;
115 : }
116 :
117 7 : if (timerId != -1)
118 7 : killTimer(timerId);
119 7 : timerId = -1;
120 :
121 7 : if (loop)
122 7 : loop->exit();
123 :
124 7 : inLoop = false;
125 : }
126 :
127 : inline void QTestEventLoop::timerEvent(QTimerEvent *e)
128 : {
129 : if (e->timerId() != timerId)
130 : return;
131 : _timeout = true;
132 : exitLoop();
133 : }
134 :
135 : QT_END_NAMESPACE
136 :
137 : #endif
|