UserManagerTest.java revision 133c627fa011ab139d5aed832f2b36fe28016e81
1/* 2 * Copyright (C) 2011 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.pm; 18 19import android.content.BroadcastReceiver; 20import android.content.Context; 21import android.content.Intent; 22import android.content.IntentFilter; 23import android.content.pm.UserInfo; 24import android.app.ActivityManager; 25import android.os.Bundle; 26import android.os.UserHandle; 27import android.os.UserManager; 28import android.provider.Settings; 29import android.test.AndroidTestCase; 30import android.test.suitebuilder.annotation.LargeTest; 31import android.test.suitebuilder.annotation.MediumTest; 32import android.test.suitebuilder.annotation.SmallTest; 33 34import com.android.internal.util.ArrayUtils; 35 36import java.util.ArrayList; 37import java.util.Arrays; 38import java.util.List; 39 40/** Test {@link UserManager} functionality. */ 41public class UserManagerTest extends AndroidTestCase { 42 // Taken from UserManagerService 43 private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // 30 years 44 45 private static final int REMOVE_CHECK_INTERVAL_MILLIS = 500; // 0.5 seconds 46 private static final int REMOVE_TIMEOUT_MILLIS = 60 * 1000; // 60 seconds 47 private static final int SWITCH_USER_TIMEOUT_MILLIS = 40 * 1000; // 40 seconds 48 49 private final Object mUserRemoveLock = new Object(); 50 private final Object mUserSwitchLock = new Object(); 51 52 private UserManager mUserManager = null; 53 private List<Integer> usersToRemove; 54 55 @Override 56 public void setUp() throws Exception { 57 super.setUp(); 58 mUserManager = UserManager.get(getContext()); 59 60 IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); 61 filter.addAction(Intent.ACTION_USER_SWITCHED); 62 getContext().registerReceiver(new BroadcastReceiver() { 63 @Override 64 public void onReceive(Context context, Intent intent) { 65 switch (intent.getAction()) { 66 case Intent.ACTION_USER_REMOVED: 67 synchronized (mUserRemoveLock) { 68 mUserRemoveLock.notifyAll(); 69 } 70 break; 71 case Intent.ACTION_USER_SWITCHED: 72 synchronized (mUserSwitchLock) { 73 mUserSwitchLock.notifyAll(); 74 } 75 break; 76 } 77 } 78 }, filter); 79 80 removeExistingUsers(); 81 usersToRemove = new ArrayList<>(); 82 } 83 84 @Override 85 protected void tearDown() throws Exception { 86 for (Integer userId : usersToRemove) { 87 removeUser(userId); 88 } 89 super.tearDown(); 90 } 91 92 private void removeExistingUsers() { 93 List<UserInfo> list = mUserManager.getUsers(); 94 for (UserInfo user : list) { 95 // Keep system and primary user. 96 // We do not have to keep primary user, but in split system user mode, we need it 97 // until http://b/22976637 is fixed. Right now in split system user mode, you need to 98 // switch to primary user and run tests under primary user. 99 if (user.id != UserHandle.USER_SYSTEM && !user.isPrimary()) { 100 removeUser(user.id); 101 } 102 } 103 } 104 105 @SmallTest 106 public void testHasSystemUser() throws Exception { 107 assertTrue(findUser(UserHandle.USER_SYSTEM)); 108 } 109 110 @MediumTest 111 public void testAddUser() throws Exception { 112 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 113 assertTrue(userInfo != null); 114 115 List<UserInfo> list = mUserManager.getUsers(); 116 boolean found = false; 117 for (UserInfo user : list) { 118 if (user.id == userInfo.id && user.name.equals("Guest 1") 119 && user.isGuest() 120 && !user.isAdmin() 121 && !user.isPrimary()) { 122 found = true; 123 Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle()); 124 assertTrue("Guest user should have DISALLOW_CONFIG_WIFI=true by default", 125 restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI)); 126 } 127 } 128 assertTrue(found); 129 } 130 131 @MediumTest 132 public void testAdd2Users() throws Exception { 133 UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 134 UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN); 135 136 assertTrue(user1 != null); 137 assertTrue(user2 != null); 138 139 assertTrue(findUser(0)); 140 assertTrue(findUser(user1.id)); 141 assertTrue(findUser(user2.id)); 142 } 143 144 @MediumTest 145 public void testRemoveUser() throws Exception { 146 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 147 removeUser(userInfo.id); 148 149 assertFalse(findUser(userInfo.id)); 150 } 151 152 @MediumTest 153 public void testAddGuest() throws Exception { 154 UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 155 UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST); 156 assertNotNull(userInfo1); 157 assertNull(userInfo2); 158 } 159 160 @MediumTest 161 public void testGetProfileParent() throws Exception { 162 final int primaryUserId = mUserManager.getPrimaryUser().id; 163 164 UserInfo userInfo = createProfileForUser("Profile", 165 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 166 assertNotNull(userInfo); 167 168 UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id); 169 assertNotNull(parentProfileInfo); 170 assertEquals(parentProfileInfo.id, primaryUserId); 171 } 172 173 // Make sure only one managed profile can be created 174 @MediumTest 175 public void testAddManagedProfile() throws Exception { 176 final int primaryUserId = mUserManager.getPrimaryUser().id; 177 UserInfo userInfo1 = createProfileForUser("Managed 1", 178 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 179 UserInfo userInfo2 = createProfileForUser("Managed 2", 180 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 181 182 assertNotNull(userInfo1); 183 assertNull(userInfo2); 184 // Verify that current user is not a managed profile 185 assertFalse(mUserManager.isManagedProfile()); 186 } 187 188 @MediumTest 189 public void testAddRestrictedProfile() throws Exception { 190 UserInfo userInfo = createRestrictedProfile("Profile"); 191 assertNotNull(userInfo); 192 193 Bundle restrictions = mUserManager.getUserRestrictions(UserHandle.of(userInfo.id)); 194 assertTrue("Restricted profile should have DISALLOW_MODIFY_ACCOUNTS restriction by default", 195 restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS)); 196 assertTrue("Restricted profile should have DISALLOW_SHARE_LOCATION restriction by default", 197 restrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION)); 198 199 int locationMode = Settings.Secure.getIntForUser(getContext().getContentResolver(), 200 Settings.Secure.LOCATION_MODE, 201 Settings.Secure.LOCATION_MODE_HIGH_ACCURACY, 202 userInfo.id); 203 assertEquals("Restricted profile should have setting LOCATION_MODE set to " 204 + "LOCATION_MODE_OFF by default", locationMode, Settings.Secure.LOCATION_MODE_OFF); 205 } 206 207 @MediumTest 208 public void testGetUserCreationTime() throws Exception { 209 final int primaryUserId = mUserManager.getPrimaryUser().id; 210 final long startTime = System.currentTimeMillis(); 211 UserInfo profile = createProfileForUser("Managed 1", 212 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 213 final long endTime = System.currentTimeMillis(); 214 assertNotNull(profile); 215 if (System.currentTimeMillis() > EPOCH_PLUS_30_YEARS) { 216 assertTrue("creationTime must be set when the profile is created", 217 profile.creationTime >= startTime && profile.creationTime <= endTime); 218 } else { 219 assertTrue("creationTime must be 0 if the time is not > EPOCH_PLUS_30_years", 220 profile.creationTime == 0); 221 } 222 assertEquals(profile.creationTime, mUserManager.getUserCreationTime( 223 new UserHandle(profile.id))); 224 225 long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime; 226 assertEquals(ownerCreationTime, mUserManager.getUserCreationTime( 227 new UserHandle(primaryUserId))); 228 } 229 230 @SmallTest 231 public void testGetUserCreationTime_nonExistentUser() throws Exception { 232 try { 233 int noSuchUserId = 100500; 234 mUserManager.getUserCreationTime(new UserHandle(noSuchUserId)); 235 fail("SecurityException should be thrown for nonexistent user"); 236 } catch (Exception e) { 237 assertTrue("SecurityException should be thrown for nonexistent user, but was: " + e, 238 e instanceof SecurityException); 239 } 240 } 241 242 @SmallTest 243 public void testGetUserCreationTime_otherUser() throws Exception { 244 UserInfo user = createUser("User 1", 0); 245 try { 246 mUserManager.getUserCreationTime(new UserHandle(user.id)); 247 fail("SecurityException should be thrown for other user"); 248 } catch (Exception e) { 249 assertTrue("SecurityException should be thrown for other user, but was: " + e, 250 e instanceof SecurityException); 251 } 252 } 253 254 private boolean findUser(int id) { 255 List<UserInfo> list = mUserManager.getUsers(); 256 257 for (UserInfo user : list) { 258 if (user.id == id) { 259 return true; 260 } 261 } 262 return false; 263 } 264 265 @MediumTest 266 public void testSerialNumber() { 267 UserInfo user1 = createUser("User 1", 0); 268 int serialNumber1 = user1.serialNumber; 269 assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id)); 270 assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1)); 271 UserInfo user2 = createUser("User 2", 0); 272 int serialNumber2 = user2.serialNumber; 273 assertFalse(serialNumber1 == serialNumber2); 274 assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id)); 275 assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2)); 276 } 277 278 @MediumTest 279 public void testGetSerialNumbersOfUsers() { 280 UserInfo user1 = createUser("User 1", 0); 281 UserInfo user2 = createUser("User 2", 0); 282 long[] serialNumbersOfUsers = mUserManager.getSerialNumbersOfUsers(false); 283 String errMsg = "Array " + Arrays.toString(serialNumbersOfUsers) + " should contain "; 284 assertTrue(errMsg + user1.serialNumber, 285 ArrayUtils.contains(serialNumbersOfUsers, user1.serialNumber)); 286 assertTrue(errMsg + user2.serialNumber, 287 ArrayUtils.contains(serialNumbersOfUsers, user2.serialNumber)); 288 } 289 290 @MediumTest 291 public void testMaxUsers() { 292 int N = UserManager.getMaxSupportedUsers(); 293 int count = mUserManager.getUsers().size(); 294 // Create as many users as permitted and make sure creation passes 295 while (count < N) { 296 UserInfo ui = createUser("User " + count, 0); 297 assertNotNull(ui); 298 count++; 299 } 300 // Try to create one more user and make sure it fails 301 UserInfo extra = createUser("One more", 0); 302 assertNull(extra); 303 } 304 305 @MediumTest 306 public void testGetUserCount() { 307 int count = mUserManager.getUsers().size(); 308 UserInfo user1 = createUser("User 1", 0); 309 assertNotNull(user1); 310 UserInfo user2 = createUser("User 2", 0); 311 assertNotNull(user2); 312 assertEquals(count + 2, mUserManager.getUserCount()); 313 } 314 315 @MediumTest 316 public void testRestrictions() { 317 UserInfo testUser = createUser("User 1", 0); 318 319 mUserManager.setUserRestriction( 320 UserManager.DISALLOW_INSTALL_APPS, true, new UserHandle(testUser.id)); 321 mUserManager.setUserRestriction( 322 UserManager.DISALLOW_CONFIG_WIFI, false, new UserHandle(testUser.id)); 323 324 Bundle stored = mUserManager.getUserRestrictions(new UserHandle(testUser.id)); 325 // Note this will fail if DO already sets those restrictions. 326 assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false); 327 assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false); 328 assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true); 329 } 330 331 @MediumTest 332 public void testSetDefaultGuestRestrictions() { 333 final Bundle origGuestRestrictions = mUserManager.getDefaultGuestRestrictions(); 334 Bundle restrictions = new Bundle(); 335 restrictions.putBoolean(UserManager.DISALLOW_FUN, true); 336 mUserManager.setDefaultGuestRestrictions(restrictions); 337 338 try { 339 UserInfo guest = createUser("Guest", UserInfo.FLAG_GUEST); 340 assertNotNull(guest); 341 assertTrue(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN, 342 guest.getUserHandle())); 343 } finally { 344 mUserManager.setDefaultGuestRestrictions(origGuestRestrictions); 345 } 346 } 347 348 @LargeTest 349 public void testSwitchUser() { 350 ActivityManager am = getContext().getSystemService(ActivityManager.class); 351 final int startUser = am.getCurrentUser(); 352 UserInfo user = createUser("User", 0); 353 assertNotNull(user); 354 // Switch to the user just created. 355 switchUser(user.id); 356 // Switch back to the starting user. 357 switchUser(startUser); 358 } 359 360 private void switchUser(int userId) { 361 synchronized (mUserSwitchLock) { 362 ActivityManager am = getContext().getSystemService(ActivityManager.class); 363 am.switchUser(userId); 364 long time = System.currentTimeMillis(); 365 try { 366 mUserSwitchLock.wait(SWITCH_USER_TIMEOUT_MILLIS); 367 } catch (InterruptedException ie) { 368 Thread.currentThread().interrupt(); 369 return; 370 } 371 if (System.currentTimeMillis() - time > SWITCH_USER_TIMEOUT_MILLIS) { 372 fail("Timeout waiting for the user switch to u" + userId); 373 } 374 } 375 } 376 377 private void removeUser(int userId) { 378 synchronized (mUserRemoveLock) { 379 mUserManager.removeUser(userId); 380 long time = System.currentTimeMillis(); 381 while (mUserManager.getUserInfo(userId) != null) { 382 try { 383 mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS); 384 } catch (InterruptedException ie) { 385 Thread.currentThread().interrupt(); 386 return; 387 } 388 if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) { 389 fail("Timeout waiting for removeUser. userId = " + userId); 390 } 391 } 392 } 393 } 394 395 private UserInfo createUser(String name, int flags) { 396 UserInfo user = mUserManager.createUser(name, flags); 397 if (user != null) { 398 usersToRemove.add(user.id); 399 } 400 return user; 401 } 402 403 private UserInfo createProfileForUser(String name, int flags, int userHandle) { 404 UserInfo profile = mUserManager.createProfileForUser(name, flags, userHandle); 405 if (profile != null) { 406 usersToRemove.add(profile.id); 407 } 408 return profile; 409 } 410 411 private UserInfo createRestrictedProfile(String name) { 412 UserInfo profile = mUserManager.createRestrictedProfile(name); 413 if (profile != null) { 414 usersToRemove.add(profile.id); 415 } 416 return profile; 417 } 418} 419