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