summaryrefslogtreecommitdiffstats
path: root/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp')
-rw-r--r--tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp345
1 files changed, 213 insertions, 132 deletions
diff --git a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
index af7f0354..b434cbff 100644
--- a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
+++ b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtBluetooth module 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QDebug>
#include <QVariant>
+#include "../../shared/bttestutil_p.h"
#include <private/qtbluetoothglobal_p.h>
#include <qbluetoothaddress.h>
@@ -67,15 +43,19 @@ private slots:
void tst_pairingStatus();
void tst_pairDevice_data();
void tst_pairDevice();
+ void tst_connectedDevices();
private:
QBluetoothAddress remoteDevice;
- bool expectRemoteDevice;
+ qsizetype numDevices = 0;
+ bool expectRemoteDevice = false;
};
tst_QBluetoothLocalDevice::tst_QBluetoothLocalDevice()
- : expectRemoteDevice(false)
{
+ if (androidBluetoothEmulator())
+ return;
+ numDevices = QBluetoothLocalDevice::allDevices().size();
const QString remote = qgetenv("BT_TEST_DEVICE");
if (!remote.isEmpty()) {
remoteDevice = QBluetoothAddress(remote);
@@ -84,13 +64,6 @@ tst_QBluetoothLocalDevice::tst_QBluetoothLocalDevice()
} else {
qWarning() << "Not using any remote device for testing. Set BT_TEST_DEVICE env to run manual tests involving a remote device";
}
-
- // start with host powered off
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
- delete device;
- // wait for the device to switch bluetooth mode.
- QTest::qWait(1000);
}
tst_QBluetoothLocalDevice::~tst_QBluetoothLocalDevice()
@@ -107,70 +80,101 @@ void tst_QBluetoothLocalDevice::initTestCase()
void tst_QBluetoothLocalDevice::tst_powerOn()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
+ if (numDevices == 0)
+ QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
+ if (localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff) {
+ // Ensure device is OFF so we can test switching it ON
+ localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
+ // On Android user may need to authorize the transition, hence a longer timeout
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal)
+ QTest::qWait(1000);
+ }
QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
- if (!QBluetoothLocalDevice::allDevices().count())
- QSKIP("Skipping test due to missing Bluetooth device");
-
localDevice.powerOn();
- // async, wait for it
- QTRY_VERIFY(hostModeSpy.count() > 0);
- QBluetoothLocalDevice::HostMode hostMode= localDevice.hostMode();
- // we should not be powered off
- QVERIFY(hostMode == QBluetoothLocalDevice::HostConnectable
- || hostMode == QBluetoothLocalDevice::HostDiscoverable);
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(!hostModeSpy.isEmpty(), 15000);
+ QVERIFY(localDevice.hostMode()
+ != QBluetoothLocalDevice::HostPoweredOff);
}
void tst_QBluetoothLocalDevice::tst_powerOff()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
-
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
- {
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->powerOn();
- delete device;
- // wait for the device to switch bluetooth mode.
+ QBluetoothLocalDevice localDevice;
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ // Ensure device is ON so we can test switching it OFF
+ localDevice.powerOn();
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ != QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal)
QTest::qWait(1000);
}
- QBluetoothLocalDevice localDevice;
+
QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
- // async, wait for it
- QTRY_VERIFY(hostModeSpy.count() > 0);
- // we should not be powered off
- QVERIFY(localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff);
-
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(!hostModeSpy.isEmpty(), 15000);
+ QVERIFY(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff);
}
void tst_QBluetoothLocalDevice::tst_hostModes_data()
{
QTest::addColumn<QBluetoothLocalDevice::HostMode>("hostModeExpected");
QTest::addColumn<bool>("expectSignal");
-
+#if defined(Q_OS_WIN)
+ // On Windows local device does not support HostDiscoverable as a separate mode
+ QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << false;
+ QTest::newRow("HostConnectable1") << QBluetoothLocalDevice::HostConnectable << true;
+ QTest::newRow("HostConnectable2") << QBluetoothLocalDevice::HostConnectable << false;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << false;
+ return;
+#elif defined(Q_OS_ANDROID)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() >= 31) {
+ // On Android-12 (API Level 31+) it seems the device's bluetooth visibility setting
+ // defines if we enter "HostDiscoverable" (visible true) or "HostConnectable"
+ // (visible false). Here we assume that the visibility setting is true. For lower
+ // Android versions the default testdata rows are fine
+ qDebug() << "On this Android version the bluetooth visibility setting is assumed true";
+ QTest::newRow("HostDiscoverable1") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostPoweredOff2") << QBluetoothLocalDevice::HostPoweredOff << false;
+ QTest::newRow("HostDiscoverable2") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostDiscoverable3") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostDiscoverable4") << QBluetoothLocalDevice::HostDiscoverable << false;
+ return;
+ }
+#endif
QTest::newRow("HostDiscoverable1") << QBluetoothLocalDevice::HostDiscoverable << true;
QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << true;
QTest::newRow("HostPoweredOff2") << QBluetoothLocalDevice::HostPoweredOff << false;
@@ -186,50 +190,66 @@ void tst_QBluetoothLocalDevice::tst_hostModes_data()
void tst_QBluetoothLocalDevice::tst_hostModes()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
-
QFETCH(QBluetoothLocalDevice::HostMode, hostModeExpected);
QFETCH(bool, expectSignal);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
- QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
+
+ static bool firstIteration = true;
+ if (firstIteration) {
+ // On the first iteration establish a known hostmode so that the test
+ // function can reliably test changes to it
+ firstIteration = false;
+ if (localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal).
+ QTest::qWait(1000);
+ }
+ }
+
+ QSignalSpy hostModeSpy(&localDevice,
+ SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
- QTest::qWait(1000);
+ // Switch the bluetooth mode and verify it changes
localDevice.setHostMode(hostModeExpected);
- // wait for the device to switch bluetooth mode.
+ // Manual interaction may be needed (for example on Android you may
+ // need to authorize a permission) => hence a longer timeout.
+ // If you see a fail on Android here, please see the comment in _data()
+ QTRY_COMPARE_WITH_TIMEOUT(localDevice.hostMode(), hostModeExpected, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal).
QTest::qWait(1000);
- if (hostModeExpected != localDevice.hostMode()) {
- QTRY_VERIFY(hostModeSpy.count() > 0);
- }
- // test the actual signal values.
- if (expectSignal)
- QVERIFY(hostModeSpy.count() > 0);
- else
- QVERIFY(hostModeSpy.count() == 0);
+ // Verify that signals are as expected
if (expectSignal) {
- QList<QVariant> arguments = hostModeSpy.takeLast();
- QBluetoothLocalDevice::HostMode hostMode = qvariant_cast<QBluetoothLocalDevice::HostMode>(arguments.at(0));
- QCOMPARE(hostModeExpected, hostMode);
+ QVERIFY(hostModeSpy.size() > 0);
+ // Verify that the last signal contained the right mode
+ auto arguments = hostModeSpy.takeLast();
+ auto hostMode = qvariant_cast<QBluetoothLocalDevice::HostMode>(arguments.at(0));
+ QCOMPARE(hostMode, hostModeExpected);
+ } else {
+ QCOMPARE(hostModeSpy.size(), 0);
}
- // test actual
- QCOMPARE(hostModeExpected, localDevice.hostMode());
}
void tst_QBluetoothLocalDevice::tst_address()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -238,7 +258,7 @@ void tst_QBluetoothLocalDevice::tst_address()
}
void tst_QBluetoothLocalDevice::tst_name()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -246,11 +266,13 @@ void tst_QBluetoothLocalDevice::tst_name()
}
void tst_QBluetoothLocalDevice::tst_isValid()
{
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
#if defined(Q_OS_MACOS) || QT_CONFIG(winrt_bt)
// On OS X we can have a valid device (device.isValid() == true),
// that has neither a name nor a valid address - this happens
// if a Bluetooth adapter is OFF.
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
#endif
@@ -258,10 +280,10 @@ void tst_QBluetoothLocalDevice::tst_isValid()
QBluetoothAddress invalidAddress("FF:FF:FF:FF:FF:FF");
const QList<QBluetoothHostInfo> devices = QBluetoothLocalDevice::allDevices();
- if (devices.count()) {
+ if (!devices.isEmpty()) {
QVERIFY(localDevice.isValid());
bool defaultFound = false;
- for (int i = 0; i<devices.count(); i++) {
+ for (qsizetype i = 0; i < devices.size(); ++i) {
QVERIFY(devices.at(i).address() != invalidAddress);
if (devices.at(i).address() == localDevice.address() ) {
defaultFound = true;
@@ -280,14 +302,8 @@ void tst_QBluetoothLocalDevice::tst_isValid()
QVERIFY(!invalidLocalDevice.isValid());
QCOMPARE(invalidLocalDevice.address(), QBluetoothAddress());
QCOMPARE(invalidLocalDevice.name(), QString());
-#if !QT_CONFIG(winrt_bt)
QCOMPARE(invalidLocalDevice.pairingStatus(QBluetoothAddress()), QBluetoothLocalDevice::Unpaired );
QCOMPARE(invalidLocalDevice.hostMode(), QBluetoothLocalDevice::HostPoweredOff);
-#else
- // When QTBUG-62294 is fixed, the pairingStatus part is consistent across platforms
- QCOMPARE(invalidLocalDevice.pairingStatus(QBluetoothAddress()), QBluetoothLocalDevice::Paired);
- QCOMPARE(invalidLocalDevice.hostMode(), QBluetoothLocalDevice::HostConnectable);
-#endif
}
void tst_QBluetoothLocalDevice::tst_allDevices()
@@ -296,7 +312,7 @@ void tst_QBluetoothLocalDevice::tst_allDevices()
}
void tst_QBluetoothLocalDevice::tst_construction()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -325,49 +341,56 @@ void tst_QBluetoothLocalDevice::tst_pairDevice_data()
<< QBluetoothLocalDevice::Unpaired << 1000 << true;
if (!remoteDevice.isNull()) {
+ // Unpairing is quick but pairing level upgrade requires manual interaction
+ // on both devices. Therefore the timeouts are higher for the changes
+ // which require manual interaction.
QTest::newRow("UnParing Test device 1") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
//Bluez5 may have to do a device search which can take up to 20s
QTest::newRow("Pairing Test Device") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 21000 << false;
+ << QBluetoothLocalDevice::Paired << 30000 << false;
QTest::newRow("Pairing upgrade for Authorization") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::AuthorizedPaired << 1000 << false;
+ << QBluetoothLocalDevice::AuthorizedPaired << 5000 << false;
QTest::newRow("Unpairing Test device 2") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
QTest::newRow("Authorized Pairing") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::AuthorizedPaired << 10000 << false;
+ << QBluetoothLocalDevice::AuthorizedPaired << 30000 << false;
QTest::newRow("Pairing Test Device after Authorization Pairing") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 1000 << false;
+ << QBluetoothLocalDevice::Paired << 5000 << false;
+
QTest::newRow("Pairing Test Device after Authorization2") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 1000 << false; //same again
+ << QBluetoothLocalDevice::Paired << 5000 << false; //same again
QTest::newRow("Unpairing Test device 3") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
QTest::newRow("UnParing Test device 4") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
}
}
void tst_QBluetoothLocalDevice::tst_pairDevice()
{
-#ifdef Q_OS_WIN
- QSKIP("Programmatic pairing not supported on Windows");
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#if defined(Q_OS_MACOS)
+ QSKIP("The pair device test fails on macOS");
#endif
-
QFETCH(QBluetoothAddress, deviceAddress);
QFETCH(QBluetoothLocalDevice::Pairing, pairingExpected);
QFETCH(int, pairingWaitTime);
QFETCH(bool, expectErrorSignal);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
//powerOn if not already
- localDevice.powerOn();
- QVERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.powerOn();
+ QTRY_VERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ }
QSignalSpy pairingSpy(&localDevice, SIGNAL(pairingFinished(QBluetoothAddress,QBluetoothLocalDevice::Pairing)) );
- QSignalSpy errorSpy(&localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)));
+ QSignalSpy errorSpy(&localDevice, SIGNAL(errorOccurred(QBluetoothLocalDevice::Error)));
// there should be no signals yet
QVERIFY(pairingSpy.isValid());
QVERIFY(pairingSpy.isEmpty());
@@ -377,17 +400,18 @@ void tst_QBluetoothLocalDevice::tst_pairDevice()
QVERIFY(localDevice.isValid());
localDevice.requestPairing(deviceAddress, pairingExpected);
- // async, wait for it
- QTest::qWait(pairingWaitTime);
+ // The above function triggers async interaction with the user on two machines.
+ // Responding takes time. Let's adjust the subsequent timeout dyncamically based on
+ // the need of the operation
if (expectErrorSignal) {
- QTRY_VERIFY(!errorSpy.isEmpty());
+ QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), pairingWaitTime);
QVERIFY(pairingSpy.isEmpty());
QList<QVariant> arguments = errorSpy.first();
QBluetoothLocalDevice::Error e = qvariant_cast<QBluetoothLocalDevice::Error>(arguments.at(0));
QCOMPARE(e, QBluetoothLocalDevice::PairingError);
} else {
- QTRY_VERIFY(!pairingSpy.isEmpty());
+ QTRY_VERIFY_WITH_TIMEOUT(!pairingSpy.isEmpty(), pairingWaitTime);
QVERIFY(errorSpy.isEmpty());
// test the actual signal values.
@@ -395,11 +419,75 @@ void tst_QBluetoothLocalDevice::tst_pairDevice()
QBluetoothAddress address = qvariant_cast<QBluetoothAddress>(arguments.at(0));
QBluetoothLocalDevice::Pairing pairingResult = qvariant_cast<QBluetoothLocalDevice::Pairing>(arguments.at(1));
QCOMPARE(deviceAddress, address);
- QCOMPARE(pairingExpected, pairingResult);
+ // Verify that the local device pairing status and the signal value match
+ QCOMPARE(pairingResult, localDevice.pairingStatus(deviceAddress));
+#ifndef Q_OS_WIN
+ // On Windows the resulting pairing mode may differ from test's "expected" as the
+ // decision is up to Windows.
+#ifdef Q_OS_ANDROID
+ // On Android we always use "Paired"
+ if (pairingExpected == QBluetoothLocalDevice::AuthorizedPaired)
+ pairingExpected = QBluetoothLocalDevice::Paired;
+#endif
+ QCOMPARE(pairingResult, pairingExpected);
+ QCOMPARE(localDevice.pairingStatus(deviceAddress), pairingExpected);
+#endif
}
+}
+
+void tst_QBluetoothLocalDevice::tst_connectedDevices()
+{
+#if defined(Q_OS_MACOS)
+ QSKIP("The connectedDevices test fails on macOS");
+#endif
+ if (numDevices == 0)
+ QSKIP("Skipping test due to missing Bluetooth device");
+ if (remoteDevice.isNull())
+ QSKIP("This test only makes sense with remote device");
- if (!expectErrorSignal)
- QCOMPARE(pairingExpected, localDevice.pairingStatus(deviceAddress));
+ QBluetoothLocalDevice localDevice;
+ // powerOn if not already
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.powerOn();
+ QTRY_VERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ }
+
+ QSignalSpy pairingSpy(&localDevice, &QBluetoothLocalDevice::pairingFinished);
+
+ // Make sure that the remote device is not paired
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Unpaired);
+ QTRY_VERIFY(!pairingSpy.isEmpty());
+
+ QList<QBluetoothAddress> connectedDevices = localDevice.connectedDevices();
+ QVERIFY(!connectedDevices.contains(remoteDevice));
+
+ QSignalSpy deviceConnectedSpy(&localDevice, &QBluetoothLocalDevice::deviceConnected);
+ QSignalSpy deviceDisconnectedSpy(&localDevice, &QBluetoothLocalDevice::deviceDisconnected);
+
+ // Now pair with the device. We should have a deviceConnected signal.
+ pairingSpy.clear();
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Paired);
+ // Manual confirmation for pairing might be required
+ QTRY_VERIFY_WITH_TIMEOUT(!pairingSpy.isEmpty(), 30000);
+ QTRY_VERIFY(!deviceConnectedSpy.isEmpty());
+ QList<QVariant> arguments = deviceConnectedSpy.takeFirst();
+ auto address = arguments.at(0).value<QBluetoothAddress>();
+ QCOMPARE(address, remoteDevice);
+
+ connectedDevices = localDevice.connectedDevices();
+ QVERIFY(connectedDevices.contains(remoteDevice));
+
+ // Unpair again. We should have a deviceDisconnected signal.
+ pairingSpy.clear();
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Unpaired);
+ QTRY_VERIFY(!pairingSpy.isEmpty());
+ QTRY_VERIFY(!deviceDisconnectedSpy.isEmpty());
+ arguments = deviceDisconnectedSpy.takeFirst();
+ address = arguments.at(0).value<QBluetoothAddress>();
+ QCOMPARE(address, remoteDevice);
+
+ connectedDevices = localDevice.connectedDevices();
+ QVERIFY(!connectedDevices.contains(remoteDevice));
}
void tst_QBluetoothLocalDevice::tst_pairingStatus_data()
@@ -407,16 +495,9 @@ void tst_QBluetoothLocalDevice::tst_pairingStatus_data()
QTest::addColumn<QBluetoothAddress>("deviceAddress");
QTest::addColumn<QBluetoothLocalDevice::Pairing>("pairingExpected");
-#if !QT_CONFIG(winrt_bt)
QTest::newRow("UnPaired Device: DUMMY") << QBluetoothAddress("11:00:00:00:00:00")
<< QBluetoothLocalDevice::Unpaired;
QTest::newRow("Invalid device") << QBluetoothAddress() << QBluetoothLocalDevice::Unpaired;
-#else
- // Remove special case when QTBUG-62294 is fixed
- QTest::newRow("UnPaired Device: DUMMY") << QBluetoothAddress("11:00:00:00:00:00")
- << QBluetoothLocalDevice::Paired;
- QTest::newRow("Invalid device") << QBluetoothAddress() << QBluetoothLocalDevice::Paired;
-#endif
//valid devices are already tested by tst_pairDevice()
}
@@ -425,7 +506,7 @@ void tst_QBluetoothLocalDevice::tst_pairingStatus()
QFETCH(QBluetoothAddress, deviceAddress);
QFETCH(QBluetoothLocalDevice::Pairing, pairingExpected);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;