1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 package org.mozilla.fenix.ui
7 import android.Manifest
8 import android.content.Context
9 import android.hardware.camera2.CameraManager
10 import android.media.AudioManager
11 import android.os.Build
12 import androidx.core.net.toUri
13 import androidx.test.rule.GrantPermissionRule
14 import org.junit.Assume.assumeTrue
17 import org.mozilla.fenix.customannotations.SmokeTest
18 import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
19 import org.mozilla.fenix.helpers.AppAndSystemHelper.grantSystemPermission
20 import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
21 import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
22 import org.mozilla.fenix.helpers.MockLocationUpdatesRule
23 import org.mozilla.fenix.helpers.RetryTestRule
24 import org.mozilla.fenix.helpers.TestAssetHelper
25 import org.mozilla.fenix.helpers.TestHelper.appContext
26 import org.mozilla.fenix.helpers.TestSetup
27 import org.mozilla.fenix.ui.robots.browserScreen
28 import org.mozilla.fenix.ui.robots.clickPageObject
29 import org.mozilla.fenix.ui.robots.navigationToolbar
32 * Tests for verifying site permissions prompts & functionality
35 class SitePermissionsTest : TestSetup() {
36 /* Test page created and handled by the Mozilla mobile test-eng team */
37 private val testPage = "https://mozilla-mobile.github.io/testapp/permissions"
38 private val testPageSubstring = "https://mozilla-mobile.github.io:443"
39 private val cameraManager = appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager
40 private val micManager = appContext.getSystemService(Context.AUDIO_SERVICE) as AudioManager
43 val activityTestRule = HomeActivityIntentTestRule(
44 isJumpBackInCFREnabled = false,
45 isPWAsPromptEnabled = false,
46 isTCPCFREnabled = false,
47 isDeleteSitePermissionsEnabled = true,
51 val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
52 Manifest.permission.RECORD_AUDIO,
53 Manifest.permission.CAMERA,
54 Manifest.permission.ACCESS_COARSE_LOCATION,
58 val mockLocationUpdatesRule = MockLocationUpdatesRule()
61 val retryTestRule = RetryTestRule(3)
63 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334295
66 fun audioVideoPermissionWithoutRememberingTheDecisionTest() {
67 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
70 }.enterURLAndEnterToBrowser(testPage.toUri()) {
72 }.clickStartAudioVideoButton {
73 verifyAudioVideoPermissionPrompt(testPageSubstring)
74 }.clickPagePermissionButton(false) {
75 verifyPageContent("Camera and Microphone not allowed")
76 }.clickStartAudioVideoButton {
77 }.clickPagePermissionButton(true) {
78 verifyPageContent("Camera and Microphone allowed")
82 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334294
84 fun blockAudioVideoPermissionRememberingTheDecisionTest() {
85 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
86 assumeTrue(micManager.microphones.isNotEmpty())
89 }.enterURLAndEnterToBrowser(testPage.toUri()) {
91 }.clickStartAudioVideoButton {
92 verifyAudioVideoPermissionPrompt(testPageSubstring)
93 selectRememberPermissionDecision()
94 }.clickPagePermissionButton(false) {
95 verifyPageContent("Camera and Microphone not allowed")
99 }.clickStartAudioVideoButton { }
101 verifyPageContent("Camera and Microphone not allowed")
105 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251388
107 fun allowAudioVideoPermissionRememberingTheDecisionTest() {
108 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
109 assumeTrue(micManager.microphones.isNotEmpty())
112 }.enterURLAndEnterToBrowser(testPage.toUri()) {
114 }.clickStartAudioVideoButton {
115 verifyAudioVideoPermissionPrompt(testPageSubstring)
116 selectRememberPermissionDecision()
117 }.clickPagePermissionButton(true) {
118 verifyPageContent("Camera and Microphone allowed")
122 }.clickStartAudioVideoButton { }
124 verifyPageContent("Camera and Microphone allowed")
128 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334189
130 fun microphonePermissionWithoutRememberingTheDecisionTest() {
131 assumeTrue(micManager.microphones.isNotEmpty())
134 }.enterURLAndEnterToBrowser(testPage.toUri()) {
136 }.clickStartMicrophoneButton {
137 verifyMicrophonePermissionPrompt(testPageSubstring)
138 }.clickPagePermissionButton(false) {
139 verifyPageContent("Microphone not allowed")
140 }.clickStartMicrophoneButton {
141 }.clickPagePermissionButton(true) {
142 verifyPageContent("Microphone allowed")
146 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334190
148 fun blockMicrophonePermissionRememberingTheDecisionTest() {
149 assumeTrue(micManager.microphones.isNotEmpty())
152 }.enterURLAndEnterToBrowser(testPage.toUri()) {
154 }.clickStartMicrophoneButton {
155 verifyMicrophonePermissionPrompt(testPageSubstring)
156 selectRememberPermissionDecision()
157 }.clickPagePermissionButton(false) {
158 verifyPageContent("Microphone not allowed")
162 }.clickStartMicrophoneButton { }
164 verifyPageContent("Microphone not allowed")
168 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251387
170 fun allowMicrophonePermissionRememberingTheDecisionTest() {
171 assumeTrue(micManager.microphones.isNotEmpty())
174 }.enterURLAndEnterToBrowser(testPage.toUri()) {
176 }.clickStartMicrophoneButton {
177 verifyMicrophonePermissionPrompt(testPageSubstring)
178 selectRememberPermissionDecision()
179 }.clickPagePermissionButton(true) {
180 verifyPageContent("Microphone allowed")
184 }.clickStartMicrophoneButton { }
186 verifyPageContent("Microphone allowed")
190 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334076
192 fun cameraPermissionWithoutRememberingDecisionTest() {
193 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
196 }.enterURLAndEnterToBrowser(testPage.toUri()) {
198 }.clickStartCameraButton {
199 verifyCameraPermissionPrompt(testPageSubstring)
200 }.clickPagePermissionButton(false) {
201 verifyPageContent("Camera not allowed")
202 }.clickStartCameraButton {
203 }.clickPagePermissionButton(true) {
204 verifyPageContent("Camera allowed")
208 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334077
210 fun blockCameraPermissionRememberingTheDecisionTest() {
211 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
214 }.enterURLAndEnterToBrowser(testPage.toUri()) {
216 }.clickStartCameraButton {
217 verifyCameraPermissionPrompt(testPageSubstring)
218 selectRememberPermissionDecision()
219 }.clickPagePermissionButton(false) {
220 verifyPageContent("Camera not allowed")
224 }.clickStartCameraButton { }
226 verifyPageContent("Camera not allowed")
230 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251386
232 fun allowCameraPermissionRememberingTheDecisionTest() {
233 assumeTrue(cameraManager.cameraIdList.isNotEmpty())
236 }.enterURLAndEnterToBrowser(testPage.toUri()) {
238 }.clickStartCameraButton {
239 verifyCameraPermissionPrompt(testPageSubstring)
240 selectRememberPermissionDecision()
241 }.clickPagePermissionButton(true) {
242 verifyPageContent("Camera allowed")
246 }.clickStartCameraButton { }
248 verifyPageContent("Camera allowed")
252 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334074
255 fun blockNotificationsPermissionTest() {
257 }.enterURLAndEnterToBrowser(testPage.toUri()) {
258 }.clickOpenNotificationButton {
259 verifyNotificationsPermissionPrompt(testPageSubstring)
260 }.clickPagePermissionButton(false) {
261 verifyPageContent("Notifications not allowed")
265 }.clickOpenNotificationButton {
266 verifyNotificationsPermissionPrompt(testPageSubstring, true)
270 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251380
272 fun allowNotificationsPermissionTest() {
274 }.enterURLAndEnterToBrowser(testPage.toUri()) {
275 }.clickOpenNotificationButton {
276 verifyNotificationsPermissionPrompt(testPageSubstring)
277 }.clickPagePermissionButton(true) {
278 verifyPageContent("Notifications allowed")
282 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/251385
285 fun allowLocationPermissionsTest() {
286 mockLocationUpdatesRule.setMockLocation()
289 }.enterURLAndEnterToBrowser(testPage.toUri()) {
290 }.clickGetLocationButton {
291 verifyLocationPermissionPrompt(testPageSubstring)
292 }.clickPagePermissionButton(true) {
293 verifyPageContent("${mockLocationUpdatesRule.latitude}")
294 verifyPageContent("${mockLocationUpdatesRule.longitude}")
298 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2334075
300 fun blockLocationPermissionsTest() {
302 }.enterURLAndEnterToBrowser(testPage.toUri()) {
303 }.clickGetLocationButton {
304 verifyLocationPermissionPrompt(testPageSubstring)
305 }.clickPagePermissionButton(false) {
306 verifyPageContent("User denied geolocation prompt")
310 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2121537
313 fun fileUploadPermissionTest() {
314 val testPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
317 }.enterURLAndEnterToBrowser(testPage.url) {
318 clickPageObject(itemWithResId("upload_file"))
319 grantSystemPermission()
320 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
321 assertExternalAppOpens("com.google.android.documentsui")
323 assertExternalAppOpens("com.android.documentsui")