1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.pm 18 19 import android.os.Build 20 import android.os.Bundle 21 import android.os.UserHandle 22 import android.os.UserManager 23 import com.android.server.pm.pkg.PackageStateInternal 24 import com.android.server.testutils.TestHandler 25 import com.android.server.testutils.any 26 import com.android.server.testutils.eq 27 import com.android.server.testutils.whenever 28 import org.junit.Before 29 import org.junit.Rule 30 import org.mockito.ArgumentCaptor 31 import org.mockito.Captor 32 import org.mockito.Mock 33 import org.mockito.Mockito 34 import org.mockito.Mockito.spy 35 import org.mockito.MockitoAnnotations 36 37 open class PackageHelperTestBase { 38 39 companion object { 40 const val TEST_PACKAGE_1 = "com.android.test.package1" 41 const val TEST_PACKAGE_2 = "com.android.test.package2" 42 const val DEVICE_OWNER_PACKAGE = "com.android.test.owner" 43 const val NONEXISTENT_PACKAGE = "com.android.test.nonexistent" 44 const val DEVICE_ADMIN_PACKAGE = "com.android.test.known.device.admin" 45 const val DEFAULT_HOME_PACKAGE = "com.android.test.known.home" 46 const val DIALER_PACKAGE = "com.android.test.known.dialer" 47 const val INSTALLER_PACKAGE = "com.android.test.known.installer" 48 const val UNINSTALLER_PACKAGE = "com.android.test.known.uninstaller" 49 const val VERIFIER_PACKAGE = "com.android.test.known.verifier" 50 const val PERMISSION_CONTROLLER_PACKAGE = "com.android.test.known.permission" 51 const val MGMT_ROLE_HOLDER_PACKAGE = "com.android.test.know.device_management" 52 const val TEST_USER_ID = 0 53 } 54 55 lateinit var pms: PackageManagerService 56 lateinit var suspendPackageHelper: SuspendPackageHelper 57 lateinit var testHandler: TestHandler 58 lateinit var defaultAppProvider: DefaultAppProvider 59 lateinit var packageSetting1: PackageStateInternal 60 lateinit var packageSetting2: PackageStateInternal 61 lateinit var ownerSetting: PackageStateInternal 62 lateinit var packagesToChange: Array<String> 63 lateinit var uidsToChange: IntArray 64 65 @Mock 66 lateinit var broadcastHelper: BroadcastHelper 67 @Mock 68 lateinit var protectedPackages: ProtectedPackages 69 70 @Captor 71 lateinit var bundleCaptor: ArgumentCaptor<Bundle> 72 73 @Rule 74 @JvmField 75 val rule = MockSystemRule() 76 var deviceOwnerUid = 0 77 78 @Before 79 @Throws(Exception::class) 80 open fun setup() { 81 MockitoAnnotations.initMocks(this) 82 rule.system().stageNominalSystemState() 83 pms = spy(createPackageManagerService( 84 TEST_PACKAGE_1, TEST_PACKAGE_2, DEVICE_OWNER_PACKAGE, DEVICE_ADMIN_PACKAGE, 85 DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, 86 VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE)) 87 suspendPackageHelper = SuspendPackageHelper(pms, rule.mocks().injector, 88 rule.mocks().userManagerService, broadcastHelper, protectedPackages) 89 defaultAppProvider = rule.mocks().defaultAppProvider 90 testHandler = rule.mocks().handler 91 packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!! 92 packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!! 93 ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! 94 deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId) 95 packagesToChange = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) 96 uidsToChange = intArrayOf(packageSetting1.appId, packageSetting2.appId) 97 98 whenever(protectedPackages.getDeviceOwnerOrProfileOwnerPackage(eq(TEST_USER_ID))) 99 .thenReturn(DEVICE_OWNER_PACKAGE) 100 whenever(rule.mocks().userManagerService.hasUserRestriction( 101 eq(UserManager.DISALLOW_APPS_CONTROL), eq(TEST_USER_ID))).thenReturn(true) 102 whenever(rule.mocks().userManagerService.hasUserRestriction( 103 eq(UserManager.DISALLOW_UNINSTALL_APPS), eq(TEST_USER_ID))).thenReturn(true) 104 mockKnownPackages(pms) 105 } 106 107 private fun mockKnownPackages(pms: PackageManagerService) { 108 Mockito.doAnswer { it.arguments[0] == DEVICE_ADMIN_PACKAGE }.`when`(pms) 109 .isPackageDeviceAdmin(any(), any()) 110 Mockito.doReturn(DEFAULT_HOME_PACKAGE).`when`(defaultAppProvider) 111 .getDefaultHome(eq(TEST_USER_ID)) 112 Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider) 113 .getDefaultDialer(eq(TEST_USER_ID)) 114 Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 115 any(), eq(KnownPackages.PACKAGE_INSTALLER), eq(TEST_USER_ID)) 116 Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 117 any(), eq(KnownPackages.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) 118 Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 119 any(), eq(KnownPackages.PACKAGE_VERIFIER), eq(TEST_USER_ID)) 120 Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) 121 .getKnownPackageNamesInternal(any(), 122 eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) 123 Mockito.doReturn(MGMT_ROLE_HOLDER_PACKAGE).`when`(pms) 124 .getDevicePolicyManagementRoleHolderPackageName(eq(TEST_USER_ID)) 125 } 126 127 private fun createPackageManagerService(vararg stageExistingPackages: String): 128 PackageManagerService { 129 stageExistingPackages.forEach { 130 rule.system().stageScanExistingPackage(it, 1L, 131 rule.system().dataAppDirectory) 132 } 133 var pms = PackageManagerService(rule.mocks().injector, 134 false /* factoryTest */, 135 MockSystem.DEFAULT_VERSION_INFO.fingerprint, 136 false /* isEngBuild */, 137 false /* isUserDebugBuild */, 138 Build.VERSION_CODES.CUR_DEVELOPMENT, 139 Build.VERSION.INCREMENTAL) 140 rule.system().validateFinalState() 141 return pms 142 } 143 } 144