• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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.devicepolicy;
18 
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.when;
21 
22 import android.annotation.Nullable;
23 import android.app.AppOpsManager;
24 import android.content.BroadcastReceiver;
25 import android.content.ContentResolver;
26 import android.content.Context;
27 import android.content.Intent;
28 import android.content.IntentFilter;
29 import android.content.pm.ApplicationInfo;
30 import android.content.pm.PackageManager;
31 import android.content.res.Resources;
32 import android.os.Bundle;
33 import android.os.Handler;
34 import android.os.UserHandle;
35 import android.test.mock.MockContext;
36 import android.util.ArrayMap;
37 import android.util.DisplayMetrics;
38 import android.util.ExceptionUtils;
39 
40 import androidx.annotation.NonNull;
41 
42 import com.android.internal.util.FunctionalUtils;
43 import com.android.server.pm.UserManagerInternal;
44 
45 import org.junit.Assert;
46 
47 import java.util.ArrayList;
48 import java.util.List;
49 import java.util.Map;
50 import java.util.concurrent.Executor;
51 
52 /**
53  * Context used throughout DPMS tests.
54  */
55 public class DpmMockContext extends MockContext {
56     /**
57      * User-id of a non-system user we use throughout unit tests.
58      */
59     public static final int CALLER_USER_HANDLE = 20;
60 
61     /**
62      * UID corresponding to {@link #CALLER_USER_HANDLE}.
63      */
64     public static final int CALLER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 20123);
65 
66     /**
67      * UID corresponding to {@link #CALLER_USER_HANDLE}.
68      */
69     public static final int CALLER_MANAGED_PROVISIONING_UID = UserHandle.getUid(CALLER_USER_HANDLE,
70             20125);
71 
72     /**
73      * UID used when a caller is on the system user.
74      */
75     public static final int CALLER_SYSTEM_USER_UID = 20321;
76 
77     /**
78      * PID of the caller.
79      */
80     public static final int CALLER_PID = 22222;
81 
82     /**
83      * UID of the system server.
84      */
85     public static final int SYSTEM_UID = android.os.Process.SYSTEM_UID;
86 
87     /**
88      * PID of the system server.
89      */
90     public static final int SYSTEM_PID = 11111;
91 
92     public static final String ANOTHER_PACKAGE_NAME = "com.another.package.name";
93     public static final int ANOTHER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM, 18434);
94 
95     public static final String DELEGATE_PACKAGE_NAME = "com.delegate.package.name";
96     public static final int DELEGATE_CERT_INSTALLER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM,
97             18437);
98 
99     private final MockSystemServices mMockSystemServices;
100 
101     public static class MockBinder {
102         public int callingUid = CALLER_UID;
103         public int callingPid = CALLER_PID;
104         public final Map<Integer, List<String>> callingPermissions = new ArrayMap<>();
105 
clearCallingIdentity()106         public long clearCallingIdentity() {
107             final long token = (((long) callingUid) << 32) | (callingPid);
108             callingUid = SYSTEM_UID;
109             callingPid = SYSTEM_PID;
110             return token;
111         }
112 
restoreCallingIdentity(long token)113         public void restoreCallingIdentity(long token) {
114             callingUid = (int) (token >> 32);
115             callingPid = (int) token;
116         }
117 
withCleanCallingIdentity(@onNull FunctionalUtils.ThrowingRunnable action)118         public void withCleanCallingIdentity(@NonNull FunctionalUtils.ThrowingRunnable action) {
119             final long callingIdentity = clearCallingIdentity();
120             Throwable throwableToPropagate = null;
121             try {
122                 action.runOrThrow();
123             } catch (Throwable throwable) {
124                 throwableToPropagate = throwable;
125             } finally {
126                 restoreCallingIdentity(callingIdentity);
127                 if (throwableToPropagate != null) {
128                     throw ExceptionUtils.propagate(throwableToPropagate);
129                 }
130             }
131         }
132 
getCallingUid()133         public int getCallingUid() {
134             return callingUid;
135         }
136 
getCallingPid()137         public int getCallingPid() {
138             return callingPid;
139         }
140 
getCallingUserHandle()141         public UserHandle getCallingUserHandle() {
142             return new UserHandle(UserHandle.getUserId(getCallingUid()));
143         }
144 
isCallerUidMyUid()145         public boolean isCallerUidMyUid() {
146             return callingUid == SYSTEM_UID;
147         }
148     }
149 
150     private final Context realTestContext;
151 
152     /**
153      * Use this instance to verify unimplemented methods such as {@link #sendBroadcast}.
154      * (Spying on {@code this} instance will confuse mockito somehow and I got weired "wrong number
155      * of arguments" exceptions.)
156      */
157     public final Context spiedContext;
158 
159     public final MockBinder binder;
160     public final Resources resources;
161 
162     /** TODO: Migrate everything to use {@link #permissions} to avoid confusion. */
163     @Deprecated
164     public final List<String> callerPermissions = new ArrayList<>();
165 
166     /** Less confusing alias for {@link #callerPermissions}. */
167     public final List<String> permissions = callerPermissions;
168 
169     public String packageName = null;
170 
171     public ApplicationInfo applicationInfo = null;
172 
DpmMockContext(MockSystemServices mockSystemServices, Context context)173     public DpmMockContext(MockSystemServices mockSystemServices, Context context) {
174         mMockSystemServices = mockSystemServices;
175         realTestContext = context;
176 
177         binder = new MockBinder();
178         resources = mock(Resources.class);
179         spiedContext = mock(Context.class);
180 
181         // Set up density for notification building
182         DisplayMetrics displayMetrics = mock(DisplayMetrics.class);
183         displayMetrics.density = 2.25f;
184         when(resources.getDisplayMetrics()).thenReturn(displayMetrics);
185     }
186 
187     @Override
getResources()188     public Resources getResources() {
189         return resources;
190     }
191 
192     @Override
getTheme()193     public Resources.Theme getTheme() {
194         return spiedContext.getTheme();
195     }
196 
197     @Override
getPackageName()198     public String getPackageName() {
199         if (packageName != null) {
200             return packageName;
201         }
202         return super.getPackageName();
203     }
204 
205     @Override
getApplicationInfo()206     public ApplicationInfo getApplicationInfo() {
207         if (applicationInfo != null) {
208             return applicationInfo;
209         }
210         return super.getApplicationInfo();
211     }
212 
213     @Override
getSystemService(String name)214     public Object getSystemService(String name) {
215         switch (name) {
216             case Context.ALARM_SERVICE:
217                 return mMockSystemServices.alarmManager;
218             case Context.USER_SERVICE:
219                 return mMockSystemServices.userManager;
220             case Context.POWER_SERVICE:
221                 return mMockSystemServices.powerManager;
222             case Context.WIFI_SERVICE:
223                 return mMockSystemServices.wifiManager;
224             case Context.ACCOUNT_SERVICE:
225                 return mMockSystemServices.accountManager;
226             case Context.TELEPHONY_SERVICE:
227                 return mMockSystemServices.telephonyManager;
228             case Context.CONNECTIVITY_SERVICE:
229                 return mMockSystemServices.connectivityManager;
230             case Context.APP_OPS_SERVICE:
231                 return mMockSystemServices.appOpsManager;
232             case Context.CROSS_PROFILE_APPS_SERVICE:
233                 return mMockSystemServices.crossProfileApps;
234             case Context.VPN_MANAGEMENT_SERVICE:
235                 return mMockSystemServices.vpnManager;
236             case Context.DEVICE_POLICY_SERVICE:
237                 return mMockSystemServices.devicePolicyManager;
238             case Context.LOCATION_SERVICE:
239                 return mMockSystemServices.locationManager;
240             case Context.ROLE_SERVICE:
241                 return mMockSystemServices.roleManager;
242         }
243         throw new UnsupportedOperationException();
244     }
245 
246     @Override
getSystemServiceName(Class<?> serviceClass)247     public String getSystemServiceName(Class<?> serviceClass) {
248         return realTestContext.getSystemServiceName(serviceClass);
249     }
250 
251     @Override
getPackageManager()252     public PackageManager getPackageManager() {
253         return mMockSystemServices.packageManager;
254     }
255 
getUserManagerInternal()256     public UserManagerInternal getUserManagerInternal() {
257         return mMockSystemServices.userManagerInternal;
258     }
259 
260     @Override
enforceCallingOrSelfPermission(String permission, String message)261     public void enforceCallingOrSelfPermission(String permission, String message) {
262         if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) {
263             return; // Assume system has all permissions.
264         }
265         List<String> permissions = binder.callingPermissions.get(binder.getCallingUid());
266         if (permissions == null) {
267             // TODO: delete the following line. to do this without breaking any tests, first it's
268             //       necessary to remove all tests that set it directly.
269             permissions = callerPermissions;
270             //            throw new UnsupportedOperationException(
271             //                    "Caller UID " + binder.getCallingUid() + " doesn't exist");
272         }
273         if (!permissions.contains(permission)) {
274             throw new SecurityException("Caller doesn't have " + permission + " : " + message);
275         }
276     }
277 
278     @Override
checkPermission(String permission, int pid, int uid)279     public int checkPermission(String permission, int pid, int uid) {
280         return checkPermission(permission);
281     }
282 
283     @Override
sendBroadcast(Intent intent)284     public void sendBroadcast(Intent intent) {
285         spiedContext.sendBroadcast(intent);
286     }
287 
288     @Override
sendBroadcast(Intent intent, String receiverPermission)289     public void sendBroadcast(Intent intent, String receiverPermission) {
290         spiedContext.sendBroadcast(intent, receiverPermission);
291     }
292 
293     @Override
sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions)294     public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
295         spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions);
296     }
297 
298     @Override
sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, Bundle options)299     public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
300             Bundle options) {
301         spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions, options);
302     }
303 
304     @Override
sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions)305     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
306             String[] receiverPermissions) {
307         spiedContext.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions);
308     }
309 
310     @Override
sendBroadcast(Intent intent, String receiverPermission, Bundle options)311     public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) {
312         spiedContext.sendBroadcast(intent, receiverPermission, options);
313     }
314 
315     @Override
sendBroadcast(Intent intent, String receiverPermission, int appOp)316     public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
317         spiedContext.sendBroadcast(intent, receiverPermission, appOp);
318     }
319 
320     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)321     public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
322         spiedContext.sendOrderedBroadcast(intent, receiverPermission);
323     }
324 
325     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)326     public void sendOrderedBroadcast(Intent intent, String receiverPermission,
327             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
328             String initialData, Bundle initialExtras) {
329         spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
330                 initialCode, initialData, initialExtras);
331     }
332 
333     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)334     public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
335             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
336             String initialData, Bundle initialExtras) {
337         spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver,
338                 scheduler,
339                 initialCode, initialData, initialExtras);
340     }
341 
342     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)343     public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
344             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
345             String initialData, Bundle initialExtras) {
346         spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver,
347                 scheduler,
348                 initialCode, initialData, initialExtras);
349     }
350 
351     @Override
sendBroadcastAsUser(Intent intent, UserHandle user)352     public void sendBroadcastAsUser(Intent intent, UserHandle user) {
353         if (binder.callingPid != SYSTEM_PID) {
354             // Unless called as the system process, can only call if the target user is the
355             // calling user.
356             // (The actual check is more complex; we may need to change it later.)
357             Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier());
358         }
359 
360         spiedContext.sendBroadcastAsUser(intent, user);
361     }
362 
363     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options)364     public void sendBroadcastAsUser(Intent intent,
365             UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options) {
366         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, options);
367     }
368 
369     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)370     public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) {
371         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission);
372     }
373 
374     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)375     public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
376             int appOp) {
377         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp);
378     }
379 
380     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)381     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
382             String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
383             int initialCode, String initialData, Bundle initialExtras) {
384         sendOrderedBroadcastAsUser(
385                 intent, user, receiverPermission, AppOpsManager.OP_NONE, resultReceiver,
386                 scheduler, initialCode, initialData, initialExtras);
387     }
388 
389     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)390     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
391             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
392             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
393         sendOrderedBroadcastAsUser(
394                 intent, user, receiverPermission, appOp, null, resultReceiver,
395                 scheduler, initialCode, initialData, initialExtras);
396     }
397 
398     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)399     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
400             String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
401             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
402         spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options,
403                 resultReceiver, scheduler, initialCode, initialData, initialExtras);
404         resultReceiver.onReceive(spiedContext, intent);
405     }
406 
407     @Override
sendStickyBroadcast(Intent intent)408     public void sendStickyBroadcast(Intent intent) {
409         spiedContext.sendStickyBroadcast(intent);
410     }
411 
412     @Override
sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)413     public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
414             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
415         spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode,
416                 initialData, initialExtras);
417     }
418 
419     @Override
removeStickyBroadcast(Intent intent)420     public void removeStickyBroadcast(Intent intent) {
421         spiedContext.removeStickyBroadcast(intent);
422     }
423 
424     @Override
sendStickyBroadcastAsUser(Intent intent, UserHandle user)425     public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
426         spiedContext.sendStickyBroadcastAsUser(intent, user);
427     }
428 
429     @Override
sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)430     public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user,
431             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
432             String initialData, Bundle initialExtras) {
433         spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode,
434                 initialData, initialExtras);
435     }
436 
437     @Override
removeStickyBroadcastAsUser(Intent intent, UserHandle user)438     public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
439         spiedContext.removeStickyBroadcastAsUser(intent, user);
440     }
441 
442     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)443     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
444         mMockSystemServices.registerReceiver(receiver, filter, null);
445         return spiedContext.registerReceiver(receiver, filter);
446     }
447 
448     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)449     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
450         mMockSystemServices.registerReceiver(receiver, filter, null);
451         return spiedContext.registerReceiver(receiver, filter, flags);
452     }
453 
454     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)455     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
456             String broadcastPermission, Handler scheduler) {
457         mMockSystemServices.registerReceiver(receiver, filter, scheduler);
458         return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler);
459     }
460 
461     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)462     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
463             IntentFilter filter, String broadcastPermission, Handler scheduler) {
464         mMockSystemServices.registerReceiver(receiver, filter, scheduler);
465         return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
466                 scheduler);
467     }
468 
469     @Override
unregisterReceiver(BroadcastReceiver receiver)470     public void unregisterReceiver(BroadcastReceiver receiver) {
471         mMockSystemServices.unregisterReceiver(receiver);
472         spiedContext.unregisterReceiver(receiver);
473     }
474 
475     @Override
createPackageContextAsUser(String packageName, int flags, UserHandle user)476     public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
477             throws PackageManager.NameNotFoundException {
478         return mMockSystemServices.createPackageContextAsUser(packageName, flags, user);
479     }
480 
481     @Override
createContextAsUser(UserHandle user, int flags)482     public Context createContextAsUser(UserHandle user, int flags) {
483         try {
484             return mMockSystemServices.createPackageContextAsUser(packageName, flags, user);
485         } catch (PackageManager.NameNotFoundException e) {
486             throw new IllegalStateException(e);
487         }
488     }
489 
490     @Override
getContentResolver()491     public ContentResolver getContentResolver() {
492         return mMockSystemServices.contentResolver;
493     }
494 
495     @Override
getUserId()496     public int getUserId() {
497         return UserHandle.getUserId(binder.getCallingUid());
498     }
499 
500     @Override
getMainExecutor()501     public Executor getMainExecutor() {
502         return mMockSystemServices.executor;
503     }
504 
505     @Override
checkCallingPermission(String permission)506     public int checkCallingPermission(String permission) {
507         return checkPermission(permission);
508     }
509 
510     @Override
checkCallingOrSelfPermission(String permission)511     public int checkCallingOrSelfPermission(String permission) {
512         return checkPermission(permission);
513     }
514 
515     @Override
startActivityAsUser(Intent intent, UserHandle userHandle)516     public void startActivityAsUser(Intent intent, UserHandle userHandle) {
517         spiedContext.startActivityAsUser(intent, userHandle);
518     }
519 
checkPermission(String permission)520     private int checkPermission(String permission) {
521         if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) {
522             return PackageManager.PERMISSION_GRANTED; // Assume system has all permissions.
523         }
524         List<String> permissions = binder.callingPermissions.get(binder.getCallingUid());
525         if (permissions == null) {
526             permissions = callerPermissions;
527         }
528         if (permissions.contains(permission)) {
529             return PackageManager.PERMISSION_GRANTED;
530         } else {
531             return PackageManager.PERMISSION_DENIED;
532         }
533     }
534 
535 }
536