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