ContextFixture.java revision 32b5fbb1a340fa16e2c37c276517ef10a4934500
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 2659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.app.AlarmManager; 270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager; 280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager; 290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 31ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider; 320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 33ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues; 340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 4232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration; 430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 44ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor; 45ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri; 46b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager; 470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 500e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle; 510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 530ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings; 54ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.provider.Telephony; 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 58ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider; 59ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver; 600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 6732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale; 680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyBoolean; 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyString; 720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any; 730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt; 740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer; 75b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport static org.mockito.Mockito.doReturn; 760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq; 770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock; 780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy; 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when; 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 92ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public class FakeContentProvider extends MockContentProvider { 93ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 94ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int delete(Uri uri, String selection, String[] selectionArgs) { 95ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 97ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 98ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 99ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Uri insert(Uri uri, ContentValues values) { 100ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (uri.compareTo(Uri.withAppendedPath(Telephony.Sms.CONTENT_URI, "raw")) == 0) { 101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return Uri.withAppendedPath(uri, "1"); 102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String sortOrder) { 109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 1110ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1120ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu @Override 1130ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu public Bundle call(String method, String request, Bundle args) { 1140ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu return null; 1150ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 116ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 1180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 1190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 1210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 1220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 1260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 1270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 1280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 1290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 1300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 1310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 1330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " 1350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan + serviceIntent.getComponent()); 1360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 1380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 1440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 1500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 1540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 1560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 1570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 1580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 1590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 1600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 1610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 1620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 1630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 1640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 1650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.POWER_SERVICE: 1660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // PowerManager is a final class so cannot be mocked, return real service 1670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return TestApplication.getAppContext().getSystemService(name); 1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 170b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case Context.WIFI_SERVICE: 171b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu return mWifiManager; 17259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu case Context.ALARM_SERVICE: 17359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu return mAlarmManager; 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 196ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return mContentResolver; 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2005755ef622fec6f3c592467c685503826862a7536fionaxu public void unregisterReceiver(BroadcastReceiver receiver) { 2015755ef622fec6f3c592467c685503826862a7536fionaxu } 2025755ef622fec6f3c592467c685503826862a7536fionaxu 2035755ef622fec6f3c592467c685503826862a7536fionaxu @Override 2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (int i = 0 ; i < filter.countActions(); i++) { 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String broadcastPermission, Handler scheduler) { 2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return null; 2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 219ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendBroadcast called for " + intent.getAction()); 220ec334adf4017ca172f44612d01456e671f922344Amit Mahajan for (BroadcastReceiver broadcastReceiver : 221ec334adf4017ca172f44612d01456e671f922344Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 222ec334adf4017ca172f44612d01456e671f922344Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 223ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 228ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan logd("sendBroadcast called for " + intent.getAction()); 229ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan sendBroadcast(intent); 2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 2363c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 2373c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 2383c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 2393c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan resultReceiver.onReceive(this, intent); 2403c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 2473c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 2483c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 2493c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 2503c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan resultReceiver.onReceive(this, intent); 2513c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 255ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 256ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String receiverPermission, int appOp, Bundle options, 257ec334adf4017ca172f44612d01456e671f922344Amit Mahajan BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 258ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String initialData, Bundle initialExtras) { 259ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 260ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sendBroadcast(intent); 261ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (resultReceiver != null) { 262ec334adf4017ca172f44612d01456e671f922344Amit Mahajan resultReceiver.onReceive(this, intent); 263ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 264ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 265ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 266ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 267b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 2686a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu logd("sendStickyBroadcastAsUser called for " + intent.getAction()); 269b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 270b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 271b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu @Override 2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 2730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 2790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Don't bother enforcing anything in mock. 2800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 2840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 2850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 292ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int testMethod() { 293ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 294ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 295ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 29632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan public int testMethod1() { 29732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan return 0; 2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2990e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 3020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 3060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 3070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 3080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 3090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 3100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 3110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 3120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 3130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 3150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 3170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 32232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan private final Configuration mConfiguration = new Configuration(); 3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 3280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 3290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 33059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu private final AlarmManager mAlarmManager = mock(AlarmManager.class); 331b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu private final WifiManager mWifiManager = mock(WifiManager.class); 332ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final ContentProvider mContentProvider = spy(new FakeContentProvider()); 3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SharedPreferences mSharedPreferences = mock(SharedPreferences.class); 334ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final MockContentResolver mContentResolver = new MockContentResolver(); 3350e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private final PersistableBundle mBundle = new PersistableBundle(); 3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 3390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 3410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 3430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 3440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 3450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 3500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 3520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 3530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 3540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 3550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 3570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // return default value unless overridden by test 3590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer() { 3600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object answer(InvocationOnMock invocation) throws Throwable { 3620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 3630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return args[1]; 3640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mSharedPreferences).getBoolean(anyString(), anyBoolean()); 366ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 3670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); 3680e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 36932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan mConfiguration.locale = Locale.getDefaultLocaleFromSystemProperties(); 37032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan doReturn(mConfiguration).when(mResources).getConfiguration(); 37132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan 372ec334adf4017ca172f44612d01456e671f922344Amit Mahajan mContentResolver.addProvider(Telephony.Sms.CONTENT_URI.getAuthority(), mContentProvider); 3730ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu mContentResolver.addProvider(Settings.System.CONTENT_URI.getAuthority(), mContentProvider); 3740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 3790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 3820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 3830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 3850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 3870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 3880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 3890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 3940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 3950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 397b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void putStringArrayResource(int id, String[] values) { 398b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu doReturn(values).when(mResources).getStringArray(eq(id)); 399b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 400b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 4010e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public PersistableBundle getCarrierConfigBundle() { 4020e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return mBundle; 4030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 4040e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private void addService(String action, ComponentName name, IInterface service) { 4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByComponentName.put(name, service); 4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 4120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 4130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 4140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 4150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 4160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 4170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 4190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 421ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private static void logd(String s) { 422ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Log.d(TAG, s); 4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 425