diff options
Diffstat (limited to 'tests/manual/permissions')
-rw-r--r-- | tests/manual/permissions/.gitignore | 1 | ||||
-rw-r--r-- | tests/manual/permissions/CMakeLists.txt | 61 | ||||
-rw-r--r-- | tests/manual/permissions/Info.plist | 59 | ||||
-rw-r--r-- | tests/manual/permissions/android/AndroidManifest.xml | 47 | ||||
-rw-r--r-- | tests/manual/permissions/tst_qpermissions.cpp | 116 |
5 files changed, 284 insertions, 0 deletions
diff --git a/tests/manual/permissions/.gitignore b/tests/manual/permissions/.gitignore new file mode 100644 index 0000000000..bd59d3407e --- /dev/null +++ b/tests/manual/permissions/.gitignore @@ -0,0 +1 @@ +tst_qpermissions diff --git a/tests/manual/permissions/CMakeLists.txt b/tests/manual/permissions/CMakeLists.txt new file mode 100644 index 0000000000..f9fac7e362 --- /dev/null +++ b/tests/manual/permissions/CMakeLists.txt @@ -0,0 +1,61 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_manual_qpermissions + SOURCES + tst_qpermissions.cpp + LIBRARIES + Qt::CorePrivate +) + +if(ANDROID) + set_property(TARGET tst_manual_qpermissions + PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") +elseif(APPLE) + # Test an app bundle, but without any usage descriptions + + qt_internal_add_test(tst_qpermissions_app + SOURCES + tst_qpermissions.cpp + DEFINES + tst_QPermissions=tst_QPermissionsApp + LIBRARIES + Qt::CorePrivate + ) + + set_property(TARGET tst_qpermissions_app + PROPERTY MACOSX_BUNDLE TRUE) + set_property(TARGET tst_qpermissions_app + PROPERTY MACOSX_BUNDLE_GUI_IDENTIFIER "io.qt.dev.tst_permissions_app") + + # Test an app bundle with all the required usage descriptions + + qt_internal_add_test(tst_qpermissions_app_with_usage_descriptions + SOURCES + tst_qpermissions.cpp + DEFINES + tst_QPermissions=tst_QPermissionsAppWithUsageDescriptions + HAVE_USAGE_DESCRIPTION=1 + LIBRARIES + Qt::CorePrivate + Qt::Gui + ) + + set_property(TARGET tst_qpermissions_app_with_usage_descriptions + PROPERTY MACOSX_BUNDLE TRUE) + set_property(TARGET tst_qpermissions_app_with_usage_descriptions + PROPERTY MACOSX_BUNDLE_GUI_IDENTIFIER "io.qt.dev.tst_qpermissions_app_with_usage_descriptions") + set_property(TARGET tst_qpermissions_app_with_usage_descriptions + PROPERTY MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist") + + foreach(permission_plugin IN LISTS QT_ALL_PLUGINS_FOUND_BY_FIND_PACKAGE_permissions) + set(permission_plugin "${QT_CMAKE_EXPORT_NAMESPACE}::${permission_plugin}") + qt6_import_plugins(tst_qpermissions_app INCLUDE ${permission_plugin}) + qt6_import_plugins(tst_qpermissions_app_with_usage_descriptions INCLUDE ${permission_plugin}) + endforeach() + + if(NOT CMAKE_GENERATOR STREQUAL "Xcode") + add_custom_command(TARGET tst_qpermissions_app_with_usage_descriptions + POST_BUILD COMMAND codesign -s - tst_qpermissions_app_with_usage_descriptions.app) + endif() +endif() diff --git a/tests/manual/permissions/Info.plist b/tests/manual/permissions/Info.plist new file mode 100644 index 0000000000..dce43caf12 --- /dev/null +++ b/tests/manual/permissions/Info.plist @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + + <key>CFBundleName</key> + <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> + <key>CFBundleIdentifier</key> + <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> + <key>CFBundleExecutable</key> + <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> + + <key>CFBundleVersion</key> + <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> + <key>CFBundleShortVersionString</key> + <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> + + <key>LSMinimumSystemVersion</key> + <string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string> + + <key>NSHumanReadableCopyright</key> + <string>${MACOSX_BUNDLE_COPYRIGHT}</string> + + <key>CFBundleIconFile</key> + <string>${MACOSX_BUNDLE_ICON_FILE}</string> + + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + + <key>NSSupportsAutomaticGraphicsSwitching</key> + <true/> + + <key>NSBluetoothAlwaysUsageDescription</key> + <string>Testing BluetoothAlways</string> + <key>NSCalendarsUsageDescription</key> + <string>Testing Calendars</string> + <key>NSCameraUsageDescription</key> + <string>Testing Camera</string> + <key>NSContactsUsageDescription</key> + <string>Testing Contacts</string> + <key>NSHealthShareUsageDescription</key> + <string>Testing HealthShare</string> + <key>NSHealthUpdateUsageDescription</key> + <string>Testing HealthUpdate</string> + <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> + <string>Testing LocationAlwaysAndWhenInUse</string> + <key>NSLocationAlwaysUsageDescription</key> + <string>Testing LocationAlways</string> + <key>NSLocationWhenInUseUsageDescription</key> + <string>Testing LocationWhenInUse</string> + <key>NSMicrophoneUsageDescription</key> + <string>Testing Microphone</string> + +</dict> +</plist> diff --git a/tests/manual/permissions/android/AndroidManifest.xml b/tests/manual/permissions/android/AndroidManifest.xml new file mode 100644 index 0000000000..db577e6c27 --- /dev/null +++ b/tests/manual/permissions/android/AndroidManifest.xml @@ -0,0 +1,47 @@ +<?xml version="1.0"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.qtproject.example.tst_manual_permissions" + android:installLocation="auto" + android:versionCode="-- %%INSERT_VERSION_CODE%% --" + android:versionName="-- %%INSERT_VERSION_NAME%% --"> + <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.RECORD_AUDIO" /> + <uses-permission android:name="android.permission.BLUETOOTH" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> + <uses-permission android:name="android.permission.WRITE_CONTACTS" /> + <uses-permission android:name="android.permission.READ_CALENDAR" /> + <uses-permission android:name="android.permission.WRITE_CALENDAR" /> + <!-- %%INSERT_PERMISSIONS --> + <!-- %%INSERT_FEATURES --> + <supports-screens + android:anyDensity="true" + android:largeScreens="true" + android:normalScreens="true" + android:smallScreens="true" /> + <application + android:name="org.qtproject.qt.android.bindings.QtApplication" + android:hardwareAccelerated="true" + android:label="-- %%INSERT_APP_NAME%% --" + android:requestLegacyExternalStorage="true" + android:allowBackup="true" + android:fullBackupOnly="false"> + <activity + android:name="org.qtproject.qt.android.bindings.QtActivity" + android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" + android:launchMode="singleTop" + android:screenOrientation="unspecified" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + + <meta-data + android:name="android.app.lib_name" + android:value="-- %%INSERT_APP_LIB_NAME%% --" /> + </activity> + </application> +</manifest> 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" |