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