18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project This library is free software; you can redistribute it and/or 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project modify it under the terms of the GNU Library General Public 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project License as published by the Free Software Foundation; either 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project version 2 of the License, or (at your option) any later version. 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project This library is distributed in the hope that it will be useful, 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Library General Public License for more details. 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project You should have received a copy of the GNU Library General Public License 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project along with this library; see the file COPYING.LIB. If not, write to 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Boston, MA 02110-1301, USA. 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Functions and macros that really need to be in QTestLib 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <QEventLoop> 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <QSignalSpy> 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <QTimer> 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(TESTS_SOURCE_DIR) 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TESTS_SOURCE_DIR "" 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** 3034d165185730eac6ddc4e7a23d192d22aa3d4dfbDavid 'Digit' Turner * Starts an event loop that runs until the given signal is received. 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Optionally the event loop 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * can return earlier on a timeout. 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * \return \p true if the requested signal was received 35 * \p false on timeout 36 */ 37static bool waitForSignal(QObject* obj, const char* signal, int timeout = 10000) 38{ 39 QEventLoop loop; 40 QObject::connect(obj, signal, &loop, SLOT(quit())); 41 QTimer timer; 42 QSignalSpy timeoutSpy(&timer, SIGNAL(timeout())); 43 if (timeout > 0) { 44 QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); 45 timer.setSingleShot(true); 46 timer.start(timeout); 47 } 48 loop.exec(); 49 return timeoutSpy.isEmpty(); 50} 51 52// Will try to wait for the condition while allowing event processing 53#define QTRY_VERIFY(__expr) \ 54 do { \ 55 const int __step = 50; \ 56 const int __timeout = 5000; \ 57 if (!(__expr)) { \ 58 QTest::qWait(0); \ 59 } \ 60 for (int __i = 0; __i < __timeout && !(__expr); __i+=__step) { \ 61 QTest::qWait(__step); \ 62 } \ 63 QVERIFY(__expr); \ 64 } while(0) 65 66// Will try to wait for the condition while allowing event processing 67#define QTRY_COMPARE(__expr, __expected) \ 68 do { \ 69 const int __step = 50; \ 70 const int __timeout = 5000; \ 71 if ((__expr) != (__expected)) { \ 72 QTest::qWait(0); \ 73 } \ 74 for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \ 75 QTest::qWait(__step); \ 76 } \ 77 QCOMPARE(__expr, __expected); \ 78 } while(0) 79