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