// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include #include #include #include #include #if defined(Q_OS_MACOS) && defined(QT_BUILD_INTERNAL) #include Q_CONSTRUCTOR_FUNCTION(qt_mac_ensureResponsible); #endif class tst_QPermissions : public QObject { Q_OBJECT private slots: void initTestCase_data(); void checkPermission(); void checkPermissionInNonMainThread(); void requestPermission(); void requestPermissionInNonMainThread(); }; void tst_QPermissions::initTestCase_data() { QTest::addColumn("permission"); QTest::newRow("Camera") << QPermission(QCameraPermission{}); QTest::newRow("Microphone") << QPermission(QMicrophonePermission{}); QTest::newRow("Bluetooth") << QPermission(QBluetoothPermission{}); QTest::newRow("Contacts") << QPermission(QContactsPermission{}); QTest::newRow("Calendar") << QPermission(QCalendarPermission{}); QTest::newRow("Location") << QPermission(QLocationPermission{}); } void tst_QPermissions::checkPermission() { QFETCH_GLOBAL(QPermission, permission); qApp->checkPermission(permission); } class Thread : public QThread { public: QMutex mutex; QWaitCondition cond; std::function function; void run() override { QMutexLocker locker(&mutex); function(); cond.wakeOne(); } }; void tst_QPermissions::checkPermissionInNonMainThread() { QFETCH_GLOBAL(QPermission, permission); Thread thread; thread.function = [=]{ qApp->checkPermission(permission); }; QVERIFY(!thread.isFinished()); QMutexLocker locker(&thread.mutex); thread.start(); QVERIFY(!thread.isFinished()); thread.cond.wait(locker.mutex()); QVERIFY(thread.wait(1000)); QVERIFY(thread.isFinished()); } void tst_QPermissions::requestPermission() { QFETCH_GLOBAL(QPermission, permission); QTimer::singleShot(0, this, [=] { qApp->requestPermission(permission, [=](auto result) { qDebug() << result; Q_ASSERT(QThread::currentThread() == thread()); qApp->exit(); }); }); qApp->exec(); } void tst_QPermissions::requestPermissionInNonMainThread() { QFETCH_GLOBAL(QPermission, permission); QTest::ignoreMessage(QtWarningMsg, "Permissions can only be requested from the GUI (main) thread"); Thread thread; thread.function = [&]{ qApp->requestPermission(permission, [&]() {}); }; QVERIFY(!thread.isFinished()); QMutexLocker locker(&thread.mutex); thread.start(); QVERIFY(!thread.isFinished()); thread.cond.wait(locker.mutex()); QVERIFY(thread.wait(1000)); QVERIFY(thread.isFinished()); } QTEST_MAIN(tst_QPermissions) #include "tst_qpermissions.moc"