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