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