• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.internal.telephony;
18 
19 import static org.mockito.ArgumentMatchers.anyString;
20 import static org.mockito.ArgumentMatchers.nullable;
21 import static org.mockito.Mockito.any;
22 import static org.mockito.Mockito.anyInt;
23 import static org.mockito.Mockito.doAnswer;
24 import static org.mockito.Mockito.doReturn;
25 import static org.mockito.Mockito.eq;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.spy;
28 import static org.mockito.Mockito.when;
29 
30 import android.app.ActivityManager;
31 import android.app.AlarmManager;
32 import android.app.AppOpsManager;
33 import android.app.DownloadManager;
34 import android.app.KeyguardManager;
35 import android.app.NotificationManager;
36 import android.app.UiModeManager;
37 import android.app.usage.UsageStatsManager;
38 import android.content.BroadcastReceiver;
39 import android.content.ComponentName;
40 import android.content.ContentProvider;
41 import android.content.ContentResolver;
42 import android.content.ContentValues;
43 import android.content.Context;
44 import android.content.Intent;
45 import android.content.IntentFilter;
46 import android.content.ServiceConnection;
47 import android.content.SharedPreferences;
48 import android.content.pm.ApplicationInfo;
49 import android.content.pm.PackageInfo;
50 import android.content.pm.PackageManager;
51 import android.content.pm.PackageManager.NameNotFoundException;
52 import android.content.pm.ResolveInfo;
53 import android.content.pm.ServiceInfo;
54 import android.content.res.AssetManager;
55 import android.content.res.Configuration;
56 import android.content.res.Resources;
57 import android.database.Cursor;
58 import android.database.MatrixCursor;
59 import android.location.LocationManager;
60 import android.net.ConnectivityManager;
61 import android.net.Network;
62 import android.net.Uri;
63 import android.net.vcn.VcnManager;
64 import android.net.wifi.WifiManager;
65 import android.os.BatteryManager;
66 import android.os.Bundle;
67 import android.os.Handler;
68 import android.os.IInterface;
69 import android.os.PersistableBundle;
70 import android.os.PowerWhitelistManager;
71 import android.os.SystemConfigManager;
72 import android.os.UserHandle;
73 import android.os.UserManager;
74 import android.preference.PreferenceManager;
75 import android.provider.Settings;
76 import android.provider.Telephony.ServiceStateTable;
77 import android.telecom.TelecomManager;
78 import android.telephony.CarrierConfigManager;
79 import android.telephony.SubscriptionManager;
80 import android.telephony.TelephonyManager;
81 import android.telephony.TelephonyRegistryManager;
82 import android.telephony.euicc.EuiccManager;
83 import android.test.mock.MockContentProvider;
84 import android.test.mock.MockContentResolver;
85 import android.test.mock.MockContext;
86 import android.util.DisplayMetrics;
87 import android.util.Log;
88 
89 import com.google.common.collect.ArrayListMultimap;
90 import com.google.common.collect.Multimap;
91 
92 import org.mockito.MockitoAnnotations;
93 import org.mockito.invocation.InvocationOnMock;
94 import org.mockito.stubbing.Answer;
95 
96 import java.util.ArrayList;
97 import java.util.Arrays;
98 import java.util.Collection;
99 import java.util.HashMap;
100 import java.util.HashSet;
101 import java.util.List;
102 import java.util.Locale;
103 import java.util.Map;
104 import java.util.Set;
105 
106 /**
107  * Controls a test {@link Context} as would be provided by the Android framework to an
108  * {@code Activity}, {@code Service} or other system-instantiated component.
109  *
110  * Contains Fake<Component> classes like FakeContext for components that require complex and
111  * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public
112  * methods of this class.
113  */
114 public class ContextFixture implements TestFixture<Context> {
115     private static final String TAG = "ContextFixture";
116     public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION";
117 
118     public class FakeContentProvider extends MockContentProvider {
119         private String[] mColumns = {"name", "value"};
120         private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>();
121         private int mNumKeyValuePairs = 0;
122 
123         @Override
delete(Uri uri, String selection, String[] selectionArgs)124         public int delete(Uri uri, String selection, String[] selectionArgs) {
125             return 0;
126         }
127 
128         @Override
insert(Uri uri, ContentValues values)129         public Uri insert(Uri uri, ContentValues values) {
130             Uri newUri = null;
131             if (values != null) {
132                 mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value"));
133                 mNumKeyValuePairs++;
134                 newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs);
135             }
136             logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri +
137                     " newUri: " + newUri);
138             return newUri;
139         }
140 
141         @Override
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)142         public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
143                             String sortOrder) {
144             //assuming query will always be of the form 'name = ?'
145             logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri);
146             if (mKeyValuePairs.containsKey(selectionArgs[0])) {
147                 MatrixCursor cursor = new MatrixCursor(projection);
148                 cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])});
149                 return cursor;
150             }
151             return null;
152         }
153 
154         @Override
call(String method, String request, Bundle args)155         public Bundle call(String method, String request, Bundle args) {
156             logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method +
157                     " request: " + request);
158             switch(method) {
159                 case Settings.CALL_METHOD_GET_GLOBAL:
160                 case Settings.CALL_METHOD_GET_SECURE:
161                 case Settings.CALL_METHOD_GET_SYSTEM:
162                     if (mKeyValuePairs.containsKey(request)) {
163                         Bundle b = new Bundle(1);
164                         b.putCharSequence("value", mKeyValuePairs.get(request));
165                         logd("returning value pair: " + mKeyValuePairs.get(request) + " for " +
166                                 request);
167                         return b;
168                     }
169                     break;
170                 case Settings.CALL_METHOD_PUT_GLOBAL:
171                 case Settings.CALL_METHOD_PUT_SECURE:
172                 case Settings.CALL_METHOD_PUT_SYSTEM:
173                     logd("adding key-value pair: " + request + "-" + (String)args.get("value"));
174                     mKeyValuePairs.put(request, (String)args.get("value"));
175                     mNumKeyValuePairs++;
176                     break;
177             }
178             return null;
179         }
180     }
181 
182     private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>();
183 
setSystemService(String name, Object service)184     public void setSystemService(String name, Object service) {
185         synchronized (mSystemServices) {
186             mSystemServices.put(name, service);
187         }
188     }
189 
190     public class FakeContext extends MockContext {
191         @Override
getPackageManager()192         public PackageManager getPackageManager() {
193             return mPackageManager;
194         }
195 
196         @Override
bindService( Intent serviceIntent, ServiceConnection connection, int flags)197         public boolean bindService(
198                 Intent serviceIntent,
199                 ServiceConnection connection,
200                 int flags) {
201             if (mMockBindingFailureForPackage.contains(serviceIntent.getPackage())) {
202                 return false;
203             }
204             if (mServiceByServiceConnection.containsKey(connection)) {
205                 throw new RuntimeException("ServiceConnection already bound: " + connection);
206             }
207             IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
208             if (service == null) {
209                 service = mServiceByPackageName.get(serviceIntent.getPackage());
210             }
211             if (service == null) {
212                 throw new RuntimeException(
213                         String.format("ServiceConnection not found for component: %s, package: %s",
214                                 serviceIntent.getComponent(), serviceIntent.getPackage()));
215             }
216             mServiceByServiceConnection.put(connection, service);
217             connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
218             return true;
219         }
220 
221         @Override
unbindService( ServiceConnection connection)222         public void unbindService(
223                 ServiceConnection connection) {
224             IInterface service = mServiceByServiceConnection.remove(connection);
225             if (service != null) {
226                 connection.onServiceDisconnected(mComponentNameByService.get(service));
227             } else {
228                 logd("unbindService: ServiceConnection not found: " + connection);
229             }
230         }
231 
232         @Override
getSystemService(String name)233         public Object getSystemService(String name) {
234             synchronized (mSystemServices) {
235                 Object service = mSystemServices.get(name);
236                 if (service != null) return service;
237             }
238             switch (name) {
239                 case Context.TELEPHONY_SERVICE:
240                     return mTelephonyManager;
241                 case Context.ACTIVITY_SERVICE:
242                     return mActivityManager;
243                 case Context.APP_OPS_SERVICE:
244                     return mAppOpsManager;
245                 case Context.NOTIFICATION_SERVICE:
246                     return mNotificationManager;
247                 case Context.USER_SERVICE:
248                     return mUserManager;
249                 case Context.CARRIER_CONFIG_SERVICE:
250                     return mCarrierConfigManager;
251                 case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
252                     return mSubscriptionManager;
253                 case Context.WIFI_SERVICE:
254                     return mWifiManager;
255                 case Context.ALARM_SERVICE:
256                     return mAlarmManager;
257                 case Context.CONNECTIVITY_SERVICE:
258                     return mConnectivityManager;
259                 case Context.USAGE_STATS_SERVICE:
260                     return mUsageStatManager;
261                 case Context.BATTERY_SERVICE:
262                     return mBatteryManager;
263                 case Context.EUICC_SERVICE:
264                     return mEuiccManager;
265                 case Context.TELECOM_SERVICE:
266                     return mTelecomManager;
267                 case Context.DOWNLOAD_SERVICE:
268                     return mDownloadManager;
269                 case Context.TELEPHONY_REGISTRY_SERVICE:
270                     return mTelephonyRegistryManager;
271                 case Context.SYSTEM_CONFIG_SERVICE:
272                     return mSystemConfigManager;
273                 case Context.KEYGUARD_SERVICE:
274                     return mKeyguardManager;
275                 case Context.VCN_MANAGEMENT_SERVICE:
276                     return mVcnManager;
277                 case Context.BATTERY_STATS_SERVICE:
278                 case Context.DISPLAY_SERVICE:
279                 case Context.POWER_SERVICE:
280                 case Context.PERMISSION_SERVICE:
281                 case Context.LEGACY_PERMISSION_SERVICE:
282                     // These are final classes so cannot be mocked,
283                     // return real services.
284                     return TestApplication.getAppContext().getSystemService(name);
285                 case Context.POWER_WHITELIST_MANAGER:
286                     return mPowerWhitelistManager;
287                 case Context.LOCATION_SERVICE:
288                     return mLocationManager;
289                 default:
290                     return null;
291             }
292         }
293 
294         @Override
getSystemServiceName(Class<?> serviceClass)295         public String getSystemServiceName(Class<?> serviceClass) {
296             if (serviceClass == SubscriptionManager.class) {
297                 return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
298             } else if (serviceClass == AppOpsManager.class) {
299                 return Context.APP_OPS_SERVICE;
300             } else if (serviceClass == TelecomManager.class) {
301                 return Context.TELECOM_SERVICE;
302             } else if (serviceClass == UserManager.class) {
303                 return Context.USER_SERVICE;
304             } else if (serviceClass == ConnectivityManager.class) {
305                 return Context.CONNECTIVITY_SERVICE;
306             } else if (serviceClass == PowerWhitelistManager.class) {
307                 return Context.POWER_WHITELIST_MANAGER;
308             } else if (serviceClass == SystemConfigManager.class) {
309                 return Context.SYSTEM_CONFIG_SERVICE;
310             } else if (serviceClass == ActivityManager.class) {
311                 return Context.ACTIVITY_SERVICE;
312             } else if (serviceClass == LocationManager.class) {
313                 return Context.LOCATION_SERVICE;
314             } else if (serviceClass == CarrierConfigManager.class) {
315                 return Context.CARRIER_CONFIG_SERVICE;
316             } else if (serviceClass == TelephonyManager.class) {
317                 return Context.TELEPHONY_SERVICE;
318             } else if (serviceClass == UiModeManager.class) {
319                 return Context.UI_MODE_SERVICE;
320             } else if (serviceClass == KeyguardManager.class) {
321                 return Context.KEYGUARD_SERVICE;
322             } else if (serviceClass == VcnManager.class) {
323                 return Context.VCN_MANAGEMENT_SERVICE;
324             }
325             return super.getSystemServiceName(serviceClass);
326         }
327 
328         @Override
getUserId()329         public int getUserId() {
330             return 0;
331         }
332 
333         @Override
getAssets()334         public AssetManager getAssets() {
335             return mAssetManager;
336         }
337 
338         @Override
getResources()339         public Resources getResources() {
340             return mResources;
341         }
342 
343         @Override
createConfigurationContext(Configuration overrideConfiguration)344         public Context createConfigurationContext(Configuration overrideConfiguration) {
345             return spy(new FakeContext());
346         }
347 
348         @Override
getApplicationInfo()349         public ApplicationInfo getApplicationInfo() {
350             return mApplicationInfo;
351         }
352 
353         @Override
getOpPackageName()354         public String getOpPackageName() {
355             return "com.android.internal.telephony";
356         }
357 
358         @Override
getContentResolver()359         public ContentResolver getContentResolver() {
360             return mContentResolver;
361         }
362 
363         @Override
getTheme()364         public Resources.Theme getTheme() {
365             return null;
366         }
367 
368         @Override
unregisterReceiver(BroadcastReceiver receiver)369         public void unregisterReceiver(BroadcastReceiver receiver) {
370         }
371 
372         @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)373         public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
374             return registerReceiverFakeImpl(receiver, filter);
375         }
376 
377         @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)378         public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
379                 String broadcastPermission, Handler scheduler) {
380             return registerReceiverFakeImpl(receiver, filter);
381         }
382 
383         @Override
registerReceiverForAllUsers(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)384         public Intent registerReceiverForAllUsers(BroadcastReceiver receiver,
385                 IntentFilter filter, String broadcastPermission, Handler scheduler) {
386             return registerReceiverFakeImpl(receiver, filter);
387         }
388 
389         @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)390         public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
391                 IntentFilter filter, String broadcastPermission, Handler scheduler) {
392             return registerReceiverFakeImpl(receiver, filter);
393         }
394 
registerReceiverFakeImpl(BroadcastReceiver receiver, IntentFilter filter)395         private Intent registerReceiverFakeImpl(BroadcastReceiver receiver, IntentFilter filter) {
396             Intent result = null;
397             synchronized (mBroadcastReceiversByAction) {
398                 for (int i = 0 ; i < filter.countActions() ; i++) {
399                     mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
400                     if (result == null) {
401                         result = mStickyBroadcastByAction.get(filter.getAction(i));
402                     }
403                 }
404             }
405 
406             return result;
407         }
408 
409         @Override
sendBroadcast(Intent intent)410         public void sendBroadcast(Intent intent) {
411             logd("sendBroadcast called for " + intent.getAction());
412             synchronized (mBroadcastReceiversByAction) {
413                 for (BroadcastReceiver broadcastReceiver :
414                         mBroadcastReceiversByAction.get(intent.getAction())) {
415                     broadcastReceiver.onReceive(mContext, intent);
416                 }
417             }
418         }
419 
420         @Override
sendBroadcast(Intent intent, String receiverPermission)421         public void sendBroadcast(Intent intent, String receiverPermission) {
422             logd("sendBroadcast called for " + intent.getAction());
423             sendBroadcast(intent);
424         }
425 
426         @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)427         public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
428             logd("sendOrderedBroadcast called for " + intent.getAction());
429             sendBroadcast(intent);
430         }
431 
432         @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)433         public void sendOrderedBroadcast(Intent intent, String receiverPermission,
434                 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
435                 String initialData, Bundle initialExtras) {
436             sendOrderedBroadcast(intent, receiverPermission);
437             if (resultReceiver != null) {
438                 synchronized (mOrderedBroadcastReceivers) {
439                     mOrderedBroadcastReceivers.put(intent, resultReceiver);
440                 }
441             }
442         }
443 
444         @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)445         public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
446                 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
447                 String initialData, Bundle initialExtras) {
448             mLastBroadcastOptions = options;
449             sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
450                     initialCode, initialData, initialExtras);
451         }
452 
453         @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)454         public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
455                 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
456                 String initialData, Bundle initialExtras) {
457             sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
458                     initialCode, initialData, initialExtras);
459         }
460 
461         @Override
sendBroadcastAsUser(Intent intent, UserHandle user)462         public void sendBroadcastAsUser(Intent intent, UserHandle user) {
463             sendBroadcast(intent);
464         }
465 
466         @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)467         public void sendBroadcastAsUser(Intent intent, UserHandle user,
468                                         String receiverPermission) {
469             sendBroadcast(intent);
470         }
471 
472         @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)473         public void sendBroadcastAsUser(Intent intent, UserHandle user,
474                                         String receiverPermission, int appOp) {
475             sendBroadcast(intent);
476         }
477 
478         @Override
sendBroadcastMultiplePermissions(Intent intent, String[] includePermissions, String[] excludePermissions)479         public void sendBroadcastMultiplePermissions(Intent intent,
480                 String[] includePermissions, String[] excludePermissions) {
481             sendBroadcast(intent);
482         }
483 
484         @Override
createContextAsUser(UserHandle user, int flags)485         public Context createContextAsUser(UserHandle user, int flags) {
486             return this;
487         }
488 
489         @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)490         public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
491                 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
492                 int initialCode, String initialData, Bundle initialExtras) {
493             logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
494             sendBroadcast(intent);
495             if (resultReceiver != null) {
496                 synchronized (mOrderedBroadcastReceivers) {
497                     mOrderedBroadcastReceivers.put(intent, resultReceiver);
498                 }
499             }
500         }
501 
502         @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)503         public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
504                 String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
505                 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
506             logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
507             sendBroadcast(intent);
508             if (resultReceiver != null) {
509                 synchronized (mOrderedBroadcastReceivers) {
510                     mOrderedBroadcastReceivers.put(intent, resultReceiver);
511                 }
512             }
513         }
514 
515         @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)516         public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
517                 String receiverPermission, int appOp, Bundle options,
518                 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
519                 String initialData, Bundle initialExtras) {
520             logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
521             mLastBroadcastOptions = options;
522             sendBroadcast(intent);
523             if (resultReceiver != null) {
524                 synchronized (mOrderedBroadcastReceivers) {
525                     mOrderedBroadcastReceivers.put(intent, resultReceiver);
526                 }
527             }
528         }
529 
530         @Override
sendOrderedBroadcast(Intent intent, int initialCode, String receiverPermission, String receiverAppOp, BroadcastReceiver resultReceiver, Handler scheduler, String initialData, Bundle initialExtras, Bundle options)531         public void sendOrderedBroadcast(Intent intent, int initialCode, String receiverPermission,
532                 String receiverAppOp, BroadcastReceiver resultReceiver, Handler scheduler,
533                 String initialData, Bundle initialExtras, Bundle options) {
534             logd("sendOrderedBroadcast called for " + intent.getAction());
535             mLastBroadcastOptions = options;
536             sendBroadcast(intent);
537             if (resultReceiver != null) {
538                 synchronized (mOrderedBroadcastReceivers) {
539                     mOrderedBroadcastReceivers.put(intent, resultReceiver);
540                 }
541             }
542         }
543 
544         @Override
sendStickyBroadcast(Intent intent)545         public void sendStickyBroadcast(Intent intent) {
546             logd("sendStickyBroadcast called for " + intent.getAction());
547             synchronized (mBroadcastReceiversByAction) {
548                 sendBroadcast(intent);
549                 mStickyBroadcastByAction.put(intent.getAction(), intent);
550             }
551         }
552 
553         @Override
sendStickyBroadcastAsUser(Intent intent, UserHandle ignored)554         public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
555             logd("sendStickyBroadcastAsUser called for " + intent.getAction());
556             sendStickyBroadcast(intent);
557         }
558 
559         @Override
createPackageContextAsUser(String packageName, int flags, UserHandle user)560         public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
561                 throws PackageManager.NameNotFoundException {
562             return this;
563         }
564 
565         @Override
enforceCallingOrSelfPermission(String permission, String message)566         public void enforceCallingOrSelfPermission(String permission, String message) {
567             if (mPermissionTable.contains(permission)
568                     || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
569                 return;
570             }
571             logd("requested permission: " + permission + " got denied");
572             throw new SecurityException(permission + " denied: " + message);
573         }
574 
575         @Override
enforcePermission(String permission, int pid, int uid, String message)576         public void enforcePermission(String permission, int pid, int uid, String message) {
577             enforceCallingOrSelfPermission(permission, message);
578         }
579 
580         @Override
enforceCallingPermission(String permission, String message)581         public void enforceCallingPermission(String permission, String message) {
582             enforceCallingOrSelfPermission(permission, message);
583         }
584 
585         @Override
checkCallingOrSelfPermission(String permission)586         public int checkCallingOrSelfPermission(String permission) {
587             if (mPermissionTable.contains(permission)
588                     || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
589                 logd("checkCallingOrSelfPermission: " + permission + " return GRANTED");
590                 return PackageManager.PERMISSION_GRANTED;
591             } else {
592                 logd("checkCallingOrSelfPermission: " + permission + " return DENIED");
593                 return PackageManager.PERMISSION_DENIED;
594             }
595         }
596 
597         @Override
checkPermission(String permission, int pid, int uid)598         public int checkPermission(String permission, int pid, int uid) {
599             return checkCallingOrSelfPermission(permission);
600         }
601 
602         @Override
getSharedPreferences(String name, int mode)603         public SharedPreferences getSharedPreferences(String name, int mode) {
604             return mSharedPreferences;
605         }
606 
607         @Override
getPackageName()608         public String getPackageName() {
609             return "com.android.internal.telephony";
610         }
611 
612         @Override
getApplicationContext()613         public Context getApplicationContext() {
614             return null;
615         }
616 
617         @Override
startActivity(Intent intent)618         public void startActivity(Intent intent) {}
619     }
620 
621     private final Multimap<String, ComponentName> mComponentNamesByAction =
622             ArrayListMultimap.create();
623     private final Map<ComponentName, IInterface> mServiceByComponentName =
624             new HashMap<ComponentName, IInterface>();
625     private final Map<String, IInterface> mServiceByPackageName =
626             new HashMap<String, IInterface>();
627     private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
628             new HashMap<ComponentName, ServiceInfo>();
629     private final Map<ComponentName, IntentFilter> mIntentFilterByComponentName = new HashMap<>();
630     private final Map<IInterface, ComponentName> mComponentNameByService =
631             new HashMap<IInterface, ComponentName>();
632     private final Set<String> mMockBindingFailureForPackage = new HashSet();
633     private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
634             new HashMap<ServiceConnection, IInterface>();
635     private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
636             ArrayListMultimap.create();
637     private final HashMap<String, Intent> mStickyBroadcastByAction =
638             new HashMap<String, Intent>();
639     private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
640             ArrayListMultimap.create();
641     private final HashSet<String> mPermissionTable = new HashSet<>();
642     private final HashSet<String> mSystemFeatures = new HashSet<>();
643     private Bundle mLastBroadcastOptions;
644 
645 
646     // The application context is the most important object this class provides to the system
647     // under test.
648     private final Context mContext = spy(new FakeContext());
649     // We then create a spy on the application context allowing standard Mockito-style
650     // when(...) logic to be used to add specific little responses where needed.
651 
652     private final Resources mResources = mock(Resources.class);
653     private final ApplicationInfo mApplicationInfo = mock(ApplicationInfo.class);
654     private final PackageManager mPackageManager = mock(PackageManager.class);
655     private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
656     private final ActivityManager mActivityManager = mock(ActivityManager.class);
657     private final DownloadManager mDownloadManager = mock(DownloadManager.class);
658     private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
659     private final NotificationManager mNotificationManager = mock(NotificationManager.class);
660     private final UserManager mUserManager = mock(UserManager.class);
661     private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
662     private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
663     private final AlarmManager mAlarmManager = mock(AlarmManager.class);
664     private final AssetManager mAssetManager = new AssetManager();
665     private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
666     private final UsageStatsManager mUsageStatManager = null;
667     private final WifiManager mWifiManager = mock(WifiManager.class);
668     private final BatteryManager mBatteryManager = mock(BatteryManager.class);
669     private final EuiccManager mEuiccManager = mock(EuiccManager.class);
670     private final TelecomManager mTelecomManager = mock(TelecomManager.class);
671     private final PackageInfo mPackageInfo = mock(PackageInfo.class);
672     private final TelephonyRegistryManager mTelephonyRegistryManager =
673         mock(TelephonyRegistryManager.class);
674     private final SystemConfigManager mSystemConfigManager = mock(SystemConfigManager.class);
675     private final PowerWhitelistManager mPowerWhitelistManager = mock(PowerWhitelistManager.class);
676     private final LocationManager mLocationManager = mock(LocationManager.class);
677     private final KeyguardManager mKeyguardManager = mock(KeyguardManager.class);
678     private final VcnManager mVcnManager = mock(VcnManager.class);
679 
680     private final ContentProvider mContentProvider = spy(new FakeContentProvider());
681 
682     private final Configuration mConfiguration = new Configuration();
683     private final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
684     private final SharedPreferences mSharedPreferences = PreferenceManager
685             .getDefaultSharedPreferences(TestApplication.getAppContext());
686     private final MockContentResolver mContentResolver = new MockContentResolver();
687     private final PersistableBundle mBundle = new PersistableBundle();
688 
ContextFixture()689     public ContextFixture() {
690         MockitoAnnotations.initMocks(this);
691 
692         doAnswer(new Answer<List<ResolveInfo>>() {
693             @Override
694             public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
695                 return doQueryIntentServices(
696                         (Intent) invocation.getArguments()[0],
697                         (Integer) invocation.getArguments()[1]);
698             }
699         }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
700 
701         doAnswer(new Answer<List<ResolveInfo>>() {
702             @Override
703             public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
704                 return doQueryIntentServices(
705                         (Intent) invocation.getArguments()[0],
706                         (Integer) invocation.getArguments()[1]);
707             }
708         }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), any());
709 
710         try {
711             doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(nullable(String.class),
712                     anyInt());
713         } catch (NameNotFoundException e) {
714         }
715 
716         doAnswer((Answer<Boolean>)
717                 invocation -> mSystemFeatures.contains((String) invocation.getArgument(0)))
718                 .when(mPackageManager).hasSystemFeature(any());
719 
720         try {
721             doReturn(mResources).when(mPackageManager).getResourcesForApplication(anyString());
722         } catch (NameNotFoundException ex) {
723             Log.d(TAG, "NameNotFoundException: " + ex);
724         }
725 
726         doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
727         //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt());
728         doReturn(mBundle).when(mCarrierConfigManager).getConfig();
729 
730         doReturn(mock(Network.class)).when(mConnectivityManager).registerNetworkAgent(
731                 any(), any(), any(), any(), any(), any(), anyInt());
732 
733         doReturn(true).when(mEuiccManager).isEnabled();
734 
735         mConfiguration.locale = Locale.US;
736         doReturn(mConfiguration).when(mResources).getConfiguration();
737 
738         mDisplayMetrics.density = 2.25f;
739         doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics();
740         mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
741         // Settings caches the provider after first get/set call, this is needed to make sure
742         // Settings is using mContentProvider as the cached provider across all tests.
743         Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0);
744         mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider);
745         mPermissionTable.add(PERMISSION_ENABLE_ALL);
746     }
747 
748     @Override
getTestDouble()749     public Context getTestDouble() {
750         return mContext;
751     }
752 
putResource(int id, final String value)753     public void putResource(int id, final String value) {
754         when(mResources.getText(eq(id))).thenReturn(value);
755         when(mResources.getString(eq(id))).thenReturn(value);
756         when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
757             @Override
758             public String answer(InvocationOnMock invocation) {
759                 Object[] args = invocation.getArguments();
760                 return String.format(value, Arrays.copyOfRange(args, 1, args.length));
761             }
762         });
763     }
764 
putBooleanResource(int id, boolean value)765     public void putBooleanResource(int id, boolean value) {
766         when(mResources.getBoolean(eq(id))).thenReturn(value);
767     }
768 
putStringArrayResource(int id, String[] values)769     public void putStringArrayResource(int id, String[] values) {
770         doReturn(values).when(mResources).getStringArray(eq(id));
771     }
772 
putIntArrayResource(int id, int[] values)773     public void putIntArrayResource(int id, int[] values) {
774         doReturn(values).when(mResources).getIntArray(eq(id));
775     }
776 
putIntResource(int id, int value)777     public void putIntResource(int id, int value) {
778         doReturn(value).when(mResources).getInteger(eq(id));
779     }
780 
getCarrierConfigBundle()781     public PersistableBundle getCarrierConfigBundle() {
782         return mBundle;
783     }
784 
addService(String action, ComponentName name, String packageName, IInterface service, ServiceInfo serviceInfo)785     public void addService(String action, ComponentName name, String packageName,
786                            IInterface service, ServiceInfo serviceInfo) {
787         addService(action, name, packageName, service, serviceInfo, null /* filter */);
788     }
789 
addService(String action, ComponentName name, String packageName, IInterface service, ServiceInfo serviceInfo, IntentFilter filter)790     public void addService(String action, ComponentName name, String packageName,
791             IInterface service, ServiceInfo serviceInfo, IntentFilter filter) {
792         mComponentNamesByAction.put(action, name);
793         mServiceInfoByComponentName.put(name, serviceInfo);
794         mIntentFilterByComponentName.put(name, filter);
795         mServiceByComponentName.put(name, service);
796         mServiceByPackageName.put(packageName, service);
797         mComponentNameByService.put(service, name);
798     }
799 
mockBindingFailureForPackage(String packageName)800     public void mockBindingFailureForPackage(String packageName) {
801         mMockBindingFailureForPackage.add(packageName);
802     }
803 
doQueryIntentServices(Intent intent, int flags)804     private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
805         List<ResolveInfo> result = new ArrayList<ResolveInfo>();
806         for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
807             ResolveInfo resolveInfo = new ResolveInfo();
808             resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
809             resolveInfo.filter = mIntentFilterByComponentName.get(componentName);
810             result.add(resolveInfo);
811         }
812         return result;
813     }
814 
sendBroadcastToOrderedBroadcastReceivers()815     public void sendBroadcastToOrderedBroadcastReceivers() {
816         synchronized (mOrderedBroadcastReceivers) {
817             // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
818             // call within the loop may lead to sendOrderedBroadcast() which can add to
819             // mOrderedBroadcastReceivers
820             Collection<Map.Entry<Intent, BroadcastReceiver>> map =
821                     mOrderedBroadcastReceivers.entries();
822             for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
823                 entry.getValue().onReceive(mContext, entry.getKey());
824                 mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
825             }
826         }
827     }
828 
addCallingOrSelfPermission(String permission)829     public void addCallingOrSelfPermission(String permission) {
830         synchronized (mPermissionTable) {
831             if (mPermissionTable != null && permission != null) {
832                 mPermissionTable.remove(PERMISSION_ENABLE_ALL);
833                 mPermissionTable.add(permission);
834             }
835         }
836     }
837 
removeCallingOrSelfPermission(String permission)838     public void removeCallingOrSelfPermission(String permission) {
839         synchronized (mPermissionTable) {
840             if (mPermissionTable != null && permission != null) {
841                 mPermissionTable.remove(permission);
842             }
843         }
844     }
845 
addSystemFeature(String feature)846     public void addSystemFeature(String feature) {
847         mSystemFeatures.add(feature);
848     }
849 
getLastBroadcastOptions()850     public Bundle getLastBroadcastOptions() {
851         return mLastBroadcastOptions;
852     }
853 
logd(String s)854     private static void logd(String s) {
855         Log.d(TAG, s);
856     }
857 }
858