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.UserHandle 21 import android.os.UserManager 22 import com.android.server.pm.pkg.PackageStateInternal 23 import com.android.server.testutils.TestHandler 24 import com.android.server.testutils.any 25 import com.android.server.testutils.eq 26 import com.android.server.testutils.whenever 27 import org.junit.Before 28 import org.junit.Rule 29 import org.mockito.ArgumentCaptor 30 import org.mockito.Captor 31 import org.mockito.Mock 32 import org.mockito.Mockito 33 import org.mockito.Mockito.spy 34 import org.mockito.MockitoAnnotations 35 36 open class PackageHelperTestBase { 37 38 companion object { 39 const val PLATFORM_PACKAGE_NAME = "android" 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 pkgListCaptor: ArgumentCaptor<Array<String>> 72 @Captor 73 lateinit var flagsCaptor: ArgumentCaptor<Int> 74 @Captor 75 lateinit var uidsCaptor: ArgumentCaptor<IntArray> 76 77 @Rule 78 @JvmField 79 val rule = MockSystemRule() 80 var deviceOwnerUid = 0 81 82 @Before 83 @Throws(Exception::class) setupnull84 open fun setup() { 85 MockitoAnnotations.initMocks(this) 86 rule.system().stageNominalSystemState() 87 pms = spy(createPackageManagerService( 88 TEST_PACKAGE_1, TEST_PACKAGE_2, DEVICE_OWNER_PACKAGE, DEVICE_ADMIN_PACKAGE, 89 DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, 90 VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE)) 91 suspendPackageHelper = SuspendPackageHelper( 92 pms, rule.mocks().injector, broadcastHelper, protectedPackages) 93 defaultAppProvider = rule.mocks().defaultAppProvider 94 testHandler = rule.mocks().handler 95 packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!! 96 packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!! 97 ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! 98 deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId) 99 packagesToChange = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) 100 uidsToChange = intArrayOf(packageSetting1.appId, packageSetting2.appId) 101 102 whenever(protectedPackages.getDeviceOwnerOrProfileOwnerPackage(eq(TEST_USER_ID))) 103 .thenReturn(DEVICE_OWNER_PACKAGE) 104 whenever(rule.mocks().userManagerService.hasUserRestriction( 105 eq(UserManager.DISALLOW_APPS_CONTROL), eq(TEST_USER_ID))).thenReturn(true) 106 whenever(rule.mocks().userManagerService.hasUserRestriction( 107 eq(UserManager.DISALLOW_UNINSTALL_APPS), eq(TEST_USER_ID))).thenReturn(true) 108 mockKnownPackages(pms) 109 } 110 mockKnownPackagesnull111 private fun mockKnownPackages(pms: PackageManagerService) { 112 Mockito.doAnswer { it.arguments[0] == DEVICE_ADMIN_PACKAGE }.`when`(pms) 113 .isPackageDeviceAdmin(any(), any()) 114 Mockito.doReturn(DEFAULT_HOME_PACKAGE).`when`(defaultAppProvider) 115 .getDefaultHome(eq(TEST_USER_ID)) 116 Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider) 117 .getDefaultDialer(eq(TEST_USER_ID)) 118 Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 119 any(), eq(KnownPackages.PACKAGE_INSTALLER), eq(TEST_USER_ID)) 120 Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 121 any(), eq(KnownPackages.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) 122 Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( 123 any(), eq(KnownPackages.PACKAGE_VERIFIER), eq(TEST_USER_ID)) 124 Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) 125 .getKnownPackageNamesInternal(any(), 126 eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) 127 Mockito.doReturn(MGMT_ROLE_HOLDER_PACKAGE).`when`(pms) 128 .getDevicePolicyManagementRoleHolderPackageName(eq(TEST_USER_ID)) 129 } 130 createPackageManagerServicenull131 private fun createPackageManagerService(vararg stageExistingPackages: String): 132 PackageManagerService { 133 stageExistingPackages.forEach { 134 rule.system().stageScanExistingPackage(it, 1L, 135 rule.system().dataAppDirectory) 136 } 137 var pms = PackageManagerService(rule.mocks().injector, 138 false /* factoryTest */, 139 MockSystem.DEFAULT_VERSION_INFO.fingerprint, 140 false /* isEngBuild */, 141 false /* isUserDebugBuild */, 142 Build.VERSION_CODES.CUR_DEVELOPMENT, 143 Build.VERSION.INCREMENTAL) 144 rule.system().validateFinalState() 145 return pms 146 } 147 } 148