14b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani/* 24b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Copyright (C) 2011 The Android Open Source Project 34b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * 44b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 54b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * you may not use this file except in compliance with the License. 64b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * You may obtain a copy of the License at 74b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * 84b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 94b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * 104b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * Unless required by applicable law or agreed to in writing, software 114b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 124b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * See the License for the specific language governing permissions and 144b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani * limitations under the License. 154b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani */ 164b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 174b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasanipackage com.android.server.pm; 184b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 19db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasaniimport android.content.BroadcastReceiver; 202a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasaniimport android.content.Context; 21db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasaniimport android.content.Intent; 22db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasaniimport android.content.IntentFilter; 234b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasaniimport android.content.pm.UserInfo; 24e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasaniimport android.os.Bundle; 2520949a76fee62e89d7dc22858a74469efa14f61dAmith Yamasaniimport android.os.UserHandle; 262a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasaniimport android.os.UserManager; 274b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasaniimport android.test.AndroidTestCase; 284b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 29db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasaniimport java.util.ArrayList; 304b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasaniimport java.util.List; 314b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 322a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani/** Test {@link UserManager} functionality. */ 330b285499db739ba50f2f839d633e763c70e67f96Amith Yamasanipublic class UserManagerTest extends AndroidTestCase { 344b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 352a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserManager mUserManager = null; 36db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani Object mUserLock = new Object(); 374b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 384b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani @Override 394b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani public void setUp() throws Exception { 402a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE); 41db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED); 42db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani getContext().registerReceiver(new BroadcastReceiver() { 43db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani @Override 44db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani public void onReceive(Context context, Intent intent) { 45db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani synchronized (mUserLock) { 46db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani mUserLock.notifyAll(); 47db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 48db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 49db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani }, filter); 504b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 514b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 524b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani public void testHasPrimary() throws Exception { 534b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(findUser(0)); 544b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 554b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 564b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani public void testAddUser() throws Exception { 572a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo userInfo = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST); 584b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(userInfo != null); 594b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 602a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani List<UserInfo> list = mUserManager.getUsers(); 614b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani boolean found = false; 624b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani for (UserInfo user : list) { 634b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani if (user.id == userInfo.id && user.name.equals("Guest 1") 644b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani && user.isGuest() 654b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani && !user.isAdmin() 664b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani && !user.isPrimary()) { 674b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani found = true; 686794458f8626c3be27eac3db3a5c89d94f132675Maggie Benthall Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle()); 6905191053545065c9c71afae173d3ab42a2d947faAmith Yamasani assertFalse("New user should have DISALLOW_CONFIG_WIFI =false by default", 7005191053545065c9c71afae173d3ab42a2d947faAmith Yamasani restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI)); 714b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 724b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 734b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(found); 74db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(userInfo.id); 754b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 764b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 774b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani public void testAdd2Users() throws Exception { 782a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo user1 = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST); 792a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo user2 = mUserManager.createUser("User 2", UserInfo.FLAG_ADMIN); 804b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 814b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(user1 != null); 824b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(user2 != null); 834b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 844b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(findUser(0)); 854b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(findUser(user1.id)); 864b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertTrue(findUser(user2.id)); 87db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(user1.id); 88db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(user2.id); 894b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 904b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 914b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani public void testRemoveUser() throws Exception { 922a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo userInfo = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST); 93db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(userInfo.id); 944b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 954b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani assertFalse(findUser(userInfo.id)); 964b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 974b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 984b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani private boolean findUser(int id) { 990b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani List<UserInfo> list = mUserManager.getUsers(); 1004b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani 1014b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani for (UserInfo user : list) { 1024b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani if (user.id == id) { 1034b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani return true; 1044b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 1054b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 1064b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani return false; 1074b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani } 1082a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani 1092a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani public void testSerialNumber() { 1102a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo user1 = mUserManager.createUser("User 1", UserInfo.FLAG_RESTRICTED); 1112a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani int serialNumber1 = user1.serialNumber; 1122a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id)); 1132a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1)); 114db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(user1.id); 1152a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani UserInfo user2 = mUserManager.createUser("User 2", UserInfo.FLAG_RESTRICTED); 1162a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani int serialNumber2 = user2.serialNumber; 1172a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani assertFalse(serialNumber1 == serialNumber2); 1182a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id)); 1192a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2)); 120db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(user2.id); 121db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 122db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani 123db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani public void testMaxUsers() { 124db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani int N = UserManager.getMaxSupportedUsers(); 125db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani int count = mUserManager.getUsers().size(); 126db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani List<UserInfo> created = new ArrayList<UserInfo>(); 127db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani // Create as many users as permitted and make sure creation passes 128db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani while (count < N) { 129db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani UserInfo ui = mUserManager.createUser("User " + count, 0); 130db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani assertNotNull(ui); 131db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani created.add(ui); 132db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani count++; 133db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 134db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani // Try to create one more user and make sure it fails 135db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani UserInfo extra = null; 136db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani assertNull(extra = mUserManager.createUser("One more", 0)); 137db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani if (extra != null) { 138db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(extra.id); 139db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 140db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani while (!created.isEmpty()) { 141db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani UserInfo user = created.remove(0); 142db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani removeUser(user.id); 143db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 144db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 145db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani 146e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani public void testRestrictions() { 147e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani List<UserInfo> users = mUserManager.getUsers(); 148e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani if (users.size() > 1) { 149e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani Bundle restrictions = new Bundle(); 15005191053545065c9c71afae173d3ab42a2d947faAmith Yamasani restrictions.putBoolean(UserManager.DISALLOW_INSTALL_APPS, true); 15105191053545065c9c71afae173d3ab42a2d947faAmith Yamasani restrictions.putBoolean(UserManager.DISALLOW_CONFIG_WIFI, false); 15220949a76fee62e89d7dc22858a74469efa14f61dAmith Yamasani mUserManager.setUserRestrictions(restrictions, new UserHandle(users.get(1).id)); 15320949a76fee62e89d7dc22858a74469efa14f61dAmith Yamasani Bundle stored = mUserManager.getUserRestrictions(new UserHandle(users.get(1).id)); 15405191053545065c9c71afae173d3ab42a2d947faAmith Yamasani assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false); 15505191053545065c9c71afae173d3ab42a2d947faAmith Yamasani assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false); 15605191053545065c9c71afae173d3ab42a2d947faAmith Yamasani assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true); 157e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 158e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani } 159e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 160db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani private void removeUser(int userId) { 161db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani synchronized (mUserLock) { 162db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani mUserManager.removeUser(userId); 163db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani while (mUserManager.getUserInfo(userId) != null) { 164db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani try { 165db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani mUserLock.wait(1000); 166db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } catch (InterruptedException ie) { 167db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 168db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 169db6a14cc85cede0769735fdac4da70766989a3ceAmith Yamasani } 1702a00329c6d55c6cd9166e01963d7410e95d80d21Amith Yamasani } 171e4cf73437a18c1444055f88a1fcc0d146ec23ac5Amith Yamasani 1724b2e934928a2eb65927bd39197198c28c49efb94Amith Yamasani} 173