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