summaryrefslogtreecommitdiffstats
path: root/tests/manual/permissions/tst_qpermissions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/permissions/tst_qpermissions.cpp')
-rw-r--r--tests/manual/permissions/tst_qpermissions.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/tests/manual/permissions/tst_qpermissions.cpp b/tests/manual/permissions/tst_qpermissions.cpp
new file mode 100644
index 0000000000..7df2fdc2fe
--- /dev/null
+++ b/tests/manual/permissions/tst_qpermissions.cpp
@@ -0,0 +1,116 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QTest>
+
+#include <QtCore/qpermissions.h>
+#include <QtCore/qthread.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/qwaitcondition.h>
+#include <QtCore/qtimer.h>
+
+#if defined(Q_OS_MACOS) && defined(QT_BUILD_INTERNAL)
+#include <private/qcore_mac_p.h>
+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<QPermission>("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<void()> 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"