1 /* 2 * Copyright (C) 2020 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 package com.android.bedstead.dpmwrapper; 17 18 import static org.mockito.ArgumentMatchers.any; 19 import static org.mockito.ArgumentMatchers.anyBoolean; 20 import static org.mockito.ArgumentMatchers.anyInt; 21 import static org.mockito.ArgumentMatchers.anyLong; 22 import static org.mockito.Mockito.doAnswer; 23 import static org.mockito.Mockito.doReturn; 24 25 import android.app.admin.DevicePolicyManager; 26 import android.content.Context; 27 import android.content.Intent; 28 import android.util.Log; 29 30 import org.mockito.Mockito; 31 import org.mockito.stubbing.Answer; 32 33 import java.util.HashMap; 34 35 final class DevicePolicyManagerWrapper 36 extends TestAppSystemServiceFactory.ServiceManagerWrapper<DevicePolicyManager> { 37 38 private static final String TAG = DevicePolicyManagerWrapper.class.getSimpleName(); 39 40 private static final HashMap<Context, DevicePolicyManager> sSpies = new HashMap<>(); 41 42 @Override getWrapper(Context context, DevicePolicyManager dpm, Answer<?> answer)43 DevicePolicyManager getWrapper(Context context, DevicePolicyManager dpm, Answer<?> answer) { 44 int userId = context.getUserId(); 45 DevicePolicyManager spy = sSpies.get(context); 46 if (spy != null) { 47 Log.d(TAG, "getWrapper(): returning cached spy for user " + userId); 48 return spy; 49 } 50 51 spy = Mockito.spy(dpm); 52 String spyString = "DevicePolicyManagerWrapper#" + System.identityHashCode(spy); 53 Log.d(TAG, "get(): created spy for user " + context.getUserId() + ": " + spyString); 54 55 56 // TODO(b/176993670): ideally there should be a way to automatically mock all DPM methods, 57 // but that's probably not doable, as there is no contract (such as an interface) to specify 58 // which ones should be spied and which ones should not (in fact, if there was an interface, 59 // we wouldn't need Mockito and could wrap the calls using java's DynamicProxy 60 try { 61 doReturn(spyString).when(spy).toString(); 62 63 // Basic methods used by most tests 64 doAnswer(answer).when(spy).isAdminActive(any()); 65 doAnswer(answer).when(spy).isDeviceOwnerApp(any()); 66 doAnswer(answer).when(spy).isManagedProfile(any()); 67 doAnswer(answer).when(spy).isProfileOwnerApp(any()); 68 doAnswer(answer).when(spy).isAffiliatedUser(); 69 70 // Used by SetTimeTest 71 doAnswer(answer).when(spy).setTime(any(), anyLong()); 72 doAnswer(answer).when(spy).setTimeZone(any(), any()); 73 doAnswer(answer).when(spy).setGlobalSetting(any(), any(), any()); 74 75 // Used by UserControlDisabledPackagesTest 76 doAnswer(answer).when(spy).setUserControlDisabledPackages(any(), any()); 77 doAnswer(answer).when(spy).getUserControlDisabledPackages(any()); 78 79 // Used by DeviceOwnerProvisioningTest 80 doAnswer(answer).when(spy).enableSystemApp(any(), any(String.class)); 81 doAnswer(answer).when(spy).enableSystemApp(any(), any(Intent.class)); 82 doAnswer(answer).when(spy).canAdminGrantSensorsPermissions(); 83 84 // Used by NetworkLoggingTest 85 doAnswer(answer).when(spy).retrieveNetworkLogs(any(), anyLong()); 86 doAnswer(answer).when(spy).setNetworkLoggingEnabled(any(), anyBoolean()); 87 doAnswer(answer).when(spy).isNetworkLoggingEnabled(any()); 88 89 // Used by CtsVerifier 90 doAnswer(answer).when(spy).addUserRestriction(any(), any()); 91 doAnswer(answer).when(spy).clearUserRestriction(any(), any()); 92 doAnswer(answer).when(spy).clearDeviceOwnerApp(any()); 93 doAnswer(answer).when(spy).setKeyguardDisabledFeatures(any(), anyInt()); 94 doAnswer(answer).when(spy).setPasswordQuality(any(), anyInt()); 95 doAnswer(answer).when(spy).setMaximumTimeToLock(any(), anyInt()); 96 doAnswer(answer).when(spy).setPermittedAccessibilityServices(any(), any()); 97 doAnswer(answer).when(spy).setPermittedInputMethods(any(), any()); 98 doAnswer(answer).when(spy).setDeviceOwnerLockScreenInfo(any(), any()); 99 doAnswer(answer).when(spy).setKeyguardDisabled(any(), anyBoolean()); 100 doAnswer(answer).when(spy).setAutoTimeRequired(any(), anyBoolean()); 101 doAnswer(answer).when(spy).setStatusBarDisabled(any(), anyBoolean()); 102 doAnswer(answer).when(spy).setOrganizationName(any(), any()); 103 doAnswer(answer).when(spy).setSecurityLoggingEnabled(any(), anyBoolean()); 104 doAnswer(answer).when(spy).setPermissionGrantState(any(), any(), any(), anyInt()); 105 doAnswer(answer).when(spy).clearPackagePersistentPreferredActivities(any(), any()); 106 doAnswer(answer).when(spy).setAlwaysOnVpnPackage(any(), any(), anyBoolean()); 107 doAnswer(answer).when(spy).setRecommendedGlobalProxy(any(), any()); 108 doAnswer(answer).when(spy).uninstallCaCert(any(), any()); 109 doAnswer(answer).when(spy).setMaximumFailedPasswordsForWipe(any(), anyInt()); 110 doAnswer(answer).when(spy).setSecureSetting(any(), any(), any()); 111 doAnswer(answer).when(spy).setAffiliationIds(any(), any()); 112 doAnswer(answer).when(spy).setStartUserSessionMessage(any(), any()); 113 doAnswer(answer).when(spy).setEndUserSessionMessage(any(), any()); 114 doAnswer(answer).when(spy).setLogoutEnabled(any(), anyBoolean()); 115 doAnswer(answer).when(spy).removeUser(any(), any()); 116 doAnswer(answer).when(spy).setMinimumRequiredWifiSecurityLevel(anyInt()); 117 doAnswer(answer).when(spy).setWifiSsidPolicy(any()); 118 119 // Used by DevicePolicySafetyCheckerIntegrationTest 120 doAnswer(answer).when(spy).createAndManageUser(any(), any(), any(), any(), anyInt()); 121 doAnswer(answer).when(spy).lockNow(); 122 doAnswer(answer).when(spy).lockNow(anyInt()); 123 doAnswer(answer).when(spy).logoutUser(any()); 124 doAnswer(answer).when(spy).reboot(any()); 125 doAnswer(answer).when(spy).removeActiveAdmin(any()); 126 doAnswer(answer).when(spy).removeKeyPair(any(), any()); 127 doAnswer(answer).when(spy).requestBugreport(any()); 128 doAnswer(answer).when(spy).setAlwaysOnVpnPackage(any(), any(), anyBoolean(), any()); 129 doAnswer(answer).when(spy).setApplicationHidden(any(), any(), anyBoolean()); 130 doAnswer(answer).when(spy).setApplicationRestrictions(any(), any(), any()); 131 doAnswer(answer).when(spy).setCameraDisabled(any(), anyBoolean()); 132 doAnswer(answer).when(spy).setFactoryResetProtectionPolicy(any(), any()); 133 doAnswer(answer).when(spy).setGlobalPrivateDnsModeOpportunistic(any()); 134 doAnswer(answer).when(spy).setKeepUninstalledPackages(any(), any()); 135 doAnswer(answer).when(spy).setLockTaskFeatures(any(), anyInt()); 136 doAnswer(answer).when(spy).setLockTaskPackages(any(), any()); 137 doAnswer(answer).when(spy).setMasterVolumeMuted(any(), anyBoolean()); 138 doAnswer(answer).when(spy).setOverrideApnsEnabled(any(), anyBoolean()); 139 doAnswer(answer).when(spy).setPermissionPolicy(any(), anyInt()); 140 doAnswer(answer).when(spy).setRestrictionsProvider(any(), any()); 141 doAnswer(answer).when(spy).setSystemUpdatePolicy(any(), any()); 142 doAnswer(answer).when(spy).setTrustAgentConfiguration(any(), any(), any()); 143 doAnswer(answer).when(spy).startUserInBackground(any(), any()); 144 doAnswer(answer).when(spy).stopUser(any(), any()); 145 doAnswer(answer).when(spy).switchUser(any(), any()); 146 doAnswer(answer).when(spy).wipeData(anyInt(), any()); 147 doAnswer(answer).when(spy).wipeData(anyInt()); 148 149 // Used by ListForegroundAffiliatedUsersTest 150 doAnswer(answer).when(spy).listForegroundAffiliatedUsers(); 151 152 // Used by UserSessionTest 153 doAnswer(answer).when(spy).getStartUserSessionMessage(any()); 154 doAnswer(answer).when(spy).setStartUserSessionMessage(any(), any()); 155 doAnswer(answer).when(spy).getEndUserSessionMessage(any()); 156 doAnswer(answer).when(spy).setEndUserSessionMessage(any(), any()); 157 158 // Used by SuspendPackageTest 159 doAnswer(answer).when(spy).getPolicyExemptApps(); 160 161 // Used by PrivacyDeviceOwnerTest 162 doAnswer(answer).when(spy).getDeviceOwner(); 163 164 // Used by AdminActionBookkeepingTest 165 doAnswer(answer).when(spy).getDeviceOwnerOrganizationName(); 166 doAnswer(answer).when(spy).setOrganizationName(any(), any()); 167 doAnswer(answer).when(spy).retrieveSecurityLogs(any()); 168 doAnswer(answer).when(spy).getLastSecurityLogRetrievalTime(); 169 doAnswer(answer).when(spy).getLastBugReportRequestTime(); 170 doAnswer(answer).when(spy).isDeviceManaged(); 171 doAnswer(answer).when(spy).isCurrentInputMethodSetByOwner(); 172 doAnswer(answer).when(spy).installCaCert(any(), any()); 173 doAnswer(answer).when(spy).getOwnerInstalledCaCerts(any()); 174 doAnswer(answer).when(spy).retrievePreRebootSecurityLogs(any()); 175 doAnswer(answer).when(spy).getLastNetworkLogRetrievalTime(); 176 177 // Used by PrivateDnsPolicyTest 178 doAnswer(answer).when(spy).getGlobalPrivateDnsHost(any()); 179 doAnswer(answer).when(spy).getGlobalPrivateDnsMode(any()); 180 doAnswer(answer).when(spy).setGlobalPrivateDnsModeSpecifiedHost(any(), any()); 181 182 // Used by StorageEncryptionTest 183 doAnswer(answer).when(spy).getStorageEncryptionStatus(); 184 doAnswer(answer).when(spy).setStorageEncryption(any(), anyBoolean()); 185 186 // Used by AdminConfiguredNetworksTest 187 doAnswer(answer).when(spy).setConfiguredNetworksLockdownState(any(), anyBoolean()); 188 189 // Used by SecurityLoggingTest 190 doAnswer(answer).when(spy).isSecurityLoggingEnabled(any()); 191 doAnswer(answer).when(spy).setDelegatedScopes(any(), any(), any()); 192 doAnswer(answer).when(spy).retrieveSecurityLogs(any()); 193 194 // Used by WifiTest 195 doAnswer(answer).when(spy).getWifiMacAddress(any()); 196 197 // Used by AdminConfiguredNetworksTest 198 doAnswer(answer).when(spy).hasLockdownAdminConfiguredNetworks(any()); 199 200 // Used by DevicePolicyLoggingTest 201 doAnswer(answer).when(spy).getAutoTimeEnabled(any()); 202 203 // Used by FactoryResetProtectionPolicyTest 204 doAnswer(answer).when(spy).getFactoryResetProtectionPolicy(any()); 205 206 // Used by DefaultSmsApplicationTest 207 doAnswer(answer).when(spy).setDefaultSmsApplication(any(), any()); 208 209 // Used by OverrideApnTest 210 doAnswer(answer).when(spy).addOverrideApn(any(), any()); 211 doAnswer(answer).when(spy).updateOverrideApn(any(), anyInt(), any()); 212 doAnswer(answer).when(spy).removeOverrideApn(any(), anyInt()); 213 doAnswer(answer).when(spy).getOverrideApns(any()); 214 doAnswer(answer).when(spy).isOverrideApnEnabled(any()); 215 216 // Used for DevicePolicyLoggingTest. 217 doAnswer(answer).when(spy).setPasswordMinimumLength(any(), anyInt()); 218 doAnswer(answer).when(spy).setPasswordMinimumNumeric(any(), anyInt()); 219 doAnswer(answer).when(spy).setPasswordMinimumNonLetter(any(), anyInt()); 220 doAnswer(answer).when(spy).setPasswordMinimumLetters(any(), anyInt()); 221 doAnswer(answer).when(spy).setPasswordMinimumLowerCase(any(), anyInt()); 222 doAnswer(answer).when(spy).setPasswordMinimumUpperCase(any(), anyInt()); 223 doAnswer(answer).when(spy).setPasswordMinimumSymbols(any(), anyInt()); 224 doAnswer(answer).when(spy).setRequiredPasswordComplexity(anyInt()); 225 doAnswer(answer).when(spy).setUninstallBlocked(any(), any(), anyBoolean()); 226 doAnswer(answer).when(spy).setPreferentialNetworkServiceEnabled(anyBoolean()); 227 doAnswer(answer).when(spy).setPersonalAppsSuspended(any(), anyBoolean()); 228 229 // Used by PasswordRequirementsTest 230 doAnswer(answer).when(spy).getPasswordMinimumLength(any()); 231 doAnswer(answer).when(spy).getPasswordMinimumNumeric(any()); 232 doAnswer(answer).when(spy).getPasswordMinimumLetters(any()); 233 doAnswer(answer).when(spy).getPasswordMinimumUpperCase(any()); 234 doAnswer(answer).when(spy).getPasswordMinimumLowerCase(any()); 235 doAnswer(answer).when(spy).getPasswordMinimumNonLetter(any()); 236 doAnswer(answer).when(spy).getPasswordMinimumSymbols(any()); 237 238 // Used by SecurityLoggingTest 239 doAnswer(answer).when(spy).getDelegatedScopes(any(), any()); 240 doAnswer(answer).when(spy).setPasswordExpirationTimeout(any(), anyLong()); 241 doAnswer(answer).when(spy).setPasswordHistoryLength(any(), anyInt()); 242 doAnswer(answer).when(spy).setMaximumFailedPasswordsForWipe(any(), anyInt()); 243 244 // Used by AccessibilityServicesTest 245 doAnswer(answer).when(spy).getPermittedAccessibilityServices(any()); 246 247 // Used by InputMethodsTest 248 doAnswer(answer).when(spy).getPermittedInputMethods(any()); 249 250 // Used by CommonCriteriaModeTest 251 doAnswer(answer).when(spy).setCommonCriteriaModeEnabled(any(), anyBoolean()); 252 doAnswer(answer).when(spy).isCommonCriteriaModeEnabled(any()); 253 254 // Used by AppRestrictionsDelegateTest 255 doAnswer(answer).when(spy).getApplicationRestrictions(any(), any()); 256 257 // Used by PackageAccessDelegateTest 258 doAnswer(answer).when(spy).isApplicationHidden(any(), any()); 259 doAnswer(answer).when(spy).isPackageSuspended(any(), any()); 260 doAnswer(answer).when(spy).setPackagesSuspended(any(), any(), anyBoolean()); 261 262 // Used by PermissionGrantDelegateTest 263 doAnswer(answer).when(spy).getPermissionGrantState(any(), any(), any()); 264 doAnswer(answer).when(spy).getPermissionPolicy(any()); 265 266 // Used by BlockUninstallDelegateTest 267 doAnswer(answer).when(spy).isUninstallBlocked(any(), any()); 268 269 // Used By DelegationTest 270 doAnswer(answer).when(spy).getDelegatePackages(any(), any()); 271 272 // Used by TrustAgentInfoTest 273 doAnswer(answer).when(spy).getTrustAgentConfiguration(any(), any()); 274 275 // Used by BackupServiceActiveTest 276 doAnswer(answer).when(spy).setBackupServiceEnabled(any(), anyBoolean()); 277 doAnswer(answer).when(spy).isBackupServiceEnabled(any()); 278 279 // Used by PendingSystemUpdateTest 280 doAnswer(answer).when(spy).notifyPendingSystemUpdate(anyLong()); 281 doAnswer(answer).when(spy).getPendingSystemUpdate(any()); 282 283 // Used by AffiliationTest (GTS) 284 doAnswer(answer).when(spy).getAffiliationIds(any()); 285 286 // Used by LockScreenInfoTest 287 doAnswer(answer).when(spy).getDeviceOwnerLockScreenInfo(); 288 289 // TODO(b/176993670): add more methods below as tests are converted 290 } catch (Exception e) { 291 // Should never happen, but needs to be catch as some methods declare checked exceptions 292 Log.wtf("Exception setting mocks", e); 293 } 294 295 sSpies.put(context, spy); 296 Log.d(TAG, "getWrapper(): returning new spy for context " + context + " (" 297 + context.getPackageName() + ")" + " and user " + userId); 298 299 return spy; 300 } 301 } 302