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