• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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