blob: aeace2316def9506c8d2ee07629f2deb4adeba51 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.permissioncontroller.test.upgrade.deviceside
import android.Manifest.permission.BACKGROUND_CAMERA
import android.Manifest.permission.CAMERA
import android.Manifest.permission.RECORD_AUDIO
import android.Manifest.permission.RECORD_BACKGROUND_AUDIO
import android.app.UiAutomation
import android.content.Context
import android.content.pm.PackageManager
import android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION
import android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT
import android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT
import android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT
import android.content.pm.PackageManager.GET_PERMISSIONS
import android.content.pm.PackageManager.PERMISSION_DENIED
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Process
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class DeviceSide {
companion object {
private const val PKG_30_CAMERA_GRANTED =
"com.android.permission.test.upgrade.sdk_30.camera_granted"
private const val PKG_30_CAMERA_DENIED =
"com.android.permission.test.upgrade.sdk_30.camera_denied"
private const val PKG_30_CAMERA_GRANTED_DECLARES_BG =
"com.android.permission.test.upgrade.sdk_30.camera_granted_declares_bg"
private const val PKG_30_CAMERA_DENIED_DECLARES_BG =
"com.android.permission.test.upgrade.sdk_30.camera_denied_declares_bg"
private const val PKG_CURRENT_CAMERA_GRANTED =
"com.android.permission.test.upgrade.sdk_current.camera_granted"
private const val PKG_CURRENT_CAMERA_DENIED =
"com.android.permission.test.upgrade.sdk_current.camera_denied"
private const val PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG =
"com.android.permission.test.upgrade.sdk_current.camera_granted_declares_bg"
private const val PKG_CURRENT_CAMERA_DENIED_DECLARES_BG =
"com.android.permission.test.upgrade.sdk_current.camera_denied_declares_bg"
private const val PKG_30_ASSISTANT =
"com.android.permission.test.upgrade.sdk_30.assistant"
private const val ALL_PERMISSION_EXEMPT_FLAGS =
FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT or
FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT or
FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT
}
lateinit var uiautomation: UiAutomation
lateinit var context: Context
lateinit var pm: PackageManager
lateinit var user: UserHandle
@Before
fun init() {
uiautomation = InstrumentationRegistry.getInstrumentation().uiAutomation
context = InstrumentationRegistry.getInstrumentation().context
pm = context.packageManager
user = Process.myUserHandle()
}
/**
* Assert all packages are installed
*/
@Test
fun verifyPackagesAreInstalled() {
// Don't catch any NameNotFound exceptions
pm.getPackageInfo(PKG_30_CAMERA_GRANTED, 0)
pm.getPackageInfo(PKG_30_CAMERA_DENIED, 0)
pm.getPackageInfo(PKG_30_CAMERA_GRANTED_DECLARES_BG, 0)
pm.getPackageInfo(PKG_30_CAMERA_DENIED_DECLARES_BG, 0)
pm.getPackageInfo(PKG_CURRENT_CAMERA_GRANTED, 0)
pm.getPackageInfo(PKG_CURRENT_CAMERA_DENIED, 0)
pm.getPackageInfo(PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG, 0)
pm.getPackageInfo(PKG_CURRENT_CAMERA_DENIED_DECLARES_BG, 0)
}
@Test
fun testUpgrade1() {
with(MultipleTestRunner()) {
runTest("testFgCameraPermissionUnchanged_sdk30CameraGranted") {
assertThat(pm.checkPermission(CAMERA, PKG_30_CAMERA_GRANTED))
.isEqualTo(PERMISSION_GRANTED)
}
runTest("testFgCameraPermissionUnchanged_sdk30CameraDenied") {
assertThat(pm.checkPermission(CAMERA, PKG_30_CAMERA_DENIED))
.isEqualTo(PERMISSION_DENIED)
}
runTest("testFgCameraPermissionUnchanged_sdk30CameraGrantedDeclaresBg") {
assertThat(pm.checkPermission(CAMERA, PKG_30_CAMERA_GRANTED_DECLARES_BG))
.isEqualTo(PERMISSION_GRANTED)
}
runTest("testFgCameraPermissionUnchanged_sdk30CameraDeniedDeclaresBg") {
assertThat(pm.checkPermission(CAMERA, PKG_30_CAMERA_DENIED_DECLARES_BG))
.isEqualTo(PERMISSION_DENIED)
}
runTest("testFgCameraPermissionUnchanged_sdkCurrentCameraGranted") {
assertThat(pm.checkPermission(CAMERA, PKG_CURRENT_CAMERA_GRANTED))
.isEqualTo(PERMISSION_GRANTED)
}
runTest("testFgCameraPermissionUnchanged_sdkCurrentCameraDenied") {
assertThat(pm.checkPermission(CAMERA, PKG_CURRENT_CAMERA_DENIED))
.isEqualTo(PERMISSION_DENIED)
}
runTest("testFgCameraPermissionUnchanged_sdkCurrentCameraGrantedDeclaresBg") {
assertThat(pm.checkPermission(CAMERA, PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG))
.isEqualTo(PERMISSION_GRANTED)
}
runTest("testFgCameraPermissionUnchanged_sdkCurrentCameraDeniedDeclaresBg") {
assertThat(pm.checkPermission(CAMERA, PKG_CURRENT_CAMERA_DENIED_DECLARES_BG))
.isEqualTo(PERMISSION_DENIED)
}
runTest("testPackagesRequestBgCamera_sdk30CameraGranted") {
assertThat(pm.getPackageInfo(PKG_30_CAMERA_GRANTED, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testPackagesRequestBgCamera_sdk30CameraDenied") {
assertThat(pm.getPackageInfo(PKG_30_CAMERA_DENIED, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testPackagesRequestBgCamera_sdk30CameraGrantedDeclaresBg") {
assertThat(pm.getPackageInfo(PKG_30_CAMERA_GRANTED_DECLARES_BG, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testPackagesRequestBgCamera_sdk30CameraDeniedDeclaresBg") {
assertThat(pm.getPackageInfo(PKG_30_CAMERA_DENIED_DECLARES_BG, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testPackagesRequestBgCamera_sdkCurrentCameraGranted") {
assertThat(pm.getPackageInfo(PKG_CURRENT_CAMERA_GRANTED, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(false)
}
runTest("testPackagesRequestBgCamera_sdkCurrentCameraDenied") {
assertThat(pm.getPackageInfo(PKG_CURRENT_CAMERA_DENIED, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(false)
}
runTest("testPackagesRequestBgCamera_sdkCurrentCameraGrantedDeclaresBg") {
assertThat(pm.getPackageInfo(
PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testPackagesRequestBgCamera_sdkCurrentCameraDeniedDeclaresBg") {
assertThat(pm.getPackageInfo(PKG_CURRENT_CAMERA_DENIED_DECLARES_BG, GET_PERMISSIONS)
.requestedPermissions.contains(BACKGROUND_CAMERA)).isEqualTo(true)
}
runTest("testBgCameraRestrictionApplied_sdk30CameraGranted") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_GRANTED, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
runTest("testBgCameraRestrictionApplied_sdk30CameraDenied") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_DENIED, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
runTest("testBgCameraRestrictionApplied_sdk30CameraGrantedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_GRANTED_DECLARES_BG, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
runTest("testBgCameraRestrictionApplied_sdk30CameraDeniedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_DENIED_DECLARES_BG, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
/* Removed 2 packages targeting CURRENT only declaring fg */
runTest("testBgCameraRestrictionApplied_sdkCurrentCameraGrantedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
runTest("testBgCameraRestrictionApplied_sdkCurrentCameraDeniedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_CURRENT_CAMERA_DENIED_DECLARES_BG, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isNotEqualTo(0)
}
}
runTest("testBgCameraIsNotExempt_sdk30CameraGranted") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_GRANTED, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
runTest("testBgCameraIsNotExempt_sdk30CameraDenied") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_DENIED, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
runTest("testBgCameraIsNotExempt_sdk30CameraGrantedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_GRANTED_DECLARES_BG, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
runTest("testBgCameraIsNotExempt_sdk30CameraDeniedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_30_CAMERA_DENIED_DECLARES_BG, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
/* Removed 2 packages targeting CURRENT only declaring fg */
runTest("testBgCameraIsNotExempt_sdkCurrentCameraGrantedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_CURRENT_CAMERA_GRANTED_DECLARES_BG, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
runTest("testBgCameraIsNotExempt_sdkCurrentCameraDeniedDeclaresBg") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(BACKGROUND_CAMERA,
PKG_CURRENT_CAMERA_DENIED_DECLARES_BG, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isEqualTo(0)
}
}
runTest("testGetsBgMicGranted_sdk30AssistantMicGranted") {
assertThat(pm.checkPermission(RECORD_AUDIO, PKG_30_ASSISTANT))
.isEqualTo(PERMISSION_GRANTED)
assertThat(pm
.checkPermission(RECORD_BACKGROUND_AUDIO, PKG_30_ASSISTANT))
.isEqualTo(PERMISSION_GRANTED)
}
runTest("testBgMicRestrictionNotApplied_sdk30AssistantMicGranted") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(RECORD_BACKGROUND_AUDIO,
PKG_30_ASSISTANT, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isEqualTo(0)
}
}
runTest("testBgMicIsExempt_sdk30AssistantMicGranted") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(RECORD_BACKGROUND_AUDIO,
PKG_30_ASSISTANT, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isNotEqualTo(0)
}
}
finish()
}
}
@Test
fun testUpgrade2() {
with(MultipleTestRunner()) {
runTest("testGetsBgMicGranted_sdk30AssistantMicDenied") {
assertThat(pm.checkPermission(RECORD_AUDIO, PKG_30_ASSISTANT))
.isEqualTo(PERMISSION_DENIED)
assertThat(pm.checkPermission(RECORD_BACKGROUND_AUDIO, PKG_30_ASSISTANT))
.isEqualTo(PERMISSION_DENIED)
}
runTest("testBgMicRestrictionNotApplied_sdk30AssistantMicDenied") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(RECORD_BACKGROUND_AUDIO,
PKG_30_ASSISTANT, user) and
FLAG_PERMISSION_APPLY_RESTRICTION).isEqualTo(0)
}
}
runTest("testBgMicIsExempt_sdk30AssistantMicDenied") {
runWithShellPermissionIdentity {
assertThat(pm.getPermissionFlags(RECORD_BACKGROUND_AUDIO,
PKG_30_ASSISTANT, user) and
ALL_PERMISSION_EXEMPT_FLAGS).isNotEqualTo(0)
}
}
finish()
}
}
fun runWithShellPermissionIdentity(r: () -> Unit) {
try {
uiautomation.adoptShellPermissionIdentity()
r()
} finally {
uiautomation.dropShellPermissionIdentity()
}
}
}