diff options
Diffstat (limited to 'tests/auto/qgeoareamonitor')
-rw-r--r-- | tests/auto/qgeoareamonitor/CMakeLists.txt | 19 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/logfilepositionsource.cpp | 132 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/logfilepositionsource.h | 81 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/positionconsumerthread.cpp | 73 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/positionconsumerthread.h | 74 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/qgeoareamonitor.pro | 14 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/simplelog.txt | 87 | ||||
-rw-r--r-- | tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp | 977 |
8 files changed, 0 insertions, 1457 deletions
diff --git a/tests/auto/qgeoareamonitor/CMakeLists.txt b/tests/auto/qgeoareamonitor/CMakeLists.txt deleted file mode 100644 index de39e942..00000000 --- a/tests/auto/qgeoareamonitor/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -# Generated from qgeoareamonitor.pro. - -##################################################################### -## tst_qgeoareamonitor Test: -##################################################################### - -qt_internal_add_test(tst_qgeoareamonitor - SOURCES - logfilepositionsource.cpp logfilepositionsource.h - positionconsumerthread.cpp positionconsumerthread.h - tst_qgeoareamonitor.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Positioning -) - -#### Keys ignored in scope 1:.:.:qgeoareamonitor.pro:<TRUE>: -# OTHER_FILES = "*.txt" -# TEMPLATE = "app" diff --git a/tests/auto/qgeoareamonitor/logfilepositionsource.cpp b/tests/auto/qgeoareamonitor/logfilepositionsource.cpp deleted file mode 100644 index c7cdc93c..00000000 --- a/tests/auto/qgeoareamonitor/logfilepositionsource.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QTimer> -#include "logfilepositionsource.h" - -LogFilePositionSource::LogFilePositionSource(const QList<QByteArray> &data, QObject *parent) - : QGeoPositionInfoSource(parent), - timer(new QTimer(this)), - lines(data) -{ - connect(timer, SIGNAL(timeout()), this, SLOT(readNextPosition())); - - if (lines.isEmpty()) - qWarning() << "Error: the input data is empty!"; - else - index = 0; // ready to read -} - -QGeoPositionInfo LogFilePositionSource::lastKnownPosition(bool /*fromSatellitePositioningMethodsOnly*/) const -{ - return lastPosition; -} - -LogFilePositionSource::PositioningMethods LogFilePositionSource::supportedPositioningMethods() const -{ - return AllPositioningMethods; -} - -int LogFilePositionSource::minimumUpdateInterval() const -{ - return 50; -} - -void LogFilePositionSource::startUpdates() -{ - lastError = QGeoPositionInfoSource::NoError; - int interval = updateInterval(); - if (interval < minimumUpdateInterval()) - interval = minimumUpdateInterval(); - - if (!timer->isActive()) { - if (QMetaObject::invokeMethod(timer, "start", Q_ARG(int, interval))) - emit updatesStarted(); - } -} - -void LogFilePositionSource::stopUpdates() -{ - if (timer->isActive()) { - if (QMetaObject::invokeMethod(timer, "stop")) - emit updatesStopped(); - } -} - -void LogFilePositionSource::requestUpdate(int /*timeout*/) -{ - // For simplicity, ignore timeout - assume that if data is not available - // now, no data will be added to the file later - lastError = QGeoPositionInfoSource::NoError; - if (canReadLine()) { - readNextPosition(); - } else { - lastError = QGeoPositionInfoSource::UpdateTimeoutError; - emit errorOccurred(lastError); - } -} - -void LogFilePositionSource::readNextPosition() -{ - if (canReadLine()) { - const QByteArray line = lines.at(index); - if (!line.isEmpty()) { - QList<QByteArray> data = line.split(' '); - double latitude; - double longitude; - bool hasLatitude = false; - bool hasLongitude = false; - QDateTime timestamp = QDateTime::fromString(QString(data.value(0)), Qt::ISODate); - latitude = data.value(1).toDouble(&hasLatitude); - longitude = data.value(2).toDouble(&hasLongitude); - - if (hasLatitude && hasLongitude && timestamp.isValid()) { - QGeoCoordinate coordinate(latitude, longitude); - QGeoPositionInfo info(coordinate, timestamp); - if (info.isValid()) { - lastPosition = info; - emit positionUpdated(info); - } - } - } - index++; - } else if (!noDataEmitted) { - emit noDataLeft(); - noDataEmitted = true; - } -} - -bool LogFilePositionSource::canReadLine() const -{ - return (index >= 0) && (index < lines.size()); -} - -QGeoPositionInfoSource::Error LogFilePositionSource::error() const -{ - return lastError; -} diff --git a/tests/auto/qgeoareamonitor/logfilepositionsource.h b/tests/auto/qgeoareamonitor/logfilepositionsource.h deleted file mode 100644 index b175f7e9..00000000 --- a/tests/auto/qgeoareamonitor/logfilepositionsource.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef LOGFILEPOSITIONSOURCE_H -#define LOGFILEPOSITIONSOURCE_H - -#include <QtPositioning/qgeopositioninfosource.h> - -QT_BEGIN_NAMESPACE -class QTimer; -QT_END_NAMESPACE - -class LogFilePositionSource : public QGeoPositionInfoSource -{ - Q_OBJECT -public: - // This class is optimized to reduce the file IO. - // Initially it was reading the file line-by-line. - // It does not modify the data, so it was optimized to just hold the - // const reference to the pre-existing data, that can now be read once - // for all the instances of this class (for example, during the - // initTestCase() call). - LogFilePositionSource(const QList<QByteArray> &data, QObject *parent = 0); - - QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; - - PositioningMethods supportedPositioningMethods() const override; - int minimumUpdateInterval() const override; - Error error() const override; - -signals: - void noDataLeft(); - void updatesStarted(); - void updatesStopped(); - -public slots: - virtual void startUpdates() override; - virtual void stopUpdates() override; - - virtual void requestUpdate(int timeout = 5000) override; - -private slots: - void readNextPosition(); - -private: - bool canReadLine() const; - - QTimer *timer; - QGeoPositionInfo lastPosition; - Error lastError = QGeoPositionInfoSource::NoError; - const QList<QByteArray> &lines; - qsizetype index = -1; - bool noDataEmitted = false; -}; - -#endif diff --git a/tests/auto/qgeoareamonitor/positionconsumerthread.cpp b/tests/auto/qgeoareamonitor/positionconsumerthread.cpp deleted file mode 100644 index 094e4488..00000000 --- a/tests/auto/qgeoareamonitor/positionconsumerthread.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QSignalSpy> -#include <QtPositioning/qgeoareamonitorsource.h> -#include "positionconsumerthread.h" - -PositionConsumerThread::PositionConsumerThread(QGeoAreaMonitorSource *source, QObject *parent) - : QThread(parent), m_source(source) -{ -} - -PositionConsumerThread::~PositionConsumerThread() -{ - stopProcessing(); - wait(); -} - -int PositionConsumerThread::detectedEnterCount() const -{ - QMutexLocker locker(&m_mutex); - return m_detectedEnterCount; -} - -int PositionConsumerThread::detectedExitCount() const -{ - QMutexLocker locker(&m_mutex); - return m_detectedExitCount; -} - -void PositionConsumerThread::stopProcessing() -{ - m_mutex.lock(); - m_waitCondition.wakeOne(); - m_mutex.unlock(); -} - -void PositionConsumerThread::run() -{ - QSignalSpy enterSpy(m_source, &QGeoAreaMonitorSource::areaEntered); - QSignalSpy exitSpy(m_source, &QGeoAreaMonitorSource::areaExited); - - m_mutex.lock(); - m_waitCondition.wait(&m_mutex); - m_detectedEnterCount = enterSpy.count(); - m_detectedExitCount = exitSpy.count(); - m_mutex.unlock(); -} diff --git a/tests/auto/qgeoareamonitor/positionconsumerthread.h b/tests/auto/qgeoareamonitor/positionconsumerthread.h deleted file mode 100644 index acf5a933..00000000 --- a/tests/auto/qgeoareamonitor/positionconsumerthread.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef POSITIONCONSUMERTHREAD_H -#define POSITIONCONSUMERTHREAD_H - -#include <QThread> -#include <QMutex> -#include <QWaitCondition> - -QT_BEGIN_NAMESPACE -class QGeoAreaMonitorSource; -QT_END_NAMESPACE - -// This class is created to test the behavior of QGeoAreaMonitorPolling class, -// that reimplements the connectNotify() and disconnetNotify() methods, by -// triggering these methods from multiple threads. -// The thread creates two QSignalSpy instances, that connect to the signals of -// QGeoAreaMonitorSource. Once constructed, they trigger connectNotify(). -// Once destroyed, they trigger disconnectNotify. -// With the previous implementation of these overridden methods, that could lead -// to a deadlock in a rare case. -class PositionConsumerThread : public QThread -{ - Q_OBJECT -public: - explicit PositionConsumerThread(QGeoAreaMonitorSource *source, QObject *parent = nullptr); - ~PositionConsumerThread(); - - int detectedEnterCount() const; - int detectedExitCount() const; - -public slots: - void stopProcessing(); - -protected: - void run() override; - -private: - QGeoAreaMonitorSource *m_source; - - int m_detectedEnterCount = 0; - int m_detectedExitCount = 0; - - mutable QMutex m_mutex; - QWaitCondition m_waitCondition; -}; - -#endif // POSITIONCONSUMERTHREAD_H diff --git a/tests/auto/qgeoareamonitor/qgeoareamonitor.pro b/tests/auto/qgeoareamonitor/qgeoareamonitor.pro deleted file mode 100644 index d084df6e..00000000 --- a/tests/auto/qgeoareamonitor/qgeoareamonitor.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -CONFIG+=testcase -TARGET=tst_qgeoareamonitor - -SOURCES += tst_qgeoareamonitor.cpp \ - logfilepositionsource.cpp - -HEADERS += logfilepositionsource.h - -OTHER_FILES += *.txt - -CONFIG -= app_bundle - -QT += positioning testlib diff --git a/tests/auto/qgeoareamonitor/simplelog.txt b/tests/auto/qgeoareamonitor/simplelog.txt deleted file mode 100644 index 5a14fb80..00000000 --- a/tests/auto/qgeoareamonitor/simplelog.txt +++ /dev/null @@ -1,87 +0,0 @@ -2009-08-24T22:24:34 -27.54 153.090718 -2009-08-24T22:24:35 -27.55 153.090718 -2009-08-24T22:24:36 -27.56 153.090718 -2009-08-24T22:24:37 -27.57 153.090718 -2009-08-24T22:24:38 -27.58 153.090783 -2009-08-24T22:24:39 -27.59 153.090845 -2009-08-24T22:24:40 -27.60 153.090908 -2009-08-24T22:24:41 -27.61 153.090971 -2009-08-24T22:24:42 -27.62 153.091036 -2009-08-24T22:24:43 -27.63 153.091102 -2009-08-24T22:24:44 -27.64 153.091167 -2009-08-24T22:24:45 -27.65 153.091232 -2009-08-24T22:24:46 -27.65 153.091298 -2009-08-24T22:24:47 -27.65 153.091366 -2009-08-24T22:24:48 -27.65 153.091435 -2009-08-24T22:24:49 -27.66 153.091507 -2009-08-24T22:24:50 -27.67 153.091581 -2009-08-24T22:24:51 -27.68 153.091654 -2009-08-24T22:24:52 -27.69 153.091729 -2009-08-24T22:24:53 -27.70 153.091800 -2009-08-24T22:24:54 -27.71 153.091870 -2009-08-24T22:24:55 -27.72 153.091940 -2009-08-24T22:24:56 -27.73 153.092010 -2009-08-24T22:24:57 -27.74 153.092078 -2009-08-24T22:24:58 -27.75 153.092144 -2009-08-24T22:24:59 -27.78 153.092218 -2009-08-24T22:25:00 -27.79 153.092308 -2009-08-24T22:25:01 -27.80 153.092415 -2009-08-24T22:25:02 -27.81 153.092530 -2009-08-24T22:25:03 -27.82 153.092648 -2009-08-24T22:25:04 -27.83 153.092763 -2009-08-24T22:25:05 -27.84 153.092879 -2009-08-24T22:25:06 -27.85 153.092990 -2009-08-24T22:25:07 -27.84 153.093099 -2009-08-24T22:25:08 -27.83 153.093204 -2009-08-24T22:25:09 -27.82 153.093303 -2009-08-24T22:25:10 -27.81 153.093396 -2009-08-24T22:25:11 -27.80 153.093484 -2009-08-24T22:25:12 -27.79 153.093568 -2009-08-24T22:25:13 -27.78 153.093647 -2009-08-24T22:25:14 -27.77 153.093727 -2009-08-24T22:25:15 -27.76 153.093810 -2009-08-24T22:25:16 -27.75 153.093896 -2009-08-24T22:25:17 -27.74 153.093984 -2009-08-24T22:25:18 -27.72 153.094074 -2009-08-24T22:25:19 -27.70 153.094168 -2009-08-24T22:25:20 -27.71 153.094267 -2009-08-24T22:25:21 -27.69 153.094370 -2009-08-24T22:25:22 -27.68 153.094474 -2009-08-24T22:25:23 -27.67 153.094581 -2009-08-24T22:25:24 -27.66 153.094688 -2009-08-24T22:25:25 -27.65 153.094796 -2009-08-24T22:25:26 -27.64 153.094905 -2009-08-24T22:25:27 -27.63 153.095012 -2009-08-24T22:25:28 -27.62 153.095121 -2009-08-24T22:25:29 -27.61 153.095231 -2009-08-24T22:25:30 -27.60 153.095340 -2009-08-24T22:25:31 -27.59 153.095449 -2009-08-24T22:25:32 -27.58 153.095558 -2009-08-24T22:25:33 -27.57 153.095667 -2009-08-24T22:25:34 -27.56 153.095776 -2009-08-24T22:25:35 -27.55 153.095885 -2009-08-24T22:25:36 -27.54 153.095995 -2009-08-24T22:25:37 -27.53 153.096109 -2009-08-24T22:25:38 -27.52 153.096226 -2009-08-24T22:25:39 -27.51 153.096337 -2009-08-24T22:25:40 -27.50 153.096441 -2009-08-24T22:25:41 -27.49 153.096537 -2009-08-24T22:25:42 -27.48 153.096628 -2009-08-24T22:25:43 -27.47 153.096714 -2009-08-24T22:25:44 -27.46 153.096795 -2009-08-24T22:25:45 -27.45 153.096847 -2009-08-24T22:25:46 -27.44 153.096855 -2009-08-24T22:25:47 -27.43 153.096873 -2009-08-24T22:25:48 -27.42 153.096875 -2009-08-24T22:25:49 -27.41 153.096878 -2009-08-24T22:25:50 -27.40 153.096880 -2009-08-24T22:25:51 -27.39 153.096880 -2009-08-24T22:25:52 -27.38 153.096881 -2009-08-24T22:25:53 -27.37 153.096882 -2009-08-24T22:25:54 -27.36 153.096883 -2009-08-24T22:25:55 -27.35 153.096883 -2009-08-24T22:25:56 -27.34 153.096883 -2009-08-24T22:25:57 -27.33 153.096890 -2009-08-24T22:25:58 -27.32 153.096919 -2009-08-24T22:25:59 -27.31 153.096985 -2009-08-24T22:26:00 -27.30 153.097060 diff --git a/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp b/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp deleted file mode 100644 index 77d433fd..00000000 --- a/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp +++ /dev/null @@ -1,977 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//TESTED_COMPONENT=src/location - -#include <QTest> -#include <QMetaType> -#include <QSignalSpy> - -#include <limits.h> -#include <float.h> - -#include <QDebug> -#include <QDataStream> -#include <QFile> - -#include <QtPositioning/qgeoareamonitorinfo.h> -#include <QtPositioning/qgeoareamonitorsource.h> -#include <QtPositioning/qgeopositioninfo.h> -#include <QtPositioning/qgeopositioninfosource.h> -#include <QtPositioning/qnmeapositioninfosource.h> -#include <QtPositioning/qgeocircle.h> -#include <QtPositioning/qgeorectangle.h> - -#include "logfilepositionsource.h" -#include "positionconsumerthread.h" - -QT_USE_NAMESPACE -#define UPDATE_INTERVAL 50 - -QString tst_qgeoareamonitorinfo_debug; - -void tst_qgeoareamonitorinfo_messageHandler(QtMsgType type, - const QMessageLogContext &, - const QString &msg) -{ - switch (type) { - case QtDebugMsg : - tst_qgeoareamonitorinfo_debug = msg; - break; - default: - break; - } -} - -static QList<QByteArray> readFileData(const QString &fileName) -{ - QList<QByteArray> data; - QFile logFile(fileName); - if (logFile.open(QIODevice::ReadOnly)) { - data = logFile.readAll().split('\n'); - logFile.close(); - } else { - qWarning() << "Error: cannot open source file" << logFile.fileName(); - } - return data; -} - -class DummyMonitorSource : public QGeoAreaMonitorSource -{ - Q_OBJECT -public: - static const QString kTestProperty; - - DummyMonitorSource(QObject *parent = nullptr) : QGeoAreaMonitorSource(parent) - {} - - Error error() const override - { - return NoError; - } - AreaMonitorFeatures supportedAreaMonitorFeatures() const override - { - return AnyAreaMonitorFeature; - } - - bool startMonitoring(const QGeoAreaMonitorInfo &monitor) override - { - Q_UNUSED(monitor); - return false; - } - bool stopMonitoring(const QGeoAreaMonitorInfo &monitor) override - { - Q_UNUSED(monitor); - return false; - } - bool requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) override - { - Q_UNUSED(monitor); - Q_UNUSED(signal); - return false; - } - - QList<QGeoAreaMonitorInfo> activeMonitors() const override - { - return {}; - } - QList<QGeoAreaMonitorInfo> activeMonitors(const QGeoShape &lookupArea) const override - { - Q_UNUSED(lookupArea); - return {}; - } - - bool setBackendProperty(const QString &name, const QVariant &value) override - { - if (name == kTestProperty) { - m_testPropertyValue = value.toInt(); - return true; - } - return false; - } - QVariant backendProperty(const QString &name) const override - { - if (name == kTestProperty) - return m_testPropertyValue; - return QVariant(); - } - -private: - int m_testPropertyValue = 0; -}; - -const QString DummyMonitorSource::kTestProperty = "TestProperty"; - -class tst_QGeoAreaMonitorSource : public QObject -{ - Q_OBJECT - -private: - QList<QByteArray> m_fileData; - -private slots: - void initTestCase() - { -#if QT_CONFIG(library) - /* - * Set custom path since CI doesn't install plugins - */ -#ifdef Q_OS_WIN - QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + - QStringLiteral("/../../../../plugins")); -#else - QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() - + QStringLiteral("/../../../plugins")); -#endif -#endif - qRegisterMetaType<QGeoAreaMonitorInfo>(); - m_fileData = readFileData(QFINDTESTDATA("simplelog.txt")); - } - - void init() - { - } - - void cleanup() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - - QList<QGeoAreaMonitorInfo> list = obj->activeMonitors(); - if (list.count() > 0) { - //cleanup installed monitors - foreach (const QGeoAreaMonitorInfo& info, list) { - QVERIFY(obj->stopMonitoring(info)); - } - } - QVERIFY(obj->activeMonitors().count() == 0); - } - - void cleanupTestCase() - { - } - - void tst_monitor() - { - QGeoAreaMonitorInfo defaultMonitor; - QVERIFY(defaultMonitor.name().isEmpty()); - QVERIFY(!defaultMonitor.identifier().isEmpty()); - QCOMPARE(defaultMonitor.isPersistent(), false); - QVERIFY(!defaultMonitor.area().isValid()); - QVERIFY(!defaultMonitor.isValid()); - QCOMPARE(defaultMonitor.expiration(), QDateTime()); - QCOMPARE(defaultMonitor.notificationParameters(), QVariantMap()); - - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - QVERIFY(!obj->startMonitoring(defaultMonitor)); - QCOMPARE(obj->activeMonitors().count(), 0); - QVERIFY(!obj->requestUpdate(defaultMonitor, - SIGNAL(areaEntered(QGeoMonitorInfo,QGeoAreaPositionInfo)))); - - //copy constructor based - QGeoAreaMonitorInfo copy(defaultMonitor); - QVERIFY(copy.name().isEmpty()); - QCOMPARE(copy.identifier(), defaultMonitor.identifier()); - QVERIFY(copy == defaultMonitor); - QVERIFY(!(copy != defaultMonitor)); - QCOMPARE(copy.isPersistent(), false); - - copy.setName(QString("my name")); - QCOMPARE(copy.name(), QString("my name")); - - - QDateTime now = QDateTime::currentDateTime().addSecs(1000); //little bit in the future - copy.setExpiration(now); - QVERIFY(copy != defaultMonitor); - QCOMPARE(copy.expiration(), now); - - QCOMPARE(copy.isPersistent(), defaultMonitor.isPersistent()); - copy.setPersistent(true); - QCOMPARE(copy.isPersistent(), true); - QCOMPARE(defaultMonitor.isPersistent(), false); - copy.setPersistent(false); - - QVERIFY(copy.area() == defaultMonitor.area()); - QVERIFY(!copy.area().isValid()); - copy.setArea(QGeoCircle(QGeoCoordinate(1, 2), 4)); - QVERIFY(copy.area().isValid()); - QVERIFY(copy.area() != defaultMonitor.area()); - QVERIFY(copy.area().contains(QGeoCoordinate(1, 2))); - - QVERIFY(copy.notificationParameters().isEmpty()); - QVariantMap map; - map.insert(QString("MyKey"), QVariant(123)); - copy.setNotificationParameters(map); - QVERIFY(!copy.notificationParameters().isEmpty()); - QCOMPARE(copy.notificationParameters().value(QString("MyKey")).toInt(), 123); - QCOMPARE(defaultMonitor.notificationParameters().value(QString("MyKey")).toInt(), 0); - - QCOMPARE(defaultMonitor.identifier(), copy.identifier()); - - //assignment operator based - QGeoAreaMonitorInfo assignmentCopy; - assignmentCopy = copy; - QVERIFY(copy == assignmentCopy); - QVERIFY(assignmentCopy != defaultMonitor); - - QVERIFY(assignmentCopy.area().contains(QGeoCoordinate(1, 2))); - QCOMPARE(assignmentCopy.expiration(), now); - QCOMPARE(assignmentCopy.isPersistent(), false); - QCOMPARE(assignmentCopy.notificationParameters().value(QString("MyKey")).toInt(), 123); - QCOMPARE(defaultMonitor.identifier(), assignmentCopy.identifier()); - QCOMPARE(assignmentCopy.name(), QString("my name")); - - //validity checks for requestUpdate() - obj.reset(QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - QCOMPARE(obj->activeMonitors().count(), 0); - //reference -> should work - QVERIFY(obj->requestUpdate(copy, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - QCOMPARE(obj->activeMonitors().count(), 1); - //replaces areaEntered single shot - QVERIFY(obj->requestUpdate(copy, SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - QCOMPARE(obj->activeMonitors().count(), 1); - //replaces areaExited single shot - QVERIFY(obj->startMonitoring(copy)); - QCOMPARE(obj->activeMonitors().count(), 1); - - - //invalid signal - QVERIFY(!obj->requestUpdate(copy, 0)); - QCOMPARE(obj->activeMonitors().count(), 1); - - //signal that doesn't exist - QVERIFY(!obj->requestUpdate(copy, SIGNAL(areaEntered(QGeoMonitor)))); - QCOMPARE(obj->activeMonitors().count(), 1); - - QVERIFY(!obj->requestUpdate(copy, "SIGNAL(areaEntered(QGeoMonitor))")); - QCOMPARE(obj->activeMonitors().count(), 1); - - //ensure that we cannot add a persistent monitor to a source - //that doesn't support persistence - QGeoAreaMonitorInfo persistenceMonitor(copy); - persistenceMonitor.setPersistent(obj->supportedAreaMonitorFeatures() & QGeoAreaMonitorSource::PersistentAreaMonitorFeature); - persistenceMonitor.setPersistent(!persistenceMonitor.isPersistent()); - - QVERIFY(!obj->requestUpdate(persistenceMonitor, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - QCOMPARE(obj->activeMonitors().count(), 1); - QVERIFY(!obj->startMonitoring(persistenceMonitor)); - QCOMPARE(obj->activeMonitors().count(), 1); - - //ensure that persistence was only reason for rejection - persistenceMonitor.setPersistent(!persistenceMonitor.isPersistent()); - QVERIFY(obj->startMonitoring(persistenceMonitor)); - //persistenceMonitor is copy of already added monitor - //the last call was an update - QCOMPARE(obj->activeMonitors().count(), 1); - } - - void tst_monitor_move_semantics() - { - QGeoAreaMonitorInfo info1("test"); - info1.setArea(QGeoCircle(QGeoCoordinate(1.0, 1.0), 100)); - info1.setExpiration(QDateTime::currentDateTimeUtc()); - QGeoAreaMonitorInfo infoCopy(info1); - - QGeoAreaMonitorInfo info2(std::move(info1)); - QCOMPARE(info2, infoCopy); - - QGeoAreaMonitorInfo info3; - info3.setName("name"); - info3.setArea(QGeoRectangle(QGeoCoordinate(1, 2), QGeoCoordinate(2, 1))); - info3.setPersistent(true); - infoCopy = info3; - - // check that (move)assigning to the moved-from object is ok - info1 = std::move(info3); - QCOMPARE(info1, infoCopy); - - // The moved-from object info3 will go out of scope and will be - // destroyed here, so we also implicitly check that moved-from object's - // destructor is called without any issues. - } - - void tst_monitorValid() - { - QGeoAreaMonitorInfo mon; - QVERIFY(!mon.isValid()); - QCOMPARE(mon.name(), QString()); - QCOMPARE(mon.area().isValid(), false); - - QGeoAreaMonitorInfo mon2 = mon; - QVERIFY(!mon2.isValid()); - - QGeoShape invalidShape; - QGeoCircle emptyCircle(QGeoCoordinate(0,1), 0); - QGeoCircle validCircle(QGeoCoordinate(0,1), 1); - - //all invalid since no name set yet - mon2.setArea(invalidShape); - QVERIFY(mon2.area() == invalidShape); - QVERIFY(!mon2.isValid()); - - mon2.setArea(emptyCircle); - QVERIFY(mon2.area() == emptyCircle); - QVERIFY(!mon2.isValid()); - - mon2.setArea(validCircle); - QVERIFY(mon2.area() == validCircle); - QVERIFY(!mon2.isValid()); - - //valid since name and non-empy shape has been set - QGeoAreaMonitorInfo validMonitor("TestMonitor"); - QVERIFY(validMonitor.name() == QString("TestMonitor")); - QVERIFY(!validMonitor.isValid()); - - validMonitor.setArea(invalidShape); - QVERIFY(validMonitor.area() == invalidShape); - QVERIFY(!validMonitor.isValid()); - - validMonitor.setArea(emptyCircle); - QVERIFY(validMonitor.area() == emptyCircle); - QVERIFY(!validMonitor.isValid()); - - validMonitor.setArea(validCircle); - QVERIFY(validCircle == validMonitor.area()); - QVERIFY(validMonitor.isValid()); - } - - void tst_monitorStreaming() - { - QByteArray container; - QDataStream stream(&container, QIODevice::ReadWrite); - - QGeoAreaMonitorInfo monitor("someName"); - monitor.setArea(QGeoCircle(QGeoCoordinate(1,3), 5.4)); - const QDateTime expirationTime = QDateTime::currentDateTime().addSecs(60); - monitor.setExpiration(expirationTime); - monitor.setPersistent(true); - const QVariantMap params { {"string_param", "some string"}, - {"int_param", 1}, {"double_param", 3.5} }; - monitor.setNotificationParameters(params); - QVERIFY(monitor.isValid()); - QCOMPARE(monitor.name(), QString("someName")); - QCOMPARE(monitor.expiration(), expirationTime); - QVERIFY(monitor.isPersistent()); - QCOMPARE(monitor.notificationParameters(), params); - - QGeoAreaMonitorInfo target; - QVERIFY(!target.isValid()); - QVERIFY(target.name().isEmpty()); - - QVERIFY(target != monitor); - - stream << monitor; - stream.device()->seek(0); - stream >> target; - - QVERIFY(target == monitor); - QVERIFY(target.isValid()); - QCOMPARE(target.name(), QString("someName")); - QVERIFY(target.area() == QGeoCircle(QGeoCoordinate(1,3), 5.4)); - QCOMPARE(target.expiration(), expirationTime); - QVERIFY(target.isPersistent()); - QCOMPARE(target.notificationParameters(), params); - } - - void tst_createDefaultSource() - { - std::unique_ptr<QObject> parent(new QObject); - - // Have to use a raw pointer here, because otherwise we'd end up - // deleting the obj twice when deleting the parent - QGeoAreaMonitorSource *obj = QGeoAreaMonitorSource::createDefaultSource(parent.get()); - QVERIFY(obj != nullptr); - QVERIFY(obj->parent() == parent.get()); - delete obj; - - const QStringList monitors = QGeoAreaMonitorSource::availableSources(); - QVERIFY(!monitors.isEmpty()); - QVERIFY(monitors.contains(QStringLiteral("positionpoll"))); - - obj = QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), parent.get()); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - parent.reset(); - - // using a smart pointer will cause a double delete here - obj = QGeoAreaMonitorSource::createSource(QStringLiteral("randomNonExistingName"), 0); - QVERIFY(obj == nullptr); - } - - void tst_activeMonitors() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - - // using this -> no need for smart pointer - LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); - source->setUpdateInterval(UPDATE_INTERVAL); - obj->setPositionInfoSource(source); - QCOMPARE(obj->positionInfoSource(), source); - - - QVERIFY(obj->activeMonitors().isEmpty()); - - QGeoAreaMonitorInfo mon("Monitor_Circle"); - mon.setArea(QGeoCircle(QGeoCoordinate(1,1), 1000)); - QVERIFY(obj->startMonitoring(mon)); - - QGeoAreaMonitorInfo mon2("Monitor_rectangle_below"); - QGeoRectangle r_below(QGeoCoordinate(1,1),2,2); - mon2.setArea(r_below); - QVERIFY(obj->startMonitoring(mon2)); - - QGeoAreaMonitorInfo mon3("Monitor_rectangle_above"); - QGeoRectangle r_above(QGeoCoordinate(2,1),2,2); - mon3.setArea(r_above); - QVERIFY(obj->startMonitoring(mon3)); - - QList<QGeoAreaMonitorInfo> results = obj->activeMonitors(); - QCOMPARE(results.count(), 3); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2 || info == mon3); - } - - results = obj->activeMonitors(QGeoShape()); - QCOMPARE(results.count(), 0); - - results = obj->activeMonitors(QGeoRectangle(QGeoCoordinate(1,1),0.2, 0.2)); - QCOMPARE(results.count(), 2); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2); - } - - results = obj->activeMonitors(QGeoCircle(QGeoCoordinate(1,1),1000)); - QCOMPARE(results.count(), 2); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2); - } - - results = obj->activeMonitors(QGeoCircle(QGeoCoordinate(2,1),1000)); - QCOMPARE(results.count(), 1); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon3); - } - - //same as above except that we use a different monitor source object instance - //all monitor objects of same type share same active monitors - std::unique_ptr<QGeoAreaMonitorSource> secondObj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(secondObj != nullptr); - QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); - - results = secondObj->activeMonitors(); - QCOMPARE(results.count(), 3); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2 || info == mon3); - } - - results = secondObj->activeMonitors(QGeoShape()); - QCOMPARE(results.count(), 0); - - results = secondObj->activeMonitors(QGeoRectangle(QGeoCoordinate(1,1),0.2, 0.2)); - QCOMPARE(results.count(), 2); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2); - } - - results = secondObj->activeMonitors(QGeoCircle(QGeoCoordinate(1,1),1000)); - QCOMPARE(results.count(), 2); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon || info == mon2); - } - - results = secondObj->activeMonitors(QGeoCircle(QGeoCoordinate(2,1),1000)); - QCOMPARE(results.count(), 1); - foreach (const QGeoAreaMonitorInfo& info, results) { - QVERIFY(info == mon3); - } - } - - void tst_testExpiryTimeout() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - - std::unique_ptr<QGeoAreaMonitorSource> secondObj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(secondObj != nullptr); - QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); - - // using this -> no need for smart pointer - LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); - source->setUpdateInterval(UPDATE_INTERVAL); - obj->setPositionInfoSource(source); - - //Singleton pattern behind QGeoAreaMonitorSource ensures same position info source - QCOMPARE(obj->positionInfoSource(), source); - QCOMPARE(secondObj->positionInfoSource(), source); - - QSignalSpy expirySpy(obj.get(), SIGNAL(monitorExpired(QGeoAreaMonitorInfo))); - QSignalSpy expirySpy2(secondObj.get(), SIGNAL(monitorExpired(QGeoAreaMonitorInfo))); - - QDateTime now = QDateTime::currentDateTime(); - - const int monitorCount = 4; - for (int i = 1; i <= monitorCount; i++) { - QGeoAreaMonitorInfo mon(QString::number(i)); - mon.setArea(QGeoRectangle(QGeoCoordinate(i,i), i, i)); - mon.setExpiration(now.addSecs(i*2)); - QVERIFY(mon.isValid()); - QVERIFY(obj->startMonitoring(mon)); - } - - - - QCOMPARE(obj->activeMonitors().count(), monitorCount); - QCOMPARE(secondObj->activeMonitors().count(), monitorCount); - - QGeoAreaMonitorInfo info("InvalidExpiry"); - info.setArea(QGeoRectangle(QGeoCoordinate(10,10), 1, 1 )); - QVERIFY(info.isValid()); - info.setExpiration(now.addSecs(-1000)); - QVERIFY(info.expiration() < now); - QVERIFY(!obj->startMonitoring(info)); - QCOMPARE(obj->activeMonitors().count(), monitorCount); - QVERIFY(!obj->requestUpdate(info, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - QCOMPARE(obj->activeMonitors().count(), monitorCount); - - for (int i = 1; i <= monitorCount; i++) { - QTRY_VERIFY_WITH_TIMEOUT(expirySpy.count() == 1, 3000); //each expiry within 2 s - QGeoAreaMonitorInfo mon = expirySpy.takeFirst().at(0).value<QGeoAreaMonitorInfo>(); - QCOMPARE(obj->activeMonitors().count(), monitorCount-i); - QCOMPARE(mon.name(), QString::number(i)); - } - - QCOMPARE(expirySpy2.count(), monitorCount); - QCOMPARE(secondObj->activeMonitors().count(), 0); //all monitors expired - for (int i = 1; i <= monitorCount; i++) { - QGeoAreaMonitorInfo mon = expirySpy2.takeFirst().at(0).value<QGeoAreaMonitorInfo>(); - QCOMPARE(mon.name(), QString::number(i)); - } - } - - void tst_enteredExitedSignal() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - obj->setObjectName("firstObject"); - QSignalSpy enteredSpy(obj.get(), - SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); - QSignalSpy exitedSpy(obj.get(), SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); - - // using this -> no need for smart pointer - LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); - source->setUpdateInterval(UPDATE_INTERVAL); - obj->setPositionInfoSource(source); - QCOMPARE(obj->positionInfoSource(), source); - - std::unique_ptr<QGeoAreaMonitorSource> secondObj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(secondObj != nullptr); - QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); - QSignalSpy enteredSpy2(secondObj.get(), - SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); - QSignalSpy exitedSpy2(secondObj.get(), - SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); - secondObj->setObjectName("secondObject"); - - QGeoAreaMonitorInfo infoRectangle("Rectangle"); - infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.65, 153.093), 0.2, 0.2)); - QVERIFY(infoRectangle.isValid()); - QVERIFY(obj->startMonitoring(infoRectangle)); - - QGeoAreaMonitorInfo infoCircle("Circle"); - infoCircle.setArea(QGeoCircle(QGeoCoordinate(-27.70, 153.093),10000)); - QVERIFY(infoCircle.isValid()); - QVERIFY(obj->startMonitoring(infoCircle)); - - QGeoAreaMonitorInfo singleShot_enter("SingleShot_on_Entered"); - singleShot_enter.setArea(QGeoRectangle(QGeoCoordinate(-27.67, 153.093), 0.2, 0.2)); - QVERIFY(singleShot_enter.isValid()); - QVERIFY(obj->requestUpdate(singleShot_enter, - SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - - QGeoAreaMonitorInfo singleShot_exit("SingleShot_on_Exited"); - singleShot_exit.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.093), 0.2, 0.2)); - QVERIFY(singleShot_exit.isValid()); - QVERIFY(obj->requestUpdate(singleShot_exit, - SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)))); - - QVERIFY(obj->activeMonitors().count() == 4); //all monitors active - QVERIFY(secondObj->activeMonitors().count() == 4); //all monitors active - - static const int Number_Of_Entered_Events = 6; - static const int Number_Of_Exited_Events = 5; - //takes 87 (lines)*50(timeout)/1000 seconds to finish - QTRY_VERIFY_WITH_TIMEOUT(enteredSpy.count() == Number_Of_Entered_Events, 5000); - QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.count() == Number_Of_Exited_Events, 5000); - QCOMPARE(enteredSpy.count(), Number_Of_Entered_Events); - QCOMPARE(exitedSpy.count(), Number_Of_Exited_Events); - - QList<QGeoAreaMonitorInfo> monitorsInExpectedEnteredEventOrder; - monitorsInExpectedEnteredEventOrder << infoRectangle << singleShot_enter << singleShot_exit - << infoCircle << infoCircle << infoRectangle; - - QList<QGeoAreaMonitorInfo> monitorsInExpectedExitedEventOrder; - monitorsInExpectedExitedEventOrder << infoRectangle << infoCircle - << singleShot_exit << infoCircle << infoRectangle; - - QList<QGeoCoordinate> enteredEventCoordinateOrder; - enteredEventCoordinateOrder << QGeoCoordinate(-27.55, 153.090718) //infoRectangle - << QGeoCoordinate(-27.57, 153.090718) //singleshot_enter - << QGeoCoordinate(-27.60, 153.090908) //singleshot_exit - << QGeoCoordinate(-27.62, 153.091036) //infoCircle - << QGeoCoordinate(-27.78, 153.093647) //infoCircle - << QGeoCoordinate(-27.75, 153.093896);//infoRectangle - QCOMPARE(enteredEventCoordinateOrder.count(), Number_Of_Entered_Events); - QCOMPARE(monitorsInExpectedEnteredEventOrder.count(), Number_Of_Entered_Events); - - QList<QGeoCoordinate> exitedEventCoordinateOrder; - exitedEventCoordinateOrder << QGeoCoordinate(-27.78, 153.092218) //infoRectangle - << QGeoCoordinate(-27.79, 153.092308) //infoCircle - << QGeoCoordinate(-27.81, 153.092530) //singleshot_exit - << QGeoCoordinate(-27.61, 153.095231) //infoCircle - << QGeoCoordinate(-27.54, 153.095995);//infoCircle - QCOMPARE(exitedEventCoordinateOrder.count(), Number_Of_Exited_Events); - QCOMPARE(monitorsInExpectedExitedEventOrder.count(), Number_Of_Exited_Events); - - //verify that both sources got the same signals - for (int i = 0; i < Number_Of_Entered_Events; i++) { - //first source - QGeoAreaMonitorInfo monInfo = enteredSpy.first().at(0).value<QGeoAreaMonitorInfo>(); - QGeoPositionInfo posInfo = enteredSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY2(monInfo == monitorsInExpectedEnteredEventOrder.at(i), - qPrintable(QString::number(i) + ": " + monInfo.name())); - QVERIFY2(posInfo.coordinate() == enteredEventCoordinateOrder.at(i), - qPrintable(QString::number(i) + ". posInfo")); - - //reset info objects to avoid comparing the same - monInfo = QGeoAreaMonitorInfo(); - posInfo = QGeoPositionInfo(); - - //second source - monInfo = enteredSpy2.first().at(0).value<QGeoAreaMonitorInfo>(); - posInfo = enteredSpy2.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY2(monInfo == monitorsInExpectedEnteredEventOrder.at(i), - qPrintable(QString::number(i) + ": " + monInfo.name())); - QVERIFY2(posInfo.coordinate() == enteredEventCoordinateOrder.at(i), - qPrintable(QString::number(i) + ". posInfo")); - } - - for (int i = 0; i < Number_Of_Exited_Events; i++) { - //first source - QGeoAreaMonitorInfo monInfo = exitedSpy.first().at(0).value<QGeoAreaMonitorInfo>(); - QGeoPositionInfo posInfo = exitedSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY2(monInfo == monitorsInExpectedExitedEventOrder.at(i), - qPrintable(QString::number(i) + ": " + monInfo.name())); - QVERIFY2(posInfo.coordinate() == exitedEventCoordinateOrder.at(i), - qPrintable(QString::number(i) + ". posInfo")); - - //reset info objects to avoid comparing the same - monInfo = QGeoAreaMonitorInfo(); - posInfo = QGeoPositionInfo(); - - //second source - monInfo = exitedSpy2.first().at(0).value<QGeoAreaMonitorInfo>(); - posInfo = exitedSpy2.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY2(monInfo == monitorsInExpectedExitedEventOrder.at(i), - qPrintable(QString::number(i) + ": " + monInfo.name())); - QVERIFY2(posInfo.coordinate() == exitedEventCoordinateOrder.at(i), - qPrintable(QString::number(i) + ". posInfo")); - } - - QCOMPARE(obj->activeMonitors().count(), 2); //single shot monitors have been removed - QCOMPARE(secondObj->activeMonitors().count(), 2); - } - - void tst_swapOfPositionSource() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - obj->setObjectName("firstObject"); - QSignalSpy enteredSpy(obj.get(), - SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); - QSignalSpy exitedSpy(obj.get(), SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); - - std::unique_ptr<QGeoAreaMonitorSource> obj2( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj2 != nullptr); - QCOMPARE(obj2->sourceName(), QStringLiteral("positionpoll")); - obj2->setObjectName("secondObject"); - QSignalSpy enteredSpy2(obj2.get(), - SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); - QSignalSpy exitedSpy2(obj2.get(), - SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); - - // using this -> no need for smart pointer - LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); - source->setUpdateInterval(UPDATE_INTERVAL); - source->setObjectName("FirstLogFileSource"); - - // using this -> no need for smart pointer - LogFilePositionSource *source2 = new LogFilePositionSource(m_fileData, this); - source2->setUpdateInterval(UPDATE_INTERVAL); - source2->setObjectName("SecondLogFileSource"); - - obj->setPositionInfoSource(source); - QCOMPARE(obj->positionInfoSource(), obj2->positionInfoSource()); - QCOMPARE(obj2->positionInfoSource(), source); - - QGeoAreaMonitorInfo infoRectangle("Rectangle"); - infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.092), 0.2, 0.2)); - QVERIFY(infoRectangle.isValid()); - QVERIFY(obj->startMonitoring(infoRectangle)); - - QCOMPARE(obj->activeMonitors().count(), 1); - QCOMPARE(obj2->activeMonitors().count(), 1); - - QGeoCoordinate firstBorder(-27.6, 153.090908); - QGeoCoordinate secondBorder(-27.81, 153.092530); - - /***********************************/ - //1. trigger events on source (until areaExit - QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.count() == 1, 5000); - QCOMPARE(enteredSpy.count(), enteredSpy2.count()); - QCOMPARE(exitedSpy.count(), exitedSpy2.count()); - - //compare entered event - QVERIFY(enteredSpy.first().at(0).value<QGeoAreaMonitorInfo>() == - enteredSpy2.first().at(0).value<QGeoAreaMonitorInfo>()); - QGeoPositionInfo info = enteredSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY(info == enteredSpy2.takeFirst().at(1).value<QGeoPositionInfo>()); - QVERIFY(info.coordinate() == firstBorder); - //compare exit event - QVERIFY(exitedSpy.first().at(0).value<QGeoAreaMonitorInfo>() == - exitedSpy2.first().at(0).value<QGeoAreaMonitorInfo>()); - info = exitedSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY(info == exitedSpy2.takeFirst().at(1).value<QGeoPositionInfo>()); - QVERIFY(info.coordinate() == secondBorder); - - QCOMPARE(exitedSpy.count(), 0); - QCOMPARE(enteredSpy.count(), 0); - QCOMPARE(exitedSpy2.count(), 0); - QCOMPARE(enteredSpy2.count(), 0); - - /***********************************/ - //2. change position source -> which restarts at beginning again - obj2->setPositionInfoSource(source2); - QCOMPARE(obj->positionInfoSource(), obj2->positionInfoSource()); - QCOMPARE(obj2->positionInfoSource(), source2); - - QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.count() == 1, 5000); - QCOMPARE(enteredSpy.count(), enteredSpy2.count()); - QCOMPARE(exitedSpy.count(), exitedSpy2.count()); - - //compare entered event - QVERIFY(enteredSpy.first().at(0).value<QGeoAreaMonitorInfo>() == - enteredSpy2.first().at(0).value<QGeoAreaMonitorInfo>()); - info = enteredSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY(info == enteredSpy2.takeFirst().at(1).value<QGeoPositionInfo>()); - QVERIFY(info.coordinate() == firstBorder); - //compare exit event - QVERIFY(exitedSpy.first().at(0).value<QGeoAreaMonitorInfo>() == - exitedSpy2.first().at(0).value<QGeoAreaMonitorInfo>()); - info = exitedSpy.takeFirst().at(1).value<QGeoPositionInfo>(); - QVERIFY(info == exitedSpy2.takeFirst().at(1).value<QGeoPositionInfo>()); - QVERIFY(info.coordinate() == secondBorder); - } - - void debug_data() - { - QTest::addColumn<QGeoAreaMonitorInfo>("info"); - QTest::addColumn<int>("nextValue"); - QTest::addColumn<QString>("debugString"); - - QGeoAreaMonitorInfo info; - QTest::newRow("uninitialized") << info << 45 - << QString("QGeoAreaMonitorInfo(\"\", QGeoShape(Unknown), " - "persistent: false, expiry: QDateTime(Invalid)) 45"); - - info.setArea(QGeoRectangle()); - info.setPersistent(true); - info.setName("RectangleAreaMonitor"); - QTest::newRow("Rectangle Test") << info << 45 - << QString("QGeoAreaMonitorInfo(\"RectangleAreaMonitor\", QGeoShape(Rectangle), " - "persistent: true, expiry: QDateTime(Invalid)) 45"); - - info = QGeoAreaMonitorInfo(); - info.setArea(QGeoCircle()); - info.setPersistent(false); - info.setName("CircleAreaMonitor"); - QVariantMap map; - map.insert(QString("foobarKey"), QVariant(45)); //should be ignored - info.setNotificationParameters(map); - QTest::newRow("Circle Test") << info << 45 - << QString("QGeoAreaMonitorInfo(\"CircleAreaMonitor\", QGeoShape(Circle), " - "persistent: false, expiry: QDateTime(Invalid)) 45"); - - // we ignore any further QDateTime related changes to avoid depending on QDateTime related - // failures in case its QDebug string changes - } - - void debug() - { - QFETCH(QGeoAreaMonitorInfo, info); - QFETCH(int, nextValue); - QFETCH(QString, debugString); - - qInstallMessageHandler(tst_qgeoareamonitorinfo_messageHandler); - qDebug() << info << nextValue; - qInstallMessageHandler(0); - QCOMPARE(tst_qgeoareamonitorinfo_debug, debugString); - } - - void multipleThreads() - { - std::unique_ptr<QGeoAreaMonitorSource> obj( - QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); - QVERIFY(obj != nullptr); - QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); - - QVERIFY(obj->activeMonitors().isEmpty()); - - LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); - source->setUpdateInterval(UPDATE_INTERVAL); - obj->setPositionInfoSource(source); - QCOMPARE(obj->positionInfoSource(), source); - - QSignalSpy noDataSpy(source, &LogFilePositionSource::noDataLeft); - QSignalSpy updatesStartedSpy(source, &LogFilePositionSource::updatesStarted); - QSignalSpy updatesStoppedSpy(source, &LogFilePositionSource::updatesStopped); - - // generate threads - const int threadCount = 10; - QList<PositionConsumerThread *> threads; - for (int i = 0; i < threadCount; ++i) { - auto threadObj = new PositionConsumerThread(obj.get(), this); - threadObj->start(); - threads.push_back(threadObj); - } - - // generate objects to monitor - QGeoAreaMonitorInfo infoRectangle("Rectangle"); - infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.65, 153.093), 0.2, 0.2)); - QVERIFY(infoRectangle.isValid()); - QVERIFY(obj->startMonitoring(infoRectangle)); - - QGeoAreaMonitorInfo infoCircle("Circle"); - infoCircle.setArea(QGeoCircle(QGeoCoordinate(-27.70, 153.093), 10000)); - QVERIFY(infoCircle.isValid()); - QVERIFY(obj->startMonitoring(infoCircle)); - - QGeoAreaMonitorInfo singleShot_enter("SingleShot_on_Entered"); - singleShot_enter.setArea(QGeoRectangle(QGeoCoordinate(-27.67, 153.093), 0.2, 0.2)); - QVERIFY(singleShot_enter.isValid()); - QVERIFY(obj->requestUpdate(singleShot_enter, - SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo)))); - - QGeoAreaMonitorInfo singleShot_exit("SingleShot_on_Exited"); - singleShot_exit.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.093), 0.2, 0.2)); - QVERIFY(singleShot_exit.isValid()); - QVERIFY(obj->requestUpdate(singleShot_exit, - SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo)))); - - // wait until we read all data - QTRY_COMPARE_WITH_TIMEOUT(noDataSpy.count(), 1, 5000); - - // first request all the threads to terminate - for (int i = 0; i < threadCount; ++i) - threads[i]->stopProcessing(); - - static const int Number_Of_Entered_Events = 6; - static const int Number_Of_Exited_Events = 5; - // wait until each thread is stopped, and compare the result values - for (int i = 0; i < threadCount; ++i) { - threads[i]->wait(); - QCOMPARE(threads[i]->detectedEnterCount(), Number_Of_Entered_Events); - QCOMPARE(threads[i]->detectedExitCount(), Number_Of_Exited_Events); - } - - // Verify that the source started and stopped updates only once. - // This is needed to check that the connection tracking logic in - // connectNotify()/disconnectNotify() is working properly. - QCOMPARE(updatesStartedSpy.count(), 1); - QCOMPARE(updatesStoppedSpy.count(), 1); - } - - void backendProperties() - { - std::unique_ptr<QGeoAreaMonitorSource> obj = std::make_unique<DummyMonitorSource>(); - - const QString invalidProperty = "SomePropertyName"; - - QCOMPARE(obj->backendProperty(DummyMonitorSource::kTestProperty), 0); - QCOMPARE(obj->backendProperty(invalidProperty), QVariant()); - - QVERIFY(obj->setBackendProperty(DummyMonitorSource::kTestProperty, 10)); - QVERIFY(!obj->setBackendProperty(invalidProperty, 15)); - - QCOMPARE(obj->backendProperty(DummyMonitorSource::kTestProperty), 10); - QCOMPARE(obj->backendProperty(invalidProperty), QVariant()); - } -}; - - -QTEST_GUILESS_MAIN(tst_QGeoAreaMonitorSource) -#include "tst_qgeoareamonitor.moc" |