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