• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016, 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 
17 package com.android.managedprovisioning.ota;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.fail;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.never;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25 
26 import android.app.admin.DevicePolicyManager;
27 import android.content.ComponentName;
28 import android.content.Context;
29 import android.content.pm.PackageManager;
30 import android.content.pm.UserInfo;
31 import android.os.UserHandle;
32 import android.os.UserManager;
33 import android.util.ArraySet;
34 import android.util.Pair;
35 
36 import androidx.test.InstrumentationRegistry;
37 import androidx.test.filters.SmallTest;
38 
39 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
40 import com.android.managedprovisioning.task.AbstractProvisioningTask;
41 import com.android.managedprovisioning.task.DeleteNonRequiredAppsTask;
42 import com.android.managedprovisioning.task.DisallowAddUserTask;
43 import com.android.managedprovisioning.task.InstallExistingPackageTask;
44 import com.android.managedprovisioning.task.MigrateSystemAppsSnapshotTask;
45 import com.android.managedprovisioning.task.UpdateInteractAcrossProfilesAppOpTask;
46 
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.mockito.Mock;
50 import org.mockito.MockitoAnnotations;
51 
52 import java.util.ArrayList;
53 import java.util.Collections;
54 import java.util.List;
55 import java.util.Objects;
56 import java.util.function.IntFunction;
57 
58 /**
59  * Unit tests for {@link OtaController}.
60  */
61 @SmallTest
62 public class OtaControllerTest {
63     private static final int MANAGED_PROFILE_USER_ID = 15;
64     private static final int MANAGED_USER_USER_ID = 18;
65 
66     private static final String DUMMY_SYSTEM_IME_PACKAGE_NAME =
67             "com.android.inputmethod.dummysystemime";
68 
69     private static final ComponentName ADMIN_COMPONENT = new ComponentName("com.test.admin",
70             ".AdminReceiver");
71 
72     private static final IntFunction<ArraySet<String>> NO_MISSING_SYSTEM_IME_PROVIDER
73             = userHandle -> new ArraySet<>();
74 
75     @Mock private Context mContext;
76     @Mock private DevicePolicyManager mDevicePolicyManager;
77     @Mock private PackageManager mPackageManager;
78     @Mock private UserManager mUserManager;
79     @Mock private ProvisioningAnalyticsTracker mProvisioningAnalyticsTracker;
80 
81     private TaskExecutor mTaskExecutor;
82 
83     private List<Pair<Integer, AbstractProvisioningTask>> mTasks = new ArrayList<>();
84     private List<UserInfo> mUsers = new ArrayList<>();
85     private List<UserInfo> mProfiles = new ArrayList<>();
86 
87     @Before
setUp()88     public void setUp() {
89         MockitoAnnotations.initMocks(this);
90 
91         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
92                 .thenReturn(mDevicePolicyManager);
93         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
94         when(mContext.getPackageManager()).thenReturn(mPackageManager);
95         when(mContext.getResources())
96                 .thenReturn(InstrumentationRegistry.getTargetContext().getResources());
97 
98         when(mUserManager.getUsers()).thenReturn(mUsers);
99         when(mUserManager.getProfiles(UserHandle.USER_SYSTEM)).thenReturn(mProfiles);
100 
101         mTaskExecutor = new FakeTaskExecutor();
102 
103         addSystemUser();
104     }
105 
106     @Test
testDeviceOwnerSystemUser()107     public void testDeviceOwnerSystemUser() {
108         OtaController controller = new OtaController(mContext, mTaskExecutor,
109                 NO_MISSING_SYSTEM_IME_PROVIDER,
110                 mProvisioningAnalyticsTracker);
111 
112         // GIVEN that there is a device owner on the system user
113         setDeviceOwner(UserHandle.USER_SYSTEM, ADMIN_COMPONENT);
114 
115         // WHEN running the OtaController
116         controller.run();
117 
118         // THEN the task list should contain these tasks.
119         assertTaskList(
120                 Pair.create(UserHandle.USER_SYSTEM, MigrateSystemAppsSnapshotTask.class),
121                 Pair.create(UserHandle.USER_SYSTEM, DeleteNonRequiredAppsTask.class),
122                 Pair.create(UserHandle.USER_SYSTEM, DisallowAddUserTask.class),
123                 Pair.create(UserHandle.USER_SYSTEM, UpdateInteractAcrossProfilesAppOpTask.class));
124 
125         // THEN cross profile intent filters setter should be invoked for system user
126         verify(mDevicePolicyManager).resetDefaultCrossProfileIntentFilters(UserHandle.USER_SYSTEM);
127     }
128 
129     @Test
testManagedProfileWithoutMissingSystemIme()130     public void testManagedProfileWithoutMissingSystemIme() {
131         OtaController controller = new OtaController(mContext, mTaskExecutor,
132                 NO_MISSING_SYSTEM_IME_PROVIDER,
133                 mProvisioningAnalyticsTracker);
134 
135         // GIVEN that there is a managed profile
136         addManagedProfile(MANAGED_PROFILE_USER_ID, ADMIN_COMPONENT);
137 
138         // WHEN running the OtaController
139         controller.run();
140 
141         // THEN the task list should contain these tasks.
142         assertTaskList(
143                 Pair.create(UserHandle.USER_SYSTEM, MigrateSystemAppsSnapshotTask.class),
144                 Pair.create(MANAGED_PROFILE_USER_ID, InstallExistingPackageTask.class),
145                 Pair.create(MANAGED_PROFILE_USER_ID, DeleteNonRequiredAppsTask.class),
146                 Pair.create(UserHandle.USER_SYSTEM, UpdateInteractAcrossProfilesAppOpTask.class));
147 
148         // THEN the cross profile intent filters should be reset
149         verify(mDevicePolicyManager).resetDefaultCrossProfileIntentFilters(UserHandle.USER_SYSTEM);
150         verify(mDevicePolicyManager, never()).resetDefaultCrossProfileIntentFilters(
151                 MANAGED_PROFILE_USER_ID);
152 
153         // THEN the DISALLOW_WALLPAPER restriction should be set
154         verify(mUserManager).setUserRestriction(UserManager.DISALLOW_WALLPAPER, true,
155                 UserHandle.of(MANAGED_PROFILE_USER_ID));
156     }
157 
158     @Test
testManagedProfileWithMissingSystemIme()159     public void testManagedProfileWithMissingSystemIme() {
160         IntFunction<ArraySet<String>> missingSystemImeProvider =
161                 (IntFunction<ArraySet<String>>) mock(IntFunction.class);
162 
163         OtaController controller = new OtaController(mContext, mTaskExecutor,
164                 missingSystemImeProvider,
165                 mProvisioningAnalyticsTracker);
166 
167         // GIVEN that there is a managed profile
168         addManagedProfile(MANAGED_PROFILE_USER_ID, ADMIN_COMPONENT);
169 
170         // GIVEN that the managed profile does not have DUMMY_SYSTEM_IME_PACKAGE_NAME.
171         ArraySet<String> missingImes = new ArraySet<>();
172         missingImes.add(DUMMY_SYSTEM_IME_PACKAGE_NAME);
173         when(missingSystemImeProvider.apply(MANAGED_PROFILE_USER_ID)).thenReturn(missingImes);
174 
175         // WHEN running the OtaController
176         controller.run();
177 
178         // THEN the task list should contain these tasks.
179         assertTaskList(
180                 Pair.create(UserHandle.USER_SYSTEM, MigrateSystemAppsSnapshotTask.class),
181                 Pair.create(MANAGED_PROFILE_USER_ID, InstallExistingPackageTask.class),
182                 Pair.create(MANAGED_PROFILE_USER_ID, InstallExistingPackageTask.class),
183 
184                 Pair.create(MANAGED_PROFILE_USER_ID, DeleteNonRequiredAppsTask.class),
185                 Pair.create(UserHandle.USER_SYSTEM, UpdateInteractAcrossProfilesAppOpTask.class));
186 
187         // THEN the cross profile intent filters should be reset
188         verify(mDevicePolicyManager).resetDefaultCrossProfileIntentFilters(UserHandle.USER_SYSTEM);
189         verify(mDevicePolicyManager, never()).resetDefaultCrossProfileIntentFilters(
190                 MANAGED_PROFILE_USER_ID);
191 
192         // THEN the DISALLOW_WALLPAPER restriction should be set
193         verify(mUserManager).setUserRestriction(UserManager.DISALLOW_WALLPAPER, true,
194                 UserHandle.of(MANAGED_PROFILE_USER_ID));
195 
196         // THEN the DUMMY_SYSTEM_IME_PACKAGE_NAME should be installed.
197         assertInstallExistingPackageTask(MANAGED_PROFILE_USER_ID, DUMMY_SYSTEM_IME_PACKAGE_NAME);
198     }
199 
200     @Test
testManagedUser()201     public void testManagedUser() {
202         OtaController controller = new OtaController(mContext, mTaskExecutor,
203                 NO_MISSING_SYSTEM_IME_PROVIDER, mProvisioningAnalyticsTracker);
204 
205         // GIVEN that there is a managed profile
206         addManagedUser(MANAGED_USER_USER_ID, ADMIN_COMPONENT);
207 
208         // WHEN running the OtaController
209         controller.run();
210 
211         // THEN the task list should contain these tasks.
212         assertTaskList(
213                 Pair.create(UserHandle.USER_SYSTEM, MigrateSystemAppsSnapshotTask.class),
214                 Pair.create(MANAGED_USER_USER_ID, DeleteNonRequiredAppsTask.class),
215                 Pair.create(UserHandle.USER_SYSTEM, UpdateInteractAcrossProfilesAppOpTask.class));
216     }
217 
218     private class FakeTaskExecutor extends TaskExecutor {
219 
FakeTaskExecutor()220         public FakeTaskExecutor() {
221             super();
222         }
223 
224         @Override
execute(int userId, AbstractProvisioningTask task)225         public synchronized void execute(int userId, AbstractProvisioningTask task) {
226             mTasks.add(Pair.create(userId, task));
227         }
228     }
229 
setDeviceOwner(int userId, ComponentName admin)230     private void setDeviceOwner(int userId, ComponentName admin) {
231         when(mDevicePolicyManager.getDeviceOwnerUserId()).thenReturn(userId);
232         when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(admin);
233     }
234 
addManagedProfile(int userId, ComponentName admin)235     private void addManagedProfile(int userId, ComponentName admin) {
236         UserInfo ui = new UserInfo(userId, null, UserInfo.FLAG_MANAGED_PROFILE);
237         mUsers.add(ui);
238         when(mDevicePolicyManager.getProfileOwnerAsUser(userId)).thenReturn(admin);
239         when(mUserManager.getProfiles(userId)).thenReturn(Collections.singletonList(ui));
240         mProfiles.add(ui);
241     }
242 
addManagedUser(int userId, ComponentName admin)243     private void addManagedUser(int userId, ComponentName admin) {
244         UserInfo ui = new UserInfo(userId, null, 0);
245         mUsers.add(ui);
246         when(mDevicePolicyManager.getProfileOwnerAsUser(userId)).thenReturn(admin);
247     }
248 
addSystemUser()249     private void addSystemUser() {
250         UserInfo ui = new UserInfo(UserHandle.USER_SYSTEM, null, UserInfo.FLAG_PRIMARY);
251         mUsers.add(ui);
252         mProfiles.add(ui);
253     }
254 
assertTaskList(Pair<Integer, Class>.... tasks)255     private void assertTaskList(Pair<Integer, Class>... tasks) {
256         assertEquals(tasks.length, mTasks.size());
257 
258         for (Pair<Integer, Class> task : tasks) {
259             assertTaskListContains(task.first, task.second);
260         }
261     }
262 
assertTaskListContains(Integer userId, Class taskClass)263     private void assertTaskListContains(Integer userId, Class taskClass) {
264         for (Pair<Integer, AbstractProvisioningTask> task : mTasks) {
265             if (Objects.equals(userId, task.first) && taskClass.isInstance(task.second)) {
266                 return;
267             }
268         }
269         fail("Task for class " + taskClass + " and userId " + userId + " not executed");
270     }
271 
assertInstallExistingPackageTask(int userId, String packageName)272     private void assertInstallExistingPackageTask(int userId, String packageName) {
273         for (Pair<Integer, AbstractProvisioningTask> task : mTasks) {
274             if (userId != task.first || !InstallExistingPackageTask.class.isInstance(task.second)) {
275                 continue;
276             }
277             InstallExistingPackageTask installExistingPackageTask =
278                     (InstallExistingPackageTask) task.second;
279             if (packageName.equals(installExistingPackageTask.getPackageName())) {
280                 return;
281             }
282         }
283         fail("InstallExistingPackageTask for " + packageName + " and userId " + userId
284                 + " not executed");
285     }
286 }
287