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