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