Loading services/core/java/com/android/server/pm/UserManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -4907,6 +4907,11 @@ public class UserManagerService extends IUserManager.Stub { USER_OPERATION_ERROR_UNKNOWN); } } if (isMainUser && getMainUserIdUnchecked() != UserHandle.USER_NULL) { throwCheckedUserOperationException( "Cannot add user with FLAG_MAIN as main user already exists.", UserManager.USER_OPERATION_ERROR_MAX_USERS); } if (!preCreate && !canAddMoreUsersOfType(userTypeDetails)) { throwCheckedUserOperationException( "Cannot add more users of type " + userType Loading services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +32 −2 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import java.io.File; /** * Run as {@code atest FrameworksMockingServicesTests:com.android.server.pm.UserManagerServiceTest} */ Loading Loading @@ -107,6 +109,8 @@ public final class UserManagerServiceTest { .getTargetContext(); private final SparseArray<UserData> mUsers = new SparseArray<>(); private File mTestDir; private Context mSpiedContext; private @Mock PackageManagerService mMockPms; Loading Loading @@ -144,17 +148,23 @@ public final class UserManagerServiceTest { doNothing().when(mSpiedContext).sendBroadcastAsUser(any(), any(), any()); // Must construct UserManagerService in the UiThread mTestDir = new File(mRealContext.getDataDir(), "umstest"); mTestDir.mkdirs(); mUms = new UserManagerService(mSpiedContext, mMockPms, mMockUserDataPreparer, mPackagesLock, mRealContext.getDataDir(), mUsers); mPackagesLock, mTestDir, mUsers); mUmi = LocalServices.getService(UserManagerInternal.class); assertWithMessage("LocalServices.getService(UserManagerInternal.class)").that(mUmi) .isNotNull(); } @After public void resetUserManagerInternal() { public void tearDown() { // LocalServices follows the "Highlander rule" - There can be only one! LocalServices.removeServiceForTest(UserManagerInternal.class); // Clean up test dir to remove persisted user files. assertThat(deleteRecursive(mTestDir)).isTrue(); mUsers.clear(); } @Test Loading Loading @@ -496,6 +506,14 @@ public final class UserManagerServiceTest { @Test public void testMainUser_hasNoCallsOrSMSRestrictionsByDefault() { // Remove the main user so we can add another one for (int i = 0; i < mUsers.size(); i++) { UserData userData = mUsers.valueAt(i); if (userData.info.isMain()) { mUsers.delete(i); break; } } UserInfo mainUser = mUms.createUserWithThrow("main user", USER_TYPE_FULL_SECONDARY, UserInfo.FLAG_FULL | UserInfo.FLAG_MAIN); Loading Loading @@ -621,6 +639,18 @@ public final class UserManagerServiceTest { userData.mLastEnteredForegroundTimeMillis = timeMillis; } public boolean deleteRecursive(File file) { if (file.isDirectory()) { for (File item : file.listFiles()) { boolean success = deleteRecursive(item); if (!success) { return false; } } } return file.delete(); } private static final class TestUserData extends UserData { @SuppressWarnings("deprecation") Loading services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -1565,6 +1565,25 @@ public final class UserManagerTest { assertThat(userInfo.name).isEqualTo(newName); } @Test public void testCannotCreateAdditionalMainUser() { UserHandle mainUser = mUserManager.getMainUser(); assumeTrue("There is no main user", mainUser != null); // Users with FLAG_MAIN can't be removed, so no point using the local createUser method. UserInfo newMainUser = mUserManager.createUser("test", UserInfo.FLAG_MAIN); assertThat(newMainUser).isNull(); List<UserInfo> users = mUserManager.getUsers(); int mainUserCount = 0; for (UserInfo user : users) { if (user.isMain()) { mainUserCount++; } } assertThat(mainUserCount).isEqualTo(1); } private boolean isPackageInstalledForUser(String packageName, int userId) { try { return mPackageManager.getPackageInfoAsUser(packageName, 0, userId) != null; Loading Loading
services/core/java/com/android/server/pm/UserManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -4907,6 +4907,11 @@ public class UserManagerService extends IUserManager.Stub { USER_OPERATION_ERROR_UNKNOWN); } } if (isMainUser && getMainUserIdUnchecked() != UserHandle.USER_NULL) { throwCheckedUserOperationException( "Cannot add user with FLAG_MAIN as main user already exists.", UserManager.USER_OPERATION_ERROR_MAX_USERS); } if (!preCreate && !canAddMoreUsersOfType(userTypeDetails)) { throwCheckedUserOperationException( "Cannot add more users of type " + userType Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +32 −2 Original line number Diff line number Diff line Loading @@ -63,6 +63,8 @@ import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import java.io.File; /** * Run as {@code atest FrameworksMockingServicesTests:com.android.server.pm.UserManagerServiceTest} */ Loading Loading @@ -107,6 +109,8 @@ public final class UserManagerServiceTest { .getTargetContext(); private final SparseArray<UserData> mUsers = new SparseArray<>(); private File mTestDir; private Context mSpiedContext; private @Mock PackageManagerService mMockPms; Loading Loading @@ -144,17 +148,23 @@ public final class UserManagerServiceTest { doNothing().when(mSpiedContext).sendBroadcastAsUser(any(), any(), any()); // Must construct UserManagerService in the UiThread mTestDir = new File(mRealContext.getDataDir(), "umstest"); mTestDir.mkdirs(); mUms = new UserManagerService(mSpiedContext, mMockPms, mMockUserDataPreparer, mPackagesLock, mRealContext.getDataDir(), mUsers); mPackagesLock, mTestDir, mUsers); mUmi = LocalServices.getService(UserManagerInternal.class); assertWithMessage("LocalServices.getService(UserManagerInternal.class)").that(mUmi) .isNotNull(); } @After public void resetUserManagerInternal() { public void tearDown() { // LocalServices follows the "Highlander rule" - There can be only one! LocalServices.removeServiceForTest(UserManagerInternal.class); // Clean up test dir to remove persisted user files. assertThat(deleteRecursive(mTestDir)).isTrue(); mUsers.clear(); } @Test Loading Loading @@ -496,6 +506,14 @@ public final class UserManagerServiceTest { @Test public void testMainUser_hasNoCallsOrSMSRestrictionsByDefault() { // Remove the main user so we can add another one for (int i = 0; i < mUsers.size(); i++) { UserData userData = mUsers.valueAt(i); if (userData.info.isMain()) { mUsers.delete(i); break; } } UserInfo mainUser = mUms.createUserWithThrow("main user", USER_TYPE_FULL_SECONDARY, UserInfo.FLAG_FULL | UserInfo.FLAG_MAIN); Loading Loading @@ -621,6 +639,18 @@ public final class UserManagerServiceTest { userData.mLastEnteredForegroundTimeMillis = timeMillis; } public boolean deleteRecursive(File file) { if (file.isDirectory()) { for (File item : file.listFiles()) { boolean success = deleteRecursive(item); if (!success) { return false; } } } return file.delete(); } private static final class TestUserData extends UserData { @SuppressWarnings("deprecation") Loading
services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -1565,6 +1565,25 @@ public final class UserManagerTest { assertThat(userInfo.name).isEqualTo(newName); } @Test public void testCannotCreateAdditionalMainUser() { UserHandle mainUser = mUserManager.getMainUser(); assumeTrue("There is no main user", mainUser != null); // Users with FLAG_MAIN can't be removed, so no point using the local createUser method. UserInfo newMainUser = mUserManager.createUser("test", UserInfo.FLAG_MAIN); assertThat(newMainUser).isNull(); List<UserInfo> users = mUserManager.getUsers(); int mainUserCount = 0; for (UserInfo user : users) { if (user.isMain()) { mainUserCount++; } } assertThat(mainUserCount).isEqualTo(1); } private boolean isPackageInstalledForUser(String packageName, int userId) { try { return mPackageManager.getPackageInfoAsUser(packageName, 0, userId) != null; Loading