181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/* 281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) 381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch This library is free software; you can redistribute it and/or 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch modify it under the terms of the GNU Library General Public 681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch License as published by the Free Software Foundation; either 781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch version 2 of the License, or (at your option) any later version. 881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch This library is distributed in the hope that it will be useful, 1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch but WITHOUT ANY WARRANTY; without even the implied warranty of 1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Library General Public License for more details. 1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch You should have received a copy of the GNU Library General Public License 1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch along with this library; see the file COPYING.LIB. If not, write to 1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Boston, MA 02110-1301, USA. 1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch*/ 1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Functions and macros that really need to be in QTestLib 2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <QEventLoop> 2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <QSignalSpy> 2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <QTimer> 2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if !defined(TESTS_SOURCE_DIR) 2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define TESTS_SOURCE_DIR "" 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/** 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Starts an event loop that runs until the given signal is received. 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Optionally the event loop 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * can return earlier on a timeout. 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * \return \p true if the requested signal was received 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * \p false on timeout 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */ 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic bool waitForSignal(QObject* obj, const char* signal, int timeout = 10000) 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QEventLoop loop; 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QObject::connect(obj, signal, &loop, SLOT(quit())); 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QTimer timer; 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (timeout > 0) { 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch timer.setSingleShot(true); 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch timer.start(timeout); 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch loop.exec(); 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return timeoutSpy.isEmpty(); 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Will try to wait for the condition while allowing event processing 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define QTRY_VERIFY(__expr) \ 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch do { \ 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const int __step = 50; \ 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const int __timeout = 5000; \ 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!(__expr)) { \ 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QTest::qWait(0); \ 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } \ 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (int __i = 0; __i < __timeout && !(__expr); __i+=__step) { \ 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QTest::qWait(__step); \ 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } \ 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QVERIFY(__expr); \ 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } while(0) 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Will try to wait for the condition while allowing event processing 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define QTRY_COMPARE(__expr, __expected) \ 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch do { \ 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const int __step = 50; \ 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const int __timeout = 5000; \ 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if ((__expr) != (__expected)) { \ 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QTest::qWait(0); \ 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } \ 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \ 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QTest::qWait(__step); \ 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } \ 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QCOMPARE(__expr, __expected); \ 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } while(0) 79