2 * Copyright (C) 2011 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.server.pm;
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.content.pm.UserInfo;
24 import android.os.Bundle;
25 import android.os.UserHandle;
26 import android.os.UserManager;
27 import android.test.AndroidTestCase;
28 import android.test.suitebuilder.annotation.MediumTest;
30 import com.android.internal.util.ArrayUtils;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.List;
36 /** Test {@link UserManager} functionality. */
38 public class UserManagerTest extends AndroidTestCase {
39 private static final int REMOVE_CHECK_INTERVAL = 500;
40 private static final int REMOVE_TIMEOUT = 60 * 1000;
41 private UserManager mUserManager = null;
42 private final Object mUserLock = new Object();
43 private List<Integer> usersToRemove;
46 public void setUp() throws Exception {
48 mUserManager = UserManager.get(getContext());
49 IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
50 getContext().registerReceiver(new BroadcastReceiver() {
52 public void onReceive(Context context, Intent intent) {
53 synchronized (mUserLock) {
54 mUserLock.notifyAll();
59 removeExistingUsers();
60 usersToRemove = new ArrayList<>();
64 protected void tearDown() throws Exception {
65 for (Integer userId : usersToRemove) {
71 private void removeExistingUsers() {
72 List<UserInfo> list = mUserManager.getUsers();
73 for (UserInfo user : list) {
74 // Keep system and primary user.
75 // We do not have to keep primary user, but in split system user mode, we need it
76 // until http://b/22976637 is fixed. Right now in split system user mode, you need to
77 // switch to primary user and run tests under primary user.
78 if (user.id != UserHandle.USER_SYSTEM && !user.isPrimary()) {
84 public void testHasSystemUser() throws Exception {
85 assertTrue(findUser(UserHandle.USER_SYSTEM));
88 public void testAddUser() throws Exception {
89 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
90 assertTrue(userInfo != null);
92 List<UserInfo> list = mUserManager.getUsers();
93 boolean found = false;
94 for (UserInfo user : list) {
95 if (user.id == userInfo.id && user.name.equals("Guest 1")
98 && !user.isPrimary()) {
100 Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle());
101 assertTrue("Guest user should have DISALLOW_CONFIG_WIFI=true by default",
102 restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI));
108 public void testAdd2Users() throws Exception {
109 UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
110 UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN);
112 assertTrue(user1 != null);
113 assertTrue(user2 != null);
115 assertTrue(findUser(0));
116 assertTrue(findUser(user1.id));
117 assertTrue(findUser(user2.id));
120 public void testRemoveUser() throws Exception {
121 UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
122 removeUser(userInfo.id);
124 assertFalse(findUser(userInfo.id));
127 public void testAddGuest() throws Exception {
128 UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
129 UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST);
130 assertNotNull(userInfo1);
131 assertNull(userInfo2);
134 // Make sure only one managed profile can be created
135 public void testAddManagedProfile() throws Exception {
136 final int primaryUserId = mUserManager.getPrimaryUser().id;
137 UserInfo userInfo1 = createProfileForUser("Managed 1",
138 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
139 UserInfo userInfo2 = createProfileForUser("Managed 2",
140 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
141 assertNotNull(userInfo1);
142 assertNull(userInfo2);
143 // Verify that current user is not a managed profile
144 assertFalse(mUserManager.isManagedProfile());
147 public void testGetUserCreationTime() throws Exception {
148 final int primaryUserId = mUserManager.getPrimaryUser().id;
149 UserInfo profile = createProfileForUser("Managed 1",
150 UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
151 assertNotNull(profile);
152 assertTrue("creationTime must be set when the profile is created",
153 profile.creationTime > 0);
154 assertEquals(profile.creationTime, mUserManager.getUserCreationTime(
155 new UserHandle(profile.id)));
157 long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime;
158 assertEquals(ownerCreationTime, mUserManager.getUserCreationTime(
159 new UserHandle(primaryUserId)));
162 int noSuchUserId = 100500;
163 mUserManager.getUserCreationTime(new UserHandle(noSuchUserId));
164 fail("SecurityException should be thrown for nonexistent user");
165 } catch (Exception e) {
166 assertTrue("SecurityException should be thrown for nonexistent user, but was: " + e,
167 e instanceof SecurityException);
170 UserInfo user = createUser("User 1", 0);
172 mUserManager.getUserCreationTime(new UserHandle(user.id));
173 fail("SecurityException should be thrown for other user");
174 } catch (Exception e) {
175 assertTrue("SecurityException should be thrown for other user, but was: " + e,
176 e instanceof SecurityException);
181 private boolean findUser(int id) {
182 List<UserInfo> list = mUserManager.getUsers();
184 for (UserInfo user : list) {
192 public void testSerialNumber() {
193 UserInfo user1 = createUser("User 1", 0);
194 int serialNumber1 = user1.serialNumber;
195 assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id));
196 assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1));
197 UserInfo user2 = createUser("User 2", 0);
198 int serialNumber2 = user2.serialNumber;
199 assertFalse(serialNumber1 == serialNumber2);
200 assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id));
201 assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2));
204 public void testGetSerialNumbersOfUsers() {
205 UserInfo user1 = createUser("User 1", 0);
206 UserInfo user2 = createUser("User 2", 0);
207 long[] serialNumbersOfUsers = mUserManager.getSerialNumbersOfUsers(false);
208 String errMsg = "Array " + Arrays.toString(serialNumbersOfUsers) + " should contain ";
209 assertTrue(errMsg + user1.serialNumber,
210 ArrayUtils.contains(serialNumbersOfUsers, user1.serialNumber));
211 assertTrue(errMsg + user2.serialNumber,
212 ArrayUtils.contains(serialNumbersOfUsers, user2.serialNumber));
215 public void testMaxUsers() {
216 int N = UserManager.getMaxSupportedUsers();
217 int count = mUserManager.getUsers().size();
218 // Create as many users as permitted and make sure creation passes
220 UserInfo ui = createUser("User " + count, 0);
224 // Try to create one more user and make sure it fails
225 UserInfo extra = createUser("One more", 0);
229 public void testRestrictions() {
230 UserInfo testUser = createUser("User 1", 0);
232 mUserManager.setUserRestriction(
233 UserManager.DISALLOW_INSTALL_APPS, true, new UserHandle(testUser.id));
234 mUserManager.setUserRestriction(
235 UserManager.DISALLOW_CONFIG_WIFI, false, new UserHandle(testUser.id));
237 Bundle stored = mUserManager.getUserRestrictions(new UserHandle(testUser.id));
238 // Note this will fail if DO already sets those restrictions.
239 assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false);
240 assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false);
241 assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true);
244 private void removeUser(int userId) {
245 synchronized (mUserLock) {
246 mUserManager.removeUser(userId);
247 long time = System.currentTimeMillis();
248 while (mUserManager.getUserInfo(userId) != null) {
250 mUserLock.wait(REMOVE_CHECK_INTERVAL);
251 } catch (InterruptedException ie) {
252 Thread.currentThread().interrupt();
255 if (System.currentTimeMillis() - time > REMOVE_TIMEOUT) {
256 fail("Timeout waiting for removeUser. userId = " + userId);
262 private UserInfo createUser(String name, int flags) {
263 UserInfo user = mUserManager.createUser(name, flags);
265 usersToRemove.add(user.id);
270 private UserInfo createProfileForUser(String name, int flags, int userHandle) {
271 UserInfo profile = mUserManager.createProfileForUser(name, flags, userHandle);
272 if (profile != null) {
273 usersToRemove.add(profile.id);