UserManagerTest.java revision 72d9c026561bb681392d1a56d98faf1667a0cc48
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.os.Bundle; 25import android.os.UserHandle; 26import android.os.UserManager; 27import android.test.AndroidTestCase; 28 29import java.util.ArrayList; 30import java.util.List; 31 32/** Test {@link UserManager} functionality. */ 33public class UserManagerTest extends AndroidTestCase { 34 35 private UserManager mUserManager = null; 36 private final Object mUserLock = new Object(); 37 private List<Integer> usersToRemove; 38 39 @Override 40 public void setUp() throws Exception { 41 super.setUp(); 42 mUserManager = UserManager.get(getContext()); 43 IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); 44 getContext().registerReceiver(new BroadcastReceiver() { 45 @Override 46 public void onReceive(Context context, Intent intent) { 47 synchronized (mUserLock) { 48 mUserLock.notifyAll(); 49 } 50 } 51 }, filter); 52 53 removeExistingUsers(); 54 usersToRemove = new ArrayList<>(); 55 } 56 57 @Override 58 protected void tearDown() throws Exception { 59 for (Integer userId : usersToRemove) { 60 removeUser(userId); 61 } 62 super.tearDown(); 63 } 64 65 private void removeExistingUsers() { 66 List<UserInfo> list = mUserManager.getUsers(); 67 for (UserInfo user : list) { 68 // Keep system and primary user. 69 // We do not have to keep primary user, but in split system user mode, we need it 70 // until http://b/22976637 is fixed. Right now in split system user mode, you need to 71 // switch to primary user and run tests under primary user. 72 if (user.id != UserHandle.USER_SYSTEM && !user.isPrimary()) { 73 removeUser(user.id); 74 } 75 } 76 } 77 78 public void testHasSystemUser() throws Exception { 79 assertTrue(findUser(UserHandle.USER_SYSTEM)); 80 } 81 82 public void testAddUser() throws Exception { 83 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 84 assertTrue(userInfo != null); 85 86 List<UserInfo> list = mUserManager.getUsers(); 87 boolean found = false; 88 for (UserInfo user : list) { 89 if (user.id == userInfo.id && user.name.equals("Guest 1") 90 && user.isGuest() 91 && !user.isAdmin() 92 && !user.isPrimary()) { 93 found = true; 94 Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle()); 95 assertFalse("New user should have DISALLOW_CONFIG_WIFI =false by default", 96 restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI)); 97 } 98 } 99 assertTrue(found); 100 } 101 102 public void testAdd2Users() throws Exception { 103 UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 104 UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN); 105 106 assertTrue(user1 != null); 107 assertTrue(user2 != null); 108 109 assertTrue(findUser(0)); 110 assertTrue(findUser(user1.id)); 111 assertTrue(findUser(user2.id)); 112 } 113 114 public void testRemoveUser() throws Exception { 115 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST); 116 removeUser(userInfo.id); 117 118 assertFalse(findUser(userInfo.id)); 119 } 120 121 public void testAddGuest() throws Exception { 122 UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST); 123 UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST); 124 assertNotNull(userInfo1); 125 assertNull(userInfo2); 126 } 127 128 // Make sure only one managed profile can be created 129 public void testAddManagedProfile() throws Exception { 130 final int primaryUserId = mUserManager.getPrimaryUser().id; 131 UserInfo userInfo1 = createProfileForUser("Managed 1", 132 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 133 UserInfo userInfo2 = createProfileForUser("Managed 2", 134 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 135 assertNotNull(userInfo1); 136 assertNull(userInfo2); 137 // Verify that current user is not a managed profile 138 assertFalse(mUserManager.isManagedProfile()); 139 } 140 141 public void testGetUserCreationTime() throws Exception { 142 final int primaryUserId = mUserManager.getPrimaryUser().id; 143 UserInfo profile = createProfileForUser("Managed 1", 144 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId); 145 assertNotNull(profile); 146 assertTrue("creationTime must be set when the profile is created", 147 profile.creationTime > 0); 148 assertEquals(profile.creationTime, mUserManager.getUserCreationTime( 149 new UserHandle(profile.id))); 150 151 long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime; 152 assertEquals(ownerCreationTime, mUserManager.getUserCreationTime( 153 new UserHandle(primaryUserId))); 154 155 try { 156 int noSuchUserId = 100500; 157 mUserManager.getUserCreationTime(new UserHandle(noSuchUserId)); 158 fail("SecurityException should be thrown for nonexistent user"); 159 } catch (Exception e) { 160 assertTrue("SecurityException should be thrown for nonexistent user, but was: " + e, 161 e instanceof SecurityException); 162 } 163 164 UserInfo user = createUser("User 1", 0); 165 try { 166 mUserManager.getUserCreationTime(new UserHandle(user.id)); 167 fail("SecurityException should be thrown for other user"); 168 } catch (Exception e) { 169 assertTrue("SecurityException should be thrown for other user, but was: " + e, 170 e instanceof SecurityException); 171 } 172 } 173 174 175 private boolean findUser(int id) { 176 List<UserInfo> list = mUserManager.getUsers(); 177 178 for (UserInfo user : list) { 179 if (user.id == id) { 180 return true; 181 } 182 } 183 return false; 184 } 185 186 public void testSerialNumber() { 187 UserInfo user1 = createUser("User 1", 0); 188 int serialNumber1 = user1.serialNumber; 189 assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id)); 190 assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1)); 191 UserInfo user2 = createUser("User 2", 0); 192 int serialNumber2 = user2.serialNumber; 193 assertFalse(serialNumber1 == serialNumber2); 194 assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id)); 195 assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2)); 196 } 197 198 public void testMaxUsers() { 199 int N = UserManager.getMaxSupportedUsers(); 200 int count = mUserManager.getUsers().size(); 201 // Create as many users as permitted and make sure creation passes 202 while (count < N) { 203 UserInfo ui = createUser("User " + count, 0); 204 assertNotNull(ui); 205 count++; 206 } 207 // Try to create one more user and make sure it fails 208 UserInfo extra = createUser("One more", 0); 209 assertNull(extra); 210 } 211 212 public void testRestrictions() { 213 UserInfo testUser = createUser("User 1", 0); 214 Bundle restrictions = new Bundle(); 215 restrictions.putBoolean(UserManager.DISALLOW_INSTALL_APPS, true); 216 restrictions.putBoolean(UserManager.DISALLOW_CONFIG_WIFI, false); 217 mUserManager.setUserRestrictions(restrictions, new UserHandle(testUser.id)); 218 Bundle stored = mUserManager.getUserRestrictions(new UserHandle(testUser.id)); 219 assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false); 220 assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false); 221 assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true); 222 } 223 224 private void removeUser(int userId) { 225 synchronized (mUserLock) { 226 mUserManager.removeUser(userId); 227 while (mUserManager.getUserInfo(userId) != null) { 228 try { 229 mUserLock.wait(500); 230 } catch (InterruptedException ie) { 231 } 232 } 233 } 234 } 235 236 private UserInfo createUser(String name, int flags) { 237 UserInfo user = mUserManager.createUser(name, flags); 238 if (user != null) { 239 usersToRemove.add(user.id); 240 } 241 return user; 242 } 243 244 private UserInfo createProfileForUser(String name, int flags, int userHandle) { 245 UserInfo profile = mUserManager.createProfileForUser(name, flags, userHandle); 246 if (profile != null) { 247 usersToRemove.add(profile.id); 248 } 249 return profile; 250 } 251 252} 253