1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android;
18 
19 import static org.mockito.ArgumentMatchers.anyInt;
20 import static org.mockito.ArgumentMatchers.anyString;
21 import static org.mockito.Mockito.doAnswer;
22 import static org.mockito.Mockito.when;
23 
24 import android.content.AttributionSource;
25 import android.content.BroadcastReceiver;
26 import android.content.ContentResolver;
27 import android.content.Context;
28 import android.content.Intent;
29 import android.content.IntentFilter;
30 import android.content.pm.PackageManager;
31 import android.os.Binder;
32 import android.os.Handler;
33 import android.os.Looper;
34 import android.os.PersistableBundle;
35 import android.os.Process;
36 import android.os.UserManager;
37 import android.telecom.TelecomManager;
38 import android.telephony.CarrierConfigManager;
39 import android.telephony.SubscriptionManager;
40 import android.telephony.TelephonyManager;
41 import android.telephony.ims.ImsManager;
42 import android.test.mock.MockContext;
43 import android.util.Log;
44 import android.util.SparseArray;
45 
46 import org.mockito.Mock;
47 import org.mockito.MockitoAnnotations;
48 import org.mockito.stubbing.Answer;
49 
50 import java.util.HashSet;
51 import java.util.concurrent.Executor;
52 
53 public class TestContext extends MockContext {
54 
55     private static final String TAG = "TestContext";
56     // Stub used to grant all permissions
57     public static final String STUB_PERMISSION_ENABLE_ALL = "stub_permission_enable_all";
58 
59     @Mock CarrierConfigManager mMockCarrierConfigManager;
60     @Mock TelecomManager mMockTelecomManager;
61     @Mock TelephonyManager mMockTelephonyManager;
62     @Mock SubscriptionManager mMockSubscriptionManager;
63     @Mock ImsManager mMockImsManager;
64     @Mock UserManager mMockUserManager;
65     @Mock PackageManager mPackageManager;
66 
67     private final SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
68 
69     private Intent mIntent;
70 
71     private BroadcastReceiver mReceiver;
72 
73     private final HashSet<String> mPermissionTable = new HashSet<>();
74 
TestContext()75     public TestContext() {
76         MockitoAnnotations.initMocks(this);
77         doAnswer((Answer<PersistableBundle>) invocation -> {
78             int subId = (int) invocation.getArguments()[0];
79             return getTestConfigs(subId);
80         }).when(mMockCarrierConfigManager).getConfigForSubId(anyInt());
81         doAnswer((Answer<PersistableBundle>) invocation -> {
82             int subId = (int) invocation.getArguments()[0];
83             return getTestConfigs(subId);
84         }).when(mMockCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
85         when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
86     }
87 
88     @Override
getMainExecutor()89     public Executor getMainExecutor() {
90         // Just run on current thread
91         return Runnable::run;
92     }
93 
94     @Override
getApplicationContext()95     public Context getApplicationContext() {
96         return this;
97     }
98 
99     @Override
getPackageName()100     public String getPackageName() {
101         return "com.android.phone.tests";
102     }
103 
104     @Override
getAttributionTag()105     public String getAttributionTag() {
106         return "";
107     }
108 
109     @Override
getAttributionSource()110     public AttributionSource getAttributionSource() {
111         return new AttributionSource(Process.myUid(), getPackageName(), "");
112     }
113 
114     @Override
sendBroadcast(Intent intent)115     public void sendBroadcast(Intent intent) {
116         mIntent = intent;
117     }
118 
119     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)120     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
121         mReceiver = receiver;
122         return null;
123     }
124 
125     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)126     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
127         mReceiver = receiver;
128         return null;
129     }
130 
131     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)132     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
133             String broadcastPermission, Handler scheduler) {
134         mReceiver = receiver;
135         return null;
136     }
137 
138     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)139     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
140             String broadcastPermission, Handler scheduler, int flags) {
141         mReceiver = receiver;
142         return null;
143     }
144 
145     @Override
unregisterReceiver(BroadcastReceiver receiver)146     public void unregisterReceiver(BroadcastReceiver receiver) {
147         mReceiver = null;
148     }
149 
150     @Override
getPackageManager()151     public PackageManager getPackageManager() {
152         return mPackageManager;
153     }
154 
155     @Override
getContentResolver()156     public ContentResolver getContentResolver() {
157         return null;
158     }
159 
160     @Override
getSystemService(String name)161     public Object getSystemService(String name) {
162         switch (name) {
163             case Context.CARRIER_CONFIG_SERVICE: {
164                 return mMockCarrierConfigManager;
165             }
166             case Context.TELECOM_SERVICE: {
167                 return mMockTelecomManager;
168             }
169             case Context.TELEPHONY_SERVICE: {
170                 return mMockTelephonyManager;
171             }
172             case Context.TELEPHONY_SUBSCRIPTION_SERVICE: {
173                 return mMockSubscriptionManager;
174             }
175             case Context.TELEPHONY_IMS_SERVICE: {
176                 return mMockImsManager;
177             }
178             case Context.USER_SERVICE: {
179                 return mMockUserManager;
180             }
181         }
182         return null;
183     }
184 
185     @Override
getSystemServiceName(Class<?> serviceClass)186     public String getSystemServiceName(Class<?> serviceClass) {
187         if (serviceClass == CarrierConfigManager.class) {
188             return Context.CARRIER_CONFIG_SERVICE;
189         }
190         if (serviceClass == TelecomManager.class) {
191             return Context.TELECOM_SERVICE;
192         }
193         if (serviceClass == TelephonyManager.class) {
194             return Context.TELEPHONY_SERVICE;
195         }
196         if (serviceClass == SubscriptionManager.class) {
197             return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
198         }
199         if (serviceClass == ImsManager.class) {
200             return Context.TELEPHONY_IMS_SERVICE;
201         }
202         if (serviceClass == UserManager.class) {
203             return Context.USER_SERVICE;
204         }
205         return null;
206     }
207 
208     @Override
getMainThreadHandler()209     public Handler getMainThreadHandler() {
210         return new Handler(Looper.getMainLooper());
211     }
212 
213     /**
214      * @return CarrierConfig PersistableBundle for the subscription specified.
215      */
getCarrierConfig(int subId)216     public PersistableBundle getCarrierConfig(int subId) {
217         PersistableBundle b = mCarrierConfigs.get(subId);
218         if (b == null) {
219             b = new PersistableBundle();
220             mCarrierConfigs.put(subId, b);
221         }
222         return b;
223     }
224 
225     @Override
enforceCallingOrSelfPermission(String permission, String message)226     public void enforceCallingOrSelfPermission(String permission, String message) {
227         if (checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
228             throw new SecurityException(permission + " denied: " + message);
229         }
230     }
231 
232     @Override
enforcePermission(String permission, int pid, int uid, String message)233     public void enforcePermission(String permission, int pid, int uid, String message) {
234         enforceCallingOrSelfPermission(permission, message);
235     }
236 
237     @Override
enforceCallingPermission(String permission, String message)238     public void enforceCallingPermission(String permission, String message) {
239         enforceCallingOrSelfPermission(permission, message);
240     }
241 
242     @Override
checkCallingOrSelfPermission(String permission)243     public int checkCallingOrSelfPermission(String permission) {
244         return checkPermission(permission, Binder.getCallingPid(), Binder.getCallingUid());
245     }
246 
247     @Override
checkPermission(String permission, int pid, int uid)248     public int checkPermission(String permission, int pid, int uid) {
249         synchronized (mPermissionTable) {
250             if (mPermissionTable.contains(permission)
251                     || mPermissionTable.contains(STUB_PERMISSION_ENABLE_ALL)) {
252                 logd("checkCallingOrSelfPermission: " + permission + " return GRANTED");
253                 return PackageManager.PERMISSION_GRANTED;
254             } else {
255                 logd("checkCallingOrSelfPermission: " + permission + " return DENIED");
256                 return PackageManager.PERMISSION_DENIED;
257             }
258         }
259     }
260 
grantPermission(String permission)261     public void grantPermission(String permission) {
262         synchronized (mPermissionTable) {
263             if (permission == null) return;
264             mPermissionTable.remove(STUB_PERMISSION_ENABLE_ALL);
265             mPermissionTable.add(permission);
266         }
267     }
268 
revokePermission(String permission)269     public void revokePermission(String permission) {
270         synchronized (mPermissionTable) {
271             if (permission == null) return;
272             mPermissionTable.remove(permission);
273         }
274     }
275 
revokeAllPermissions()276     public void revokeAllPermissions() {
277         synchronized (mPermissionTable) {
278             mPermissionTable.clear();
279         }
280     }
281 
getBroadcast()282     public Intent getBroadcast() {
283         return mIntent;
284     }
285 
getBroadcastReceiver()286     public BroadcastReceiver getBroadcastReceiver() {
287         return mReceiver;
288     }
289 
getTestConfigs(int subId)290     private PersistableBundle getTestConfigs(int subId) {
291         if (subId < 0) {
292             return new PersistableBundle();
293         }
294         PersistableBundle b = getCarrierConfig(subId);
295         return (b != null ? b : new PersistableBundle());
296     }
297 
logd(String s)298     private static void logd(String s) {
299         Log.d(TAG, s);
300     }
301 }
302