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