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