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