1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    This library is free software; you can redistribute it and/or
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    modify it under the terms of the GNU Library General Public
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    License as published by the Free Software Foundation; either
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    version 2 of the License, or (at your option) any later version.
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    This library is distributed in the hope that it will be useful,
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Library General Public License for more details.
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    You should have received a copy of the GNU Library General Public License
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    along with this library; see the file COPYING.LIB.  If not, write to
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Boston, MA 02110-1301, USA.
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block*/
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// Functions and macros that really need to be in QTestLib
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <QEventLoop>
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <QSignalSpy>
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <QTimer>
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
25d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !defined(TESTS_SOURCE_DIR)
26d0825bca7fe65beaee391d30da42e937db621564Steve Block#define TESTS_SOURCE_DIR ""
27d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
28d0825bca7fe65beaee391d30da42e937db621564Steve Block
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/**
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Starts an event loop that runs until the given signal is received.
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Optionally the event loop
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * can return earlier on a timeout.
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * \return \p true if the requested signal was received
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *         \p false on timeout
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic bool waitForSignal(QObject* obj, const char* signal, int timeout = 10000)
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QEventLoop loop;
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QObject::connect(obj, signal, &loop, SLOT(quit()));
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QTimer timer;
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (timeout > 0) {
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        timer.setSingleShot(true);
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        timer.start(timeout);
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    loop.exec();
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return timeoutSpy.isEmpty();
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// Will try to wait for the condition while allowing event processing
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define QTRY_VERIFY(__expr) \
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    do { \
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const int __step = 50; \
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const int __timeout = 5000; \
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!(__expr)) { \
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QTest::qWait(0); \
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } \
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (int __i = 0; __i < __timeout && !(__expr); __i+=__step) { \
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QTest::qWait(__step); \
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } \
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QVERIFY(__expr); \
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } while(0)
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// Will try to wait for the condition while allowing event processing
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define QTRY_COMPARE(__expr, __expected) \
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    do { \
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const int __step = 50; \
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const int __timeout = 5000; \
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ((__expr) != (__expected)) { \
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QTest::qWait(0); \
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } \
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            QTest::qWait(__step); \
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } \
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        QCOMPARE(__expr, __expected); \
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } while(0)
79