ContextFixture.java revision 0a567c9ed954f295df83c753239646c6f6a04128
10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/* 20a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Copyright (C) 2015 The Android Open Source Project 30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License"); 50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License. 60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at 70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * http://www.apache.org/licenses/LICENSE-2.0 90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software 110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS, 120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and 140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License. 150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpackage com.android.internal.telephony; 180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.ArrayListMultimap; 200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.Multimap; 210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.MockitoAnnotations; 230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.invocation.InvocationOnMock; 240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.stubbing.Answer; 250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager; 270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager; 280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IContentProvider; 330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyBoolean; 590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyString; 600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any; 610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt; 620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer; 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock; 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy; 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when; 670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " 960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan + serviceIntent.getComponent()); 970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 1050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 1060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 1070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 1090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 1110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 1150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 1160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 1170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 1180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 1190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 1200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 1210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 1220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 1230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 1240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 1250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 1260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.POWER_SERVICE: 1270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // PowerManager is a final class so cannot be mocked, return real service 1280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return TestApplication.getAppContext().getSystemService(name); 1290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 1300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 1310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 1320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 1330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 1380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 1430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 1440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 1490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 1530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return new ContentResolver(mContext) { 1540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan protected IContentProvider acquireProvider(Context c, String name) { 1560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Log.i(TAG, "acquireProvider " + name); 1570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContentProvider; 1580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean releaseProvider(IContentProvider icp) { 1620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan protected IContentProvider acquireUnstableProvider(Context c, String name) { 1670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Log.i(TAG, "acquireUnstableProvider " + name); 1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContentProvider; 1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean releaseUnstableProvider(IContentProvider icp) { 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return false; 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unstableProviderDied(IContentProvider icp) { 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }; 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int i = 0 ; i < filter.countActions(); i++) { 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String broadcastPermission, Handler scheduler) { 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // TODO -- need to ensure this is captured 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // TODO -- need to ensure this is captured 2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // TODO -- need to ensure this is captured 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Don't bother enforcing anything in mock. 2280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 2330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int testMethod() { 2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }; 2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 2600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 2610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 2630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 2680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 2690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 2700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 2730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final IContentProvider mContentProvider = mock(IContentProvider.class); 2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SharedPreferences mSharedPreferences = mock(SharedPreferences.class); 2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 2800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 2820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 2840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 2850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 2910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 2920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 2930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 2940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 2960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // return default value unless overridden by test 2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer() { 2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object answer(InvocationOnMock invocation) throws Throwable { 3010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 3020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return args[1]; 3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mSharedPreferences).getBoolean(anyString(), anyBoolean()); 3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 3090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 3100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 3130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 3140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 3150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 3180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 3220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private void addService(String action, ComponentName name, IInterface service) { 3290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 3300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByComponentName.put(name, service); 3310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 3320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 3390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 3400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 3420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 3450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (BroadcastReceiver broadcastReceiver : 3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 3470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 351