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