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