ContextFixture.java revision fd6ce6219b41f9735240b9d0665d27c32482abd1
10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/* 29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 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; 29f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager; 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 32ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider; 330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 34ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues; 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 4332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration; 440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 45ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor; 46fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor; 4727b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager; 48ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri; 49b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager; 500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle; 540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 56153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager; 570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings; 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 61ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider; 62ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver; 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 6805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection; 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 7018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet; 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 7232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale; 730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any; 760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt; 770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer; 78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport static org.mockito.Mockito.doReturn; 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq; 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock; 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy; 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when; 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 9418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION"; 950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public class FakeContentProvider extends MockContentProvider { 97fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private String[] mColumns = {"name", "value"}; 98fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>(); 99fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private int mNumKeyValuePairs = 0; 100fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int delete(Uri uri, String selection, String[] selectionArgs) { 103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Uri insert(Uri uri, ContentValues values) { 108fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Uri newUri = null; 109fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (values != null) { 110fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value")); 111fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs); 113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri + 115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " newUri: " + newUri); 116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return newUri; 117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 119ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 120ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String sortOrder) { 122fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan //assuming query will always be of the form 'name = ?' 123fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri); 124fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(selectionArgs[0])) { 125fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan MatrixCursor cursor = new MatrixCursor(projection); 126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])}); 127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return cursor; 128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 129ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 130ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 1310ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1320ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu @Override 1330ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu public Bundle call(String method, String request, Bundle args) { 134fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method + 135fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " request: " + request); 136fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan switch(method) { 137fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_GLOBAL: 138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SECURE: 139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SYSTEM: 140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(request)) { 141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Bundle b = new Bundle(1); 142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan b.putCharSequence("value", mKeyValuePairs.get(request)); 143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("returning value pair: " + mKeyValuePairs.get(request) + " for " + 144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan request); 145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return b; 146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_GLOBAL: 149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SECURE: 150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SYSTEM: 151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("adding key-value pair: " + request + "-" + (String)args.get("value")); 152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(request, (String)args.get("value")); 153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 1560ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu return null; 1570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 158ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 159ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 1606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>(); 1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt public void setSystemService(String name, Object service) { 16318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mSystemServices) { 1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt mSystemServices.put(name, service); 1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan + serviceIntent.getComponent()); 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 204f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt synchronized (mSystemServices) { 205f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt Object service = mSystemServices.get(name); 206f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt if (service != null) return service; 207f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt } 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.POWER_SERVICE: 2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // PowerManager is a final class so cannot be mocked, return real service 2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return TestApplication.getAppContext().getSystemService(name); 2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 224b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case Context.WIFI_SERVICE: 225b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu return mWifiManager; 22659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu case Context.ALARM_SERVICE: 22759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu return mAlarmManager; 22827b650c406018355a88a41528db7859e232728a0Jack Yu case Context.CONNECTIVITY_SERVICE: 22927b650c406018355a88a41528db7859e232728a0Jack Yu return mConnectivityManager; 230f21d2289021a94fc74023e2b5987d236df354fe1fionaxu case Context.USAGE_STATS_SERVICE: 231f21d2289021a94fc74023e2b5987d236df354fe1fionaxu return mUsageStatManager; 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 233f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt return null; 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 2390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 2400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 254ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return mContentResolver; 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2585755ef622fec6f3c592467c685503826862a7536fionaxu public void unregisterReceiver(BroadcastReceiver receiver) { 2595755ef622fec6f3c592467c685503826862a7536fionaxu } 2605755ef622fec6f3c592467c685503826862a7536fionaxu 2615755ef622fec6f3c592467c685503826862a7536fionaxu @Override 2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 26397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan Intent result = null; 26497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 26518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu for (int i = 0 ; i < filter.countActions() ; i++) { 26697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 26797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan if (result == null) { 26897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan result = mStickyBroadcastByAction.get(filter.getAction(i)); 26997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 27097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 27297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 27397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return result; 2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String broadcastPermission, Handler scheduler) { 27997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return registerReceiver(receiver, filter); 28097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 28197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 28297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 28397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 28497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan IntentFilter filter, String broadcastPermission, Handler scheduler) { 28597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return registerReceiver(receiver, filter); 2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 290ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendBroadcast called for " + intent.getAction()); 29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 29297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan for (BroadcastReceiver broadcastReceiver : 29397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 296ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 301ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan logd("sendBroadcast called for " + intent.getAction()); 302ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan sendBroadcast(intent); 3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 3080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 3093c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 3103c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 3113c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 31205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 31305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 31405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 3153c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 3223c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 3233c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 3243c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 32505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 32605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 32705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 3283c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 3290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 332ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 333ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String receiverPermission, int appOp, Bundle options, 334ec334adf4017ca172f44612d01456e671f922344Amit Mahajan BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 335ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String initialData, Bundle initialExtras) { 336ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 337ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sendBroadcast(intent); 338ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (resultReceiver != null) { 33905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 34005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 34105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 342ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 343ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 344ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 345ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 34697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcast(Intent intent) { 3476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcast called for " + intent.getAction()); 34897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 34997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendBroadcast(intent); 35097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mStickyBroadcastByAction.put(intent.getAction(), intent); 35197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 35297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 35397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 35497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 35597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) { 3566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcastAsUser called for " + intent.getAction()); 35797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendStickyBroadcast(intent); 358b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 359b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 360b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu @Override 3610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 3620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 3630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 3640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 36818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable.contains(permission) 36918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { 37018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu return; 37118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 37218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu logd("requested permission: " + permission + " got denied"); 37318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu throw new SecurityException(permission + " denied: " + message); 3740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 377ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu public int checkCallingOrSelfPermission(String permission) { 378ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu return PackageManager.PERMISSION_GRANTED; 379ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu } 380ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu 381ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu @Override 3820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 3830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 3880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 3890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3917a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt public boolean testMethod() { 3927a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt return true; 393ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 394ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 395de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan public boolean testMethod1() { 396de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan return true; 3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3980e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 4020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 4030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 4040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 4100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 4110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 41297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan private final HashMap<String, Intent> mStickyBroadcastByAction = 41397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan new HashMap<String, Intent>(); 41405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers = 41505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ArrayListMultimap.create(); 41618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final HashSet<String> mPermissionTable = new HashSet<>(); 41718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 41818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 4190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 43559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu private final AlarmManager mAlarmManager = mock(AlarmManager.class); 43627b650c406018355a88a41528db7859e232728a0Jack Yu private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class); 437f21d2289021a94fc74023e2b5987d236df354fe1fionaxu private final UsageStatsManager mUsageStatManager = null; 438b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu private final WifiManager mWifiManager = mock(WifiManager.class); 439153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 440ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final ContentProvider mContentProvider = spy(new FakeContentProvider()); 441153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 442153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan private final Configuration mConfiguration = new Configuration(); 44318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final SharedPreferences mSharedPreferences = PreferenceManager 44418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu .getDefaultSharedPreferences(TestApplication.getAppContext()); 445ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final MockContentResolver mContentResolver = new MockContentResolver(); 4460e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private final PersistableBundle mBundle = new PersistableBundle(); 4470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 4560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 4570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4690e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); 4700e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 471cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan mConfiguration.locale = Locale.US; 47232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan doReturn(mConfiguration).when(mResources).getConfiguration(); 47332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan 474fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider); 47518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(PERMISSION_ENABLE_ALL); 4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 4900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 4930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 4960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 499b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void putStringArrayResource(int id, String[] values) { 500b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu doReturn(values).when(mResources).getStringArray(eq(id)); 501b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 502b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 503655bae990bdd7e4584491def4d30692e6173779cfionaxu public void putIntArrayResource(int id, int[] values) { 504655bae990bdd7e4584491def4d30692e6173779cfionaxu doReturn(values).when(mResources).getIntArray(eq(id)); 505655bae990bdd7e4584491def4d30692e6173779cfionaxu } 506655bae990bdd7e4584491def4d30692e6173779cfionaxu 5070e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public PersistableBundle getCarrierConfigBundle() { 5080e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return mBundle; 5090e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 5100e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private void addService(String action, ComponentName name, IInterface service) { 5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByComponentName.put(name, service); 5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 5180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 5190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 5200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 5210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 5220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 5250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 52705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan public void sendBroadcastToOrderedBroadcastReceivers() { 52805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 52905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive() 53005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // call within the loop may lead to sendOrderedBroadcast() which can add to 53105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // mOrderedBroadcastReceivers 53205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan Collection<Map.Entry<Intent, BroadcastReceiver>> map = 53305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.entries(); 53405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan for (Map.Entry<Intent, BroadcastReceiver> entry : map) { 53505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan entry.getValue().onReceive(mContext, entry.getKey()); 53605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue()); 53705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 53805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 53905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 54005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 54118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void addCallingOrSelfPermission(String permission) { 54218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 54318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 54418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(PERMISSION_ENABLE_ALL); 54518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(permission); 54618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 54718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 54818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 54918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 55018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void removeCallingOrSelfPermission(String permission) { 55118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 55218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 55318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(permission); 55418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 55518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 55618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 55718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 558ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private static void logd(String s) { 559ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Log.d(TAG, s); 5600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 562