1c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki/* 2c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Copyright (C) 2015 The Android Open Source Project 3c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * 4c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * you may not use this file except in compliance with the License. 6c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * You may obtain a copy of the License at 7c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * 8c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * 10c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Unless required by applicable law or agreed to in writing, software 11c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * See the License for the specific language governing permissions and 14c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * limitations under the License. 15c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki */ 16c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 17c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukipackage com.android.server.devicepolicy; 18c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 19068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.ComponentName; 20c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukiimport android.content.Context; 21068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.Intent; 22184db600df42c2b27a2d34deecab57d591434b22Makoto Onukiimport android.content.pm.ActivityInfo; 23068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.pm.ApplicationInfo; 24068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.pm.PackageInfo; 25068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.pm.PackageManager; 26068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.pm.ResolveInfo; 27068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.os.UserHandle; 28c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukiimport android.test.AndroidTestCase; 29c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 30cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.io.File; 31068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.util.List; 32068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 338375fcec625d482af894cfed7b608f10cacb0f5dEsteban Talaveraimport static org.mockito.Matchers.anyInt; 34068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport static org.mockito.Matchers.eq; 35068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport static org.mockito.Mockito.doReturn; 36cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 37b643fb0e67460344ade2e3db92738999f8168496Makoto Onukipublic abstract class DpmTestBase extends AndroidTestCase { 38cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki public static final String TAG = "DpmTest"; 39cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 40cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki protected Context mRealTestContext; 41cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki protected DpmMockContext mMockContext; 42cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 43cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki public File dataDir; 44c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 45068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public ComponentName admin1; 46068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public ComponentName admin2; 47068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public ComponentName admin3; 483ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki public ComponentName adminNoPerm; 49068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 50c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki @Override 51c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki protected void setUp() throws Exception { 52c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki super.setUp(); 53c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 54cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki mRealTestContext = super.getContext(); 55cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 56d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki mMockContext = new DpmMockContext( 57d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki mRealTestContext, new File(mRealTestContext.getCacheDir(), "test-data")); 58068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 59068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki admin1 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin1.class); 60068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki admin2 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin2.class); 61068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki admin3 = new ComponentName(mRealTestContext, DummyDeviceAdmins.Admin3.class); 623ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki adminNoPerm = new ComponentName(mRealTestContext, DummyDeviceAdmins.AdminNoPerm.class); 63c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki } 64c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki 65c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki @Override 66c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki public DpmMockContext getContext() { 67c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki return mMockContext; 68c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki } 69068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 704c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski protected void markPackageAsInstalled(String packageName, ApplicationInfo ai, int userId) 714c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski throws Exception { 724c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski final PackageInfo pi = DpmTestUtils.cloneParcelable( 734c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski mRealTestContext.getPackageManager().getPackageInfo( 744c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski mRealTestContext.getPackageName(), 0)); 754c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski assertTrue(pi.applicationInfo.flags != 0); 764c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski 774c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski if (ai != null) { 784c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski pi.applicationInfo = ai; 794c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski } 804c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski 814c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski doReturn(pi).when(mMockContext.ipackageManager).getPackageInfo( 824c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski eq(packageName), 834c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski eq(0), 844c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski eq(userId)); 854c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski } 86068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 87068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid) 88068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki throws Exception { 89068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki setUpPackageManagerForAdmin(admin, packageUid, 903ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki /* enabledSetting =*/ null, /* appTargetSdk = */ null); 91068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 92068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 93068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 94068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki int enabledSetting) throws Exception { 953ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki setUpPackageManagerForAdmin(admin, packageUid, enabledSetting, /* appTargetSdk = */ null); 963ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki } 973ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki 983ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki protected void setUpPackageManagerForAdmin(ComponentName admin, int packageUid, 993ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki Integer enabledSetting, Integer appTargetSdk) throws Exception { 100184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki setUpPackageManagerForFakeAdmin(admin, packageUid, enabledSetting, appTargetSdk, 101184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki admin); 102184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki } 103184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki 104184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki /** 105184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki * Set up a component in the mock package manager to be an active admin. 106184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki * 107184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki * @param admin ComponentName that's visible to the test code, which doesn't have to exist. 108184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki * @param copyFromAdmin package information for {@code admin} will be built based on this 109184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki * component's information. 110184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki */ 111184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, 112184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki Integer enabledSetting, Integer appTargetSdk, ComponentName copyFromAdmin) 113184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki throws Exception { 1143ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki 1153ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki // Set up getApplicationInfo(). 1163ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki 1173ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki final ApplicationInfo ai = DpmTestUtils.cloneParcelable( 1183ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki mRealTestContext.getPackageManager().getApplicationInfo( 119184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki copyFromAdmin.getPackageName(), 1203ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS)); 1213ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki 1223ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki ai.enabledSetting = enabledSetting == null 1233ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED 1243ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki : enabledSetting; 1253ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki if (appTargetSdk != null) { 1263ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki ai.targetSdkVersion = appTargetSdk; 1273ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki } 1283ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki ai.uid = packageUid; 129184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki ai.packageName = admin.getPackageName(); 130184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki ai.name = admin.getClassName(); 1313ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki 1323ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki doReturn(ai).when(mMockContext.ipackageManager).getApplicationInfo( 1333ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki eq(admin.getPackageName()), 1346ad5f92512462f774a2ff7e59abdf5edbfd215b3Makoto Onuki anyInt(), 1353ab6f2e219c167fd35f16b6cf233ae6a39d9de02Makoto Onuki eq(UserHandle.getUserId(packageUid))); 136068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 137068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki // Set up queryBroadcastReceivers(). 138068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 139068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Intent resolveIntent = new Intent(); 140184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki resolveIntent.setComponent(copyFromAdmin); 141068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final List<ResolveInfo> realResolveInfo = 142068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki mRealTestContext.getPackageManager().queryBroadcastReceivers( 143068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki resolveIntent, 144068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki PackageManager.GET_META_DATA); 145068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertNotNull(realResolveInfo); 146068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertEquals(1, realResolveInfo.size()); 147068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 148068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki // We need to change AI, so set a clone. 149068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki realResolveInfo.set(0, DpmTestUtils.cloneParcelable(realResolveInfo.get(0))); 150068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 151068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki // We need to rewrite the UID in the activity info. 152184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki final ActivityInfo aci = realResolveInfo.get(0).activityInfo; 153184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki aci.applicationInfo = ai; 154184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki aci.packageName = admin.getPackageName(); 155184db600df42c2b27a2d34deecab57d591434b22Makoto Onuki aci.name = admin.getClassName(); 156068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 157889c0880661bda16e3759995e03766ddf0350732Makoto Onuki // Note we don't set up queryBroadcastReceivers. We don't use it in DPMS. 158889c0880661bda16e3759995e03766ddf0350732Makoto Onuki 159889c0880661bda16e3759995e03766ddf0350732Makoto Onuki doReturn(aci).when(mMockContext.ipackageManager).getReceiverInfo( 160889c0880661bda16e3759995e03766ddf0350732Makoto Onuki eq(admin), 1618375fcec625d482af894cfed7b608f10cacb0f5dEsteban Talavera anyInt(), 162068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki eq(UserHandle.getUserId(packageUid))); 163068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 164068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki // Set up getPackageInfo(). 1654c052f237a108457fca3d3864c5654ebd4505111Bartosz Fabianowski markPackageAsInstalled(admin.getPackageName(), ai, UserHandle.getUserId(packageUid)); 166068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 167c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki} 168