DpmTestBase.java revision 2c68dadb200a4a7113b2d5162fc9137eed944ddf
1/* 2 * Copyright (C) 2015 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 17package com.android.server.devicepolicy; 18 19import android.app.admin.DevicePolicyManager; 20import android.content.ComponentName; 21import android.content.Context; 22import android.content.Intent; 23import android.content.pm.ActivityInfo; 24import android.content.pm.ApplicationInfo; 25import android.content.pm.PackageInfo; 26import android.content.pm.PackageManager; 27import android.content.pm.ResolveInfo; 28import android.os.UserHandle; 29import android.test.AndroidTestCase; 30 31import java.io.File; 32import java.util.List; 33 34import static org.mockito.Matchers.anyInt; 35import static org.mockito.Matchers.eq; 36import static org.mockito.Mockito.doReturn; 37 38public abstract class DpmTestBase extends AndroidTestCase { 39 public static final String TAG = "DpmTest"; 40 41 protected Context mRealTestContext; 42 protected DpmMockContext mMockContext; 43 44 public File dataDir; 45 46 public ComponentName admin1; 47 public ComponentName admin2; 48 public ComponentName admin3; 49 public ComponentName adminAnotherPackage; 50 public ComponentName adminNoPerm; 51 52 @Override 53 protected void setUp() throws Exception { 54 super.setUp(); 55 56 mRealTestContext = super.getContext(); 57 58 mMockContext = new DpmMockContext( 59 mRealTestContext, new File(mRealTestContext.getCacheDir(), "test-data")); 60 61 admin1 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin1.class); 62 admin2 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin2.class); 63 admin3 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin3.class); 64 adminAnotherPackage = new ComponentName(DpmMockContext.ANOTHER_PACKAGE_NAME, 65 "whatever.random.class"); 66 adminNoPerm = new ComponentName(mRealTestContext, DummyDeviceAdmins.AdminNoPerm.class); 67 } 68 69 @Override 70 public DpmMockContext getContext() { 71 return mMockContext; 72 } 73 74 protected interface DpmRunnable { 75 public void run(DevicePolicyManager dpm) throws Exception; 76 } 77 78 /** 79 * Simulate an RPC from {@param caller} to the service context ({@link #mContext}). 80 * 81 * The caller sees its own context. The server also sees its own separate context, with the 82 * appropriate calling UID and calling permissions fields already set up. 83 */ 84 protected void runAsCaller(DpmMockContext caller, DevicePolicyManagerServiceTestable dpms, 85 DpmRunnable action) { 86 final DpmMockContext serviceContext = mMockContext; 87 88 final long origId = serviceContext.binder.clearCallingIdentity(); 89 try { 90 serviceContext.binder.callingUid = caller.binder.callingUid; 91 serviceContext.binder.callingPid = caller.binder.callingPid; 92 serviceContext.binder.callingPermissions.put(caller.binder.callingUid, 93 caller.permissions); 94 action.run(new DevicePolicyManagerTestable(caller, dpms)); 95 } catch (Exception e) { 96 throw new AssertionError(e); 97 } finally { 98 serviceContext.binder.restoreCallingIdentity(origId); 99 } 100 } 101 102 protected void markPackageAsInstalled(String packageName, ApplicationInfo ai, int userId) 103 throws Exception { 104 final PackageInfo pi = DpmTestUtils.cloneParcelable( 105 mRealTestContext.getPackageManager().getPackageInfo( 106 mRealTestContext.getPackageName(), 0)); 107 assertTrue(pi.applicationInfo.flags != 0); 108 109 if (ai != null) { 110 pi.applicationInfo = ai; 111 } 112 113 doReturn(pi).when(mMockContext.ipackageManager).getPackageInfo( 114 eq(packageName), 115 eq(0), 116 eq(userId)); 117 118 doReturn(ai.uid).when(mMockContext.packageManager).getPackageUidAsUser( 119 eq(packageName), 120 eq(userId)); 121 } 122 123 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid) 124 throws Exception { 125 setUpPackageManagerForAdmin(admin, packageUid, 126 /* enabledSetting =*/ null, /* appTargetSdk = */ null); 127 } 128 129 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 130 int enabledSetting) throws Exception { 131 setUpPackageManagerForAdmin(admin, packageUid, enabledSetting, /* appTargetSdk = */ null); 132 } 133 134 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 135 Integer enabledSetting, Integer appTargetSdk) throws Exception { 136 setUpPackageManagerForFakeAdmin(admin, packageUid, enabledSetting, appTargetSdk, 137 admin); 138 } 139 140 protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, 141 ComponentName copyFromAdmin) 142 throws Exception { 143 setUpPackageManagerForFakeAdmin(admin, packageUid, 144 /* enabledSetting =*/ null, /* appTargetSdk = */ null, copyFromAdmin); 145 } 146 147 /** 148 * Set up a component in the mock package manager to be an active admin. 149 * 150 * @param admin ComponentName that's visible to the test code, which doesn't have to exist. 151 * @param copyFromAdmin package information for {@code admin} will be built based on this 152 * component's information. 153 */ 154 protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, 155 Integer enabledSetting, Integer appTargetSdk, ComponentName copyFromAdmin) 156 throws Exception { 157 158 // Set up getApplicationInfo(). 159 160 final ApplicationInfo ai = DpmTestUtils.cloneParcelable( 161 mRealTestContext.getPackageManager().getApplicationInfo( 162 copyFromAdmin.getPackageName(), 163 PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS)); 164 ai.enabledSetting = enabledSetting == null 165 ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED 166 : enabledSetting; 167 if (appTargetSdk != null) { 168 ai.targetSdkVersion = appTargetSdk; 169 } 170 ai.uid = packageUid; 171 ai.packageName = admin.getPackageName(); 172 ai.name = admin.getClassName(); 173 174 doReturn(ai).when(mMockContext.ipackageManager).getApplicationInfo( 175 eq(admin.getPackageName()), 176 anyInt(), 177 eq(UserHandle.getUserId(packageUid))); 178 179 // Set up queryBroadcastReceivers(). 180 181 final Intent resolveIntent = new Intent(); 182 resolveIntent.setComponent(copyFromAdmin); 183 final List<ResolveInfo> realResolveInfo = 184 mRealTestContext.getPackageManager().queryBroadcastReceivers( 185 resolveIntent, 186 PackageManager.GET_META_DATA); 187 assertNotNull(realResolveInfo); 188 assertEquals(1, realResolveInfo.size()); 189 190 // We need to change AI, so set a clone. 191 realResolveInfo.set(0, DpmTestUtils.cloneParcelable(realResolveInfo.get(0))); 192 193 // We need to rewrite the UID in the activity info. 194 final ActivityInfo aci = realResolveInfo.get(0).activityInfo; 195 aci.applicationInfo = ai; 196 aci.packageName = admin.getPackageName(); 197 aci.name = admin.getClassName(); 198 199 // Note we don't set up queryBroadcastReceivers. We don't use it in DPMS. 200 201 doReturn(aci).when(mMockContext.ipackageManager).getReceiverInfo( 202 eq(admin), 203 anyInt(), 204 eq(UserHandle.getUserId(packageUid))); 205 206 doReturn(new String[] {admin.getPackageName()}).when(mMockContext.ipackageManager) 207 .getPackagesForUid(eq(packageUid)); 208 // Set up getPackageInfo(). 209 markPackageAsInstalled(admin.getPackageName(), ai, UserHandle.getUserId(packageUid)); 210 } 211} 212