DpmTestBase.java revision 2f26b79eea905f88c872804be01431020e4efb2e
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.content.ComponentName; 20import android.content.Context; 21import android.content.Intent; 22import android.content.pm.ActivityInfo; 23import android.content.pm.ApplicationInfo; 24import android.content.pm.PackageInfo; 25import android.content.pm.PackageManager; 26import android.content.pm.ResolveInfo; 27import android.os.UserHandle; 28import android.test.AndroidTestCase; 29 30import java.io.File; 31import java.util.List; 32 33import static org.mockito.Matchers.anyInt; 34import static org.mockito.Matchers.eq; 35import static org.mockito.Mockito.doReturn; 36 37public abstract class DpmTestBase extends AndroidTestCase { 38 public static final String TAG = "DpmTest"; 39 40 protected Context mRealTestContext; 41 protected DpmMockContext mMockContext; 42 43 public File dataDir; 44 45 public ComponentName admin1; 46 public ComponentName admin2; 47 public ComponentName admin3; 48 public ComponentName adminNoPerm; 49 50 @Override 51 protected void setUp() throws Exception { 52 super.setUp(); 53 54 mRealTestContext = super.getContext(); 55 56 mMockContext = new DpmMockContext( 57 mRealTestContext, new File(mRealTestContext.getCacheDir(), "test-data")); 58 59 admin1 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin1.class); 60 admin2 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin2.class); 61 admin3 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin3.class); 62 adminNoPerm = new ComponentName(mRealTestContext, DummyDeviceAdmins.AdminNoPerm.class); 63 } 64 65 @Override 66 public DpmMockContext getContext() { 67 return mMockContext; 68 } 69 70 protected void markPackageAsInstalled(String packageName, ApplicationInfo ai, int userId) 71 throws Exception { 72 final PackageInfo pi = DpmTestUtils.cloneParcelable( 73 mRealTestContext.getPackageManager().getPackageInfo( 74 mRealTestContext.getPackageName(), 0)); 75 assertTrue(pi.applicationInfo.flags != 0); 76 77 if (ai != null) { 78 pi.applicationInfo = ai; 79 } 80 81 doReturn(pi).when(mMockContext.ipackageManager).getPackageInfo( 82 eq(packageName), 83 eq(0), 84 eq(userId)); 85 } 86 87 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid) 88 throws Exception { 89 setUpPackageManagerForAdmin(admin, packageUid, 90 /* enabledSetting =*/ null, /* appTargetSdk = */ null); 91 } 92 93 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 94 int enabledSetting) throws Exception { 95 setUpPackageManagerForAdmin(admin, packageUid, enabledSetting, /* appTargetSdk = */ null); 96 } 97 98 protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 99 Integer enabledSetting, Integer appTargetSdk) throws Exception { 100 setUpPackageManagerForFakeAdmin(admin, packageUid, enabledSetting, appTargetSdk, 101 admin); 102 } 103 104 protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, 105 ComponentName copyFromAdmin) 106 throws Exception { 107 setUpPackageManagerForFakeAdmin(admin, packageUid, 108 /* enabledSetting =*/ null, /* appTargetSdk = */ null, copyFromAdmin); 109 } 110 111 /** 112 * Set up a component in the mock package manager to be an active admin. 113 * 114 * @param admin ComponentName that's visible to the test code, which doesn't have to exist. 115 * @param copyFromAdmin package information for {@code admin} will be built based on this 116 * component's information. 117 */ 118 protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, 119 Integer enabledSetting, Integer appTargetSdk, ComponentName copyFromAdmin) 120 throws Exception { 121 122 // Set up getApplicationInfo(). 123 124 final ApplicationInfo ai = DpmTestUtils.cloneParcelable( 125 mRealTestContext.getPackageManager().getApplicationInfo( 126 copyFromAdmin.getPackageName(), 127 PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS)); 128 ai.enabledSetting = enabledSetting == null 129 ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED 130 : enabledSetting; 131 if (appTargetSdk != null) { 132 ai.targetSdkVersion = appTargetSdk; 133 } 134 ai.uid = packageUid; 135 ai.packageName = admin.getPackageName(); 136 ai.name = admin.getClassName(); 137 138 doReturn(ai).when(mMockContext.ipackageManager).getApplicationInfo( 139 eq(admin.getPackageName()), 140 anyInt(), 141 eq(UserHandle.getUserId(packageUid))); 142 143 // Set up queryBroadcastReceivers(). 144 145 final Intent resolveIntent = new Intent(); 146 resolveIntent.setComponent(copyFromAdmin); 147 final List<ResolveInfo> realResolveInfo = 148 mRealTestContext.getPackageManager().queryBroadcastReceivers( 149 resolveIntent, 150 PackageManager.GET_META_DATA); 151 assertNotNull(realResolveInfo); 152 assertEquals(1, realResolveInfo.size()); 153 154 // We need to change AI, so set a clone. 155 realResolveInfo.set(0, DpmTestUtils.cloneParcelable(realResolveInfo.get(0))); 156 157 // We need to rewrite the UID in the activity info. 158 final ActivityInfo aci = realResolveInfo.get(0).activityInfo; 159 aci.applicationInfo = ai; 160 aci.packageName = admin.getPackageName(); 161 aci.name = admin.getClassName(); 162 163 // Note we don't set up queryBroadcastReceivers. We don't use it in DPMS. 164 165 doReturn(aci).when(mMockContext.ipackageManager).getReceiverInfo( 166 eq(admin), 167 anyInt(), 168 eq(UserHandle.getUserId(packageUid))); 169 170 // Set up getPackageInfo(). 171 markPackageAsInstalled(admin.getPackageName(), ai, UserHandle.getUserId(packageUid)); 172 } 173} 174