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