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