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