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