• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.server.pm;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static com.google.common.truth.Truth.assertWithMessage;
21 
22 import static org.junit.Assert.fail;
23 import static org.junit.Assume.assumeTrue;
24 import static org.testng.Assert.assertThrows;
25 
26 import android.annotation.UserIdInt;
27 import android.app.ActivityManager;
28 import android.content.BroadcastReceiver;
29 import android.content.Context;
30 import android.content.Intent;
31 import android.content.IntentFilter;
32 import android.content.pm.PackageManager;
33 import android.content.pm.UserInfo;
34 import android.content.res.Resources;
35 import android.os.Bundle;
36 import android.os.UserHandle;
37 import android.os.UserManager;
38 import android.platform.test.annotations.Postsubmit;
39 import android.provider.Settings;
40 import android.test.suitebuilder.annotation.LargeTest;
41 import android.test.suitebuilder.annotation.MediumTest;
42 import android.util.Slog;
43 
44 import androidx.annotation.Nullable;
45 import androidx.test.InstrumentationRegistry;
46 import androidx.test.filters.SmallTest;
47 import androidx.test.runner.AndroidJUnit4;
48 
49 import com.google.common.collect.Range;
50 
51 import org.junit.After;
52 import org.junit.Before;
53 import org.junit.Test;
54 import org.junit.runner.RunWith;
55 
56 import java.util.ArrayList;
57 import java.util.List;
58 import java.util.concurrent.ExecutorService;
59 import java.util.concurrent.Executors;
60 import java.util.concurrent.TimeUnit;
61 import java.util.concurrent.atomic.AtomicInteger;
62 import java.util.stream.Collectors;
63 
64 import javax.annotation.concurrent.GuardedBy;
65 
66 /** Test {@link UserManager} functionality. */
67 @Postsubmit
68 @RunWith(AndroidJUnit4.class)
69 public final class UserManagerTest {
70     // Taken from UserManagerService
71     private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // 30 years
72 
73     private static final int REMOVE_CHECK_INTERVAL_MILLIS = 500; // 0.5 seconds
74     private static final int REMOVE_TIMEOUT_MILLIS = 60 * 1000; // 60 seconds
75     private static final int SWITCH_USER_TIMEOUT_MILLIS = 40 * 1000; // 40 seconds
76 
77     // Packages which are used during tests.
78     private static final String[] PACKAGES = new String[] {
79             "com.android.egg",
80             "com.google.android.webview"
81     };
82     private static final String TAG = UserManagerTest.class.getSimpleName();
83 
84     private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
85 
86     private final Object mUserRemoveLock = new Object();
87     private final Object mUserSwitchLock = new Object();
88 
89     private UserManager mUserManager = null;
90     private PackageManager mPackageManager;
91     private List<Integer> usersToRemove;
92 
93     @Before
setUp()94     public void setUp() throws Exception {
95         mUserManager = UserManager.get(mContext);
96         mPackageManager = mContext.getPackageManager();
97 
98         IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
99         filter.addAction(Intent.ACTION_USER_SWITCHED);
100         mContext.registerReceiver(new BroadcastReceiver() {
101             @Override
102             public void onReceive(Context context, Intent intent) {
103                 switch (intent.getAction()) {
104                     case Intent.ACTION_USER_REMOVED:
105                         synchronized (mUserRemoveLock) {
106                             mUserRemoveLock.notifyAll();
107                         }
108                         break;
109                     case Intent.ACTION_USER_SWITCHED:
110                         synchronized (mUserSwitchLock) {
111                             mUserSwitchLock.notifyAll();
112                         }
113                         break;
114                 }
115             }
116         }, filter);
117 
118         removeExistingUsers();
119         usersToRemove = new ArrayList<>();
120     }
121 
122     @After
tearDown()123     public void tearDown() throws Exception {
124         for (Integer userId : usersToRemove) {
125             removeUser(userId);
126         }
127     }
128 
removeExistingUsers()129     private void removeExistingUsers() {
130         int currentUser = ActivityManager.getCurrentUser();
131         List<UserInfo> list = mUserManager.getUsers();
132         for (UserInfo user : list) {
133             // Keep system and current user
134             if (user.id != UserHandle.USER_SYSTEM && user.id != currentUser) {
135                 removeUser(user.id);
136             }
137         }
138     }
139 
140     @SmallTest
141     @Test
testHasSystemUser()142     public void testHasSystemUser() throws Exception {
143         assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue();
144     }
145 
146     @MediumTest
147     @Test
testAddGuest()148     public void testAddGuest() throws Exception {
149         UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
150         assertThat(userInfo).isNotNull();
151 
152         List<UserInfo> list = mUserManager.getUsers();
153         for (UserInfo user : list) {
154             if (user.id == userInfo.id && user.name.equals("Guest 1")
155                     && user.isGuest()
156                     && !user.isAdmin()
157                     && !user.isPrimary()) {
158                 return;
159             }
160         }
161         fail("Didn't find a guest: " + list);
162     }
163 
164     @Test
testCloneUser()165     public void testCloneUser() throws Exception {
166         // Test that only one clone user can be created
167         final int primaryUserId = mUserManager.getPrimaryUser().id;
168         UserInfo userInfo = createProfileForUser("Clone user1",
169                 UserManager.USER_TYPE_PROFILE_CLONE,
170                 primaryUserId);
171         assertThat(userInfo).isNotNull();
172         UserInfo userInfo2 = createProfileForUser("Clone user2",
173                 UserManager.USER_TYPE_PROFILE_CLONE,
174                 primaryUserId);
175         assertThat(userInfo2).isNull();
176 
177         final Context userContext = mContext.createPackageContextAsUser("system", 0,
178                 UserHandle.of(userInfo.id));
179         assertThat(userContext.getSystemService(
180                 UserManager.class).isMediaSharedWithParent()).isTrue();
181 
182         List<UserInfo> list = mUserManager.getUsers();
183         List<UserInfo> cloneUsers = list.stream().filter(
184                 user -> (user.id == userInfo.id && user.name.equals("Clone user1")
185                         && user.isCloneProfile()))
186                 .collect(Collectors.toList());
187         assertThat(cloneUsers.size()).isEqualTo(1);
188 
189         // Verify clone user parent
190         assertThat(mUserManager.getProfileParent(primaryUserId)).isNull();
191         UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
192         assertThat(parentProfileInfo).isNotNull();
193         assertThat(primaryUserId).isEqualTo(parentProfileInfo.id);
194         removeUser(userInfo.id);
195         assertThat(mUserManager.getProfileParent(primaryUserId)).isNull();
196     }
197 
198     @MediumTest
199     @Test
testAdd2Users()200     public void testAdd2Users() throws Exception {
201         UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
202         UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN);
203 
204         assertThat(user1).isNotNull();
205         assertThat(user2).isNotNull();
206 
207         assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue();
208         assertThat(hasUser(user1.id)).isTrue();
209         assertThat(hasUser(user2.id)).isTrue();
210     }
211 
212     /**
213      * Tests that UserManager knows how many users can be created.
214      *
215      * We can only test this with regular secondary users, since some other user types have weird
216      * rules about when or if they count towards the max.
217      */
218     @MediumTest
219     @Test
testAddTooManyUsers()220     public void testAddTooManyUsers() throws Exception {
221         final String userType = UserManager.USER_TYPE_FULL_SECONDARY;
222         final UserTypeDetails userTypeDetails = UserTypeFactory.getUserTypes().get(userType);
223 
224         final int maxUsersForType = userTypeDetails.getMaxAllowed();
225         final int maxUsersOverall = UserManager.getMaxSupportedUsers();
226 
227         int currentUsersOfType = 0;
228         int currentUsersOverall = 0;
229         final List<UserInfo> userList = mUserManager.getAliveUsers();
230         for (UserInfo user : userList) {
231             currentUsersOverall++;
232             if (userType.equals(user.userType)) {
233                 currentUsersOfType++;
234             }
235         }
236 
237         final int remainingUserType = maxUsersForType == UserTypeDetails.UNLIMITED_NUMBER_OF_USERS ?
238                 Integer.MAX_VALUE : maxUsersForType - currentUsersOfType;
239         final int remainingOverall = maxUsersOverall - currentUsersOverall;
240         final int remaining = Math.min(remainingUserType, remainingOverall);
241 
242         Slog.v(TAG, "maxUsersForType=" + maxUsersForType
243                 + ", maxUsersOverall=" + maxUsersOverall
244                 + ", currentUsersOfType=" + currentUsersOfType
245                 + ", currentUsersOverall=" + currentUsersOverall
246                 + ", remaining=" + remaining);
247 
248         assumeTrue("Device supports too many users for this test to be practical", remaining < 20);
249 
250         int usersAdded;
251         for (usersAdded = 0; usersAdded < remaining; usersAdded++) {
252             Slog.v(TAG, "Adding user " + usersAdded);
253             assertThat(mUserManager.canAddMoreUsers()).isTrue();
254             assertThat(mUserManager.canAddMoreUsers(userType)).isTrue();
255 
256             final UserInfo user = createUser("User " + usersAdded, userType, 0);
257             assertThat(user).isNotNull();
258             assertThat(hasUser(user.id)).isTrue();
259         }
260         Slog.v(TAG, "Added " + usersAdded + " users.");
261 
262         assertWithMessage("Still thinks more users of that type can be added")
263                 .that(mUserManager.canAddMoreUsers(userType)).isFalse();
264         if (currentUsersOverall + usersAdded >= maxUsersOverall) {
265             assertThat(mUserManager.canAddMoreUsers()).isFalse();
266         }
267 
268         assertThat(createUser("User beyond", userType, 0)).isNull();
269     }
270 
271     @MediumTest
272     @Test
testRemoveUser()273     public void testRemoveUser() throws Exception {
274         UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
275         removeUser(userInfo.id);
276 
277         assertThat(hasUser(userInfo.id)).isFalse();
278     }
279 
280     @MediumTest
281     @Test
testRemoveUserByHandle()282     public void testRemoveUserByHandle() {
283         UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
284         final UserHandle user = userInfo.getUserHandle();
285         synchronized (mUserRemoveLock) {
286             mUserManager.removeUser(user);
287             long time = System.currentTimeMillis();
288             while (mUserManager.getUserInfo(user.getIdentifier()) != null) {
289                 try {
290                     mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS);
291                 } catch (InterruptedException ie) {
292                     Thread.currentThread().interrupt();
293                     return;
294                 }
295                 if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) {
296                     fail("Timeout waiting for removeUser. userId = " + user.getIdentifier());
297                 }
298             }
299         }
300 
301         assertThat(hasUser(userInfo.id)).isFalse();
302     }
303 
304     @MediumTest
305     @Test
testRemoveUserByHandle_ThrowsException()306     public void testRemoveUserByHandle_ThrowsException() {
307         assertThrows(IllegalArgumentException.class, () -> mUserManager.removeUser(null));
308     }
309 
310     @MediumTest
311     @Test
testRemoveUserWhenPossible_restrictedReturnsError()312     public void testRemoveUserWhenPossible_restrictedReturnsError() throws Exception {
313         final int currentUser = ActivityManager.getCurrentUser();
314         final UserInfo user1 = createUser("User 1", /* flags= */ 0);
315         mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true,
316                 asHandle(currentUser));
317         try {
318             assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(),
319                     /* overrideDevicePolicy= */ false))
320                             .isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_RESTRICTION);
321         } finally {
322             mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false,
323                     asHandle(currentUser));
324         }
325 
326         assertThat(hasUser(user1.id)).isTrue();
327         assertThat(getUser(user1.id).isEphemeral()).isFalse();
328     }
329 
330     @MediumTest
331     @Test
testRemoveUserWhenPossible_evenWhenRestricted()332     public void testRemoveUserWhenPossible_evenWhenRestricted() throws Exception {
333         final int currentUser = ActivityManager.getCurrentUser();
334         final UserInfo user1 = createUser("User 1", /* flags= */ 0);
335         mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true,
336                 asHandle(currentUser));
337         try {
338             synchronized (mUserRemoveLock) {
339                 assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(),
340                         /* overrideDevicePolicy= */ true))
341                                 .isEqualTo(UserManager.REMOVE_RESULT_REMOVED);
342                 waitForUserRemovalLocked(user1.id);
343             }
344 
345         } finally {
346             mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false,
347                     asHandle(currentUser));
348         }
349 
350         assertThat(hasUser(user1.id)).isFalse();
351     }
352 
353     @MediumTest
354     @Test
testRemoveUserWhenPossible_systemUserReturnsError()355     public void testRemoveUserWhenPossible_systemUserReturnsError() throws Exception {
356         assertThat(mUserManager.removeUserWhenPossible(UserHandle.SYSTEM,
357                 /* overrideDevicePolicy= */ false))
358                         .isEqualTo(UserManager.REMOVE_RESULT_ERROR_SYSTEM_USER);
359 
360         assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue();
361     }
362 
363     @MediumTest
364     @Test
testRemoveUserWhenPossible_invalidUserReturnsError()365     public void testRemoveUserWhenPossible_invalidUserReturnsError() throws Exception {
366         assertThat(hasUser(Integer.MAX_VALUE)).isFalse();
367         assertThat(mUserManager.removeUserWhenPossible(UserHandle.of(Integer.MAX_VALUE),
368                 /* overrideDevicePolicy= */ false))
369                         .isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_NOT_FOUND);
370     }
371 
372     @MediumTest
373     @Test
testRemoveUserWhenPossible_currentUserSetEphemeral()374     public void testRemoveUserWhenPossible_currentUserSetEphemeral() throws Exception {
375         final int startUser = ActivityManager.getCurrentUser();
376         final UserInfo user1 = createUser("User 1", /* flags= */ 0);
377         // Switch to the user just created.
378         switchUser(user1.id, null, /* ignoreHandle= */ true);
379 
380         assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(),
381                 /* overrideDevicePolicy= */ false)).isEqualTo(UserManager.REMOVE_RESULT_DEFERRED);
382 
383         assertThat(hasUser(user1.id)).isTrue();
384         assertThat(getUser(user1.id).isEphemeral()).isTrue();
385 
386         // Switch back to the starting user.
387         switchUser(startUser, null, /* ignoreHandle= */ true);
388 
389         // User is removed once switch is complete
390         synchronized (mUserRemoveLock) {
391             waitForUserRemovalLocked(user1.id);
392         }
393         assertThat(hasUser(user1.id)).isFalse();
394     }
395 
396     @MediumTest
397     @Test
testRemoveUserWhenPossible_nonCurrentUserRemoved()398     public void testRemoveUserWhenPossible_nonCurrentUserRemoved() throws Exception {
399         final UserInfo user1 = createUser("User 1", /* flags= */ 0);
400         synchronized (mUserRemoveLock) {
401             assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(),
402                     /* overrideDevicePolicy= */ false))
403                             .isEqualTo(UserManager.REMOVE_RESULT_REMOVED);
404             waitForUserRemovalLocked(user1.id);
405         }
406 
407         assertThat(hasUser(user1.id)).isFalse();
408     }
409 
410     /** Tests creating a FULL user via specifying userType. */
411     @MediumTest
412     @Test
testCreateUserViaTypes()413     public void testCreateUserViaTypes() throws Exception {
414         createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_GUEST,
415                 UserInfo.FLAG_GUEST | UserInfo.FLAG_FULL);
416 
417         createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_DEMO,
418                 UserInfo.FLAG_DEMO | UserInfo.FLAG_FULL);
419 
420         createUserWithTypeAndCheckFlags(UserManager.USER_TYPE_FULL_SECONDARY,
421                 UserInfo.FLAG_FULL);
422     }
423 
424     /** Tests creating a FULL user via specifying user flags. */
425     @MediumTest
426     @Test
testCreateUserViaFlags()427     public void testCreateUserViaFlags() throws Exception {
428         createUserWithFlagsAndCheckType(UserInfo.FLAG_GUEST, UserManager.USER_TYPE_FULL_GUEST,
429                 UserInfo.FLAG_FULL);
430 
431         createUserWithFlagsAndCheckType(0, UserManager.USER_TYPE_FULL_SECONDARY,
432                 UserInfo.FLAG_FULL);
433 
434         createUserWithFlagsAndCheckType(UserInfo.FLAG_FULL, UserManager.USER_TYPE_FULL_SECONDARY,
435                 0);
436 
437         createUserWithFlagsAndCheckType(UserInfo.FLAG_DEMO, UserManager.USER_TYPE_FULL_DEMO,
438                 UserInfo.FLAG_FULL);
439     }
440 
441     /** Creates a user of the given user type and checks that the result has the requiredFlags. */
createUserWithTypeAndCheckFlags(String userType, @UserIdInt int requiredFlags)442     private void createUserWithTypeAndCheckFlags(String userType,
443             @UserIdInt int requiredFlags) {
444         final UserInfo userInfo = createUser("Name", userType, 0);
445         assertWithMessage("Wrong user type").that(userInfo.userType).isEqualTo(userType);
446         assertWithMessage("Flags %s did not contain expected %s", userInfo.flags, requiredFlags)
447                 .that(userInfo.flags & requiredFlags).isEqualTo(requiredFlags);
448         removeUser(userInfo.id);
449     }
450 
451     /**
452      * Creates a user of the given flags and checks that the result is of the expectedUserType type
453      * and that it has the expected flags (including both flags and any additionalRequiredFlags).
454      */
createUserWithFlagsAndCheckType(@serIdInt int flags, String expectedUserType, @UserIdInt int additionalRequiredFlags)455     private void createUserWithFlagsAndCheckType(@UserIdInt int flags, String expectedUserType,
456             @UserIdInt int additionalRequiredFlags) {
457         final UserInfo userInfo = createUser("Name", flags);
458         assertWithMessage("Wrong user type").that(userInfo.userType).isEqualTo(expectedUserType);
459         additionalRequiredFlags |= flags;
460         assertWithMessage("Flags %s did not contain expected %s", userInfo.flags,
461                 additionalRequiredFlags).that(userInfo.flags & additionalRequiredFlags)
462                         .isEqualTo(additionalRequiredFlags);
463         removeUser(userInfo.id);
464     }
465 
466 
467     @MediumTest
468     @Test
testThereCanBeOnlyOneGuest()469     public void testThereCanBeOnlyOneGuest() throws Exception {
470         UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
471         assertThat(userInfo1).isNotNull();
472         UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST);
473         assertThat(userInfo2).isNull();
474     }
475 
476     @MediumTest
477     @Test
testFindExistingGuest_guestExists()478     public void testFindExistingGuest_guestExists() throws Exception {
479         UserInfo userInfo1 = createUser("Guest", UserInfo.FLAG_GUEST);
480         assertThat(userInfo1).isNotNull();
481         UserInfo foundGuest = mUserManager.findCurrentGuestUser();
482         assertThat(foundGuest).isNotNull();
483     }
484 
485     @SmallTest
486     @Test
testFindExistingGuest_guestDoesNotExist()487     public void testFindExistingGuest_guestDoesNotExist() throws Exception {
488         UserInfo foundGuest = mUserManager.findCurrentGuestUser();
489         assertThat(foundGuest).isNull();
490     }
491 
492     @MediumTest
493     @Test
testSetUserAdmin()494     public void testSetUserAdmin() throws Exception {
495         UserInfo userInfo = createUser("SecondaryUser", /*flags=*/ 0);
496         assertThat(userInfo.isAdmin()).isFalse();
497 
498         mUserManager.setUserAdmin(userInfo.id);
499 
500         userInfo = mUserManager.getUserInfo(userInfo.id);
501         assertThat(userInfo.isAdmin()).isTrue();
502     }
503 
504     @MediumTest
505     @Test
testGetProfileParent()506     public void testGetProfileParent() throws Exception {
507         assumeManagedUsersSupported();
508         final int primaryUserId = mUserManager.getPrimaryUser().id;
509 
510         UserInfo userInfo = createProfileForUser("Profile",
511                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
512         assertThat(userInfo).isNotNull();
513         assertThat(mUserManager.getProfileParent(primaryUserId)).isNull();
514         UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
515         assertThat(parentProfileInfo).isNotNull();
516         assertThat(primaryUserId).isEqualTo(parentProfileInfo.id);
517         removeUser(userInfo.id);
518         assertThat(mUserManager.getProfileParent(primaryUserId)).isNull();
519     }
520 
521     /** Test that UserManager returns the correct badge information for a managed profile. */
522     @MediumTest
523     @Test
testProfileTypeInformation()524     public void testProfileTypeInformation() throws Exception {
525         assumeManagedUsersSupported();
526         final UserTypeDetails userTypeDetails =
527                 UserTypeFactory.getUserTypes().get(UserManager.USER_TYPE_PROFILE_MANAGED);
528         assertWithMessage("No %s type on device", UserManager.USER_TYPE_PROFILE_MANAGED)
529                 .that(userTypeDetails).isNotNull();
530         assertThat(userTypeDetails.getName()).isEqualTo(UserManager.USER_TYPE_PROFILE_MANAGED);
531 
532         final int primaryUserId = mUserManager.getPrimaryUser().id;
533         UserInfo userInfo = createProfileForUser("Managed",
534                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
535         assertThat(userInfo).isNotNull();
536         final int userId = userInfo.id;
537 
538         assertThat(mUserManager.hasBadge(userId)).isEqualTo(userTypeDetails.hasBadge());
539         assertThat(mUserManager.getUserIconBadgeResId(userId))
540                 .isEqualTo(userTypeDetails.getIconBadge());
541         assertThat(mUserManager.getUserBadgeResId(userId))
542                 .isEqualTo(userTypeDetails.getBadgePlain());
543         assertThat(mUserManager.getUserBadgeNoBackgroundResId(userId))
544                 .isEqualTo(userTypeDetails.getBadgeNoBackground());
545 
546         final int badgeIndex = userInfo.profileBadge;
547         assertThat(mUserManager.getUserBadgeColor(userId)).isEqualTo(
548                 Resources.getSystem().getColor(userTypeDetails.getBadgeColor(badgeIndex), null));
549         assertThat(mUserManager.getUserBadgeDarkColor(userId)).isEqualTo(
550                 Resources.getSystem().getColor(userTypeDetails.getDarkThemeBadgeColor(badgeIndex),
551                         null));
552 
553         assertThat(mUserManager.getBadgedLabelForUser("Test", asHandle(userId))).isEqualTo(
554                 Resources.getSystem().getString(userTypeDetails.getBadgeLabel(badgeIndex), "Test"));
555 
556         // Test @UserHandleAware methods
557         final UserManager userManagerForUser = UserManager.get(mContext.createPackageContextAsUser(
558                 "android", 0, asHandle(userId)));
559         assertThat(userManagerForUser.isUserOfType(userTypeDetails.getName())).isTrue();
560         assertThat(userManagerForUser.isProfile()).isEqualTo(userTypeDetails.isProfile());
561     }
562 
563     // Make sure only max managed profiles can be created
564     @MediumTest
565     @Test
testAddManagedProfile()566     public void testAddManagedProfile() throws Exception {
567         assumeManagedUsersSupported();
568         final int primaryUserId = mUserManager.getPrimaryUser().id;
569         UserInfo userInfo1 = createProfileForUser("Managed 1",
570                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
571         UserInfo userInfo2 = createProfileForUser("Managed 2",
572                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
573 
574         assertThat(userInfo1).isNotNull();
575         assertThat(userInfo2).isNull();
576 
577         assertThat(userInfo1.userType).isEqualTo(UserManager.USER_TYPE_PROFILE_MANAGED);
578         int requiredFlags = UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_PROFILE;
579         assertWithMessage("Wrong flags %s", userInfo1.flags).that(userInfo1.flags & requiredFlags)
580                 .isEqualTo(requiredFlags);
581 
582         // Verify that current user is not a managed profile
583         assertThat(mUserManager.isManagedProfile()).isFalse();
584     }
585 
586     // Verify that disallowed packages are not installed in the managed profile.
587     @MediumTest
588     @Test
testAddManagedProfile_withDisallowedPackages()589     public void testAddManagedProfile_withDisallowedPackages() throws Exception {
590         assumeManagedUsersSupported();
591         final int primaryUserId = mUserManager.getPrimaryUser().id;
592         UserInfo userInfo1 = createProfileForUser("Managed1",
593                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
594         // Verify that the packagesToVerify are installed by default.
595         for (String pkg : PACKAGES) {
596             if (!mPackageManager.isPackageAvailable(pkg)) {
597                 Slog.w(TAG, "Package is not available " + pkg);
598                 continue;
599             }
600 
601             assertWithMessage("Package should be installed in managed profile: %s", pkg)
602                     .that(isPackageInstalledForUser(pkg, userInfo1.id)).isTrue();
603         }
604         removeUser(userInfo1.id);
605 
606         UserInfo userInfo2 = createProfileForUser("Managed2",
607                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId, PACKAGES);
608         // Verify that the packagesToVerify are not installed by default.
609         for (String pkg : PACKAGES) {
610             if (!mPackageManager.isPackageAvailable(pkg)) {
611                 Slog.w(TAG, "Package is not available " + pkg);
612                 continue;
613             }
614 
615             assertWithMessage(
616                     "Package should not be installed in managed profile when disallowed: %s", pkg)
617                             .that(isPackageInstalledForUser(pkg, userInfo2.id)).isFalse();
618         }
619     }
620 
621     // Verify that if any packages are disallowed to install during creation of managed profile can
622     // still be installed later.
623     @MediumTest
624     @Test
testAddManagedProfile_disallowedPackagesInstalledLater()625     public void testAddManagedProfile_disallowedPackagesInstalledLater() throws Exception {
626         assumeManagedUsersSupported();
627         final int primaryUserId = mUserManager.getPrimaryUser().id;
628         UserInfo userInfo = createProfileForUser("Managed",
629                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId, PACKAGES);
630         // Verify that the packagesToVerify are not installed by default.
631         for (String pkg : PACKAGES) {
632             if (!mPackageManager.isPackageAvailable(pkg)) {
633                 Slog.w(TAG, "Package is not available " + pkg);
634                 continue;
635             }
636 
637             assertWithMessage("Pkg should not be installed in managed profile when disallowed: %s",
638                     pkg).that(isPackageInstalledForUser(pkg, userInfo.id)).isFalse();
639         }
640 
641         // Verify that the disallowed packages during profile creation can be installed now.
642         for (String pkg : PACKAGES) {
643             if (!mPackageManager.isPackageAvailable(pkg)) {
644                 Slog.w(TAG, "Package is not available " + pkg);
645                 continue;
646             }
647 
648             assertWithMessage("Package could not be installed: %s", pkg)
649                     .that(mPackageManager.installExistingPackageAsUser(pkg, userInfo.id))
650                     .isEqualTo(PackageManager.INSTALL_SUCCEEDED);
651         }
652     }
653 
654     // Make sure createUser would fail if we have DISALLOW_ADD_USER.
655     @MediumTest
656     @Test
testCreateUser_disallowAddUser()657     public void testCreateUser_disallowAddUser() throws Exception {
658         final int creatorId = ActivityManager.getCurrentUser();
659         final UserHandle creatorHandle = asHandle(creatorId);
660         mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, creatorHandle);
661         try {
662             UserInfo createadInfo = createUser("SecondaryUser", /*flags=*/ 0);
663             assertThat(createadInfo).isNull();
664         } finally {
665             mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false,
666                     creatorHandle);
667         }
668     }
669 
670     // Make sure createProfile would fail if we have DISALLOW_ADD_CLONE_PROFILE.
671     @MediumTest
672     @Test
testCreateUser_disallowAddClonedUserProfile()673     public void testCreateUser_disallowAddClonedUserProfile() throws Exception {
674         final int primaryUserId = ActivityManager.getCurrentUser();
675         final UserHandle primaryUserHandle = asHandle(primaryUserId);
676         mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE,
677                 true, primaryUserHandle);
678         try {
679             UserInfo cloneProfileUserInfo = createProfileForUser("Clone",
680                     UserManager.USER_TYPE_PROFILE_CLONE, primaryUserId);
681             assertThat(cloneProfileUserInfo).isNull();
682         } finally {
683             mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, false,
684                     primaryUserHandle);
685         }
686     }
687 
688     // Make sure createProfile would fail if we have DISALLOW_ADD_MANAGED_PROFILE.
689     @MediumTest
690     @Test
testCreateProfileForUser_disallowAddManagedProfile()691     public void testCreateProfileForUser_disallowAddManagedProfile() throws Exception {
692         assumeManagedUsersSupported();
693         final int primaryUserId = mUserManager.getPrimaryUser().id;
694         final UserHandle primaryUserHandle = asHandle(primaryUserId);
695         mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, true,
696                 primaryUserHandle);
697         try {
698             UserInfo userInfo = createProfileForUser("Managed",
699                     UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
700             assertThat(userInfo).isNull();
701         } finally {
702             mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, false,
703                     primaryUserHandle);
704         }
705     }
706 
707     // Make sure createProfileEvenWhenDisallowedForUser bypass DISALLOW_ADD_MANAGED_PROFILE.
708     @MediumTest
709     @Test
testCreateProfileForUserEvenWhenDisallowed()710     public void testCreateProfileForUserEvenWhenDisallowed() throws Exception {
711         assumeManagedUsersSupported();
712         final int primaryUserId = mUserManager.getPrimaryUser().id;
713         final UserHandle primaryUserHandle = asHandle(primaryUserId);
714         mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, true,
715                 primaryUserHandle);
716         try {
717             UserInfo userInfo = createProfileEvenWhenDisallowedForUser("Managed",
718                     UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
719             assertThat(userInfo).isNotNull();
720         } finally {
721             mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, false,
722                     primaryUserHandle);
723         }
724     }
725 
726     // createProfile succeeds even if DISALLOW_ADD_USER is set
727     @MediumTest
728     @Test
testCreateProfileForUser_disallowAddUser()729     public void testCreateProfileForUser_disallowAddUser() throws Exception {
730         assumeManagedUsersSupported();
731         final int primaryUserId = mUserManager.getPrimaryUser().id;
732         final UserHandle primaryUserHandle = asHandle(primaryUserId);
733         mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, primaryUserHandle);
734         try {
735             UserInfo userInfo = createProfileForUser("Managed",
736                     UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
737             assertThat(userInfo).isNotNull();
738         } finally {
739             mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, false,
740                     primaryUserHandle);
741         }
742     }
743 
744     @MediumTest
745     @Test
testAddRestrictedProfile()746     public void testAddRestrictedProfile() throws Exception {
747         if (isAutomotive()) return;
748         assertWithMessage("There should be no associated restricted profiles before the test")
749                 .that(mUserManager.hasRestrictedProfiles()).isFalse();
750         UserInfo userInfo = createRestrictedProfile("Profile");
751         assertThat(userInfo).isNotNull();
752 
753         Bundle restrictions = mUserManager.getUserRestrictions(UserHandle.of(userInfo.id));
754         assertWithMessage(
755                 "Restricted profile should have DISALLOW_MODIFY_ACCOUNTS restriction by default")
756                         .that(restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS))
757                         .isTrue();
758         assertWithMessage(
759                 "Restricted profile should have DISALLOW_SHARE_LOCATION restriction by default")
760                         .that(restrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION))
761                         .isTrue();
762 
763         int locationMode = Settings.Secure.getIntForUser(mContext.getContentResolver(),
764                 Settings.Secure.LOCATION_MODE,
765                 Settings.Secure.LOCATION_MODE_HIGH_ACCURACY,
766                 userInfo.id);
767         assertWithMessage("Restricted profile should have setting LOCATION_MODE set to "
768                 + "LOCATION_MODE_OFF by default").that(locationMode)
769                         .isEqualTo(Settings.Secure.LOCATION_MODE_OFF);
770 
771         assertWithMessage("Newly created profile should be associated with the current user")
772                 .that(mUserManager.hasRestrictedProfiles()).isTrue();
773     }
774 
775     @MediumTest
776     @Test
testGetManagedProfileCreationTime()777     public void testGetManagedProfileCreationTime() throws Exception {
778         assumeManagedUsersSupported();
779         final int primaryUserId = mUserManager.getPrimaryUser().id;
780         final long startTime = System.currentTimeMillis();
781         UserInfo profile = createProfileForUser("Managed 1",
782                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
783         final long endTime = System.currentTimeMillis();
784         assertThat(profile).isNotNull();
785         if (System.currentTimeMillis() > EPOCH_PLUS_30_YEARS) {
786             assertWithMessage("creationTime must be set when the profile is created")
787                     .that(profile.creationTime).isIn(Range.closed(startTime, endTime));
788         } else {
789             assertWithMessage("creationTime must be 0 if the time is not > EPOCH_PLUS_30_years")
790                     .that(profile.creationTime).isEqualTo(0);
791         }
792         assertThat(mUserManager.getUserCreationTime(asHandle(profile.id)))
793                 .isEqualTo(profile.creationTime);
794 
795         long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime;
796         assertThat(mUserManager.getUserCreationTime(asHandle(primaryUserId)))
797             .isEqualTo(ownerCreationTime);
798     }
799 
800     @MediumTest
801     @Test
testGetUserCreationTime()802     public void testGetUserCreationTime() throws Exception {
803         long startTime = System.currentTimeMillis();
804         UserInfo user = createUser("User", /* flags= */ 0);
805         long endTime = System.currentTimeMillis();
806         assertThat(user).isNotNull();
807         assertWithMessage("creationTime must be set when the user is created")
808             .that(user.creationTime).isIn(Range.closed(startTime, endTime));
809     }
810 
811     @SmallTest
812     @Test
testGetUserCreationTime_nonExistentUser()813     public void testGetUserCreationTime_nonExistentUser() throws Exception {
814         int noSuchUserId = 100500;
815         assertThrows(SecurityException.class,
816                 () -> mUserManager.getUserCreationTime(asHandle(noSuchUserId)));
817     }
818 
819     @SmallTest
820     @Test
testGetUserCreationTime_otherUser()821     public void testGetUserCreationTime_otherUser() throws Exception {
822         UserInfo user = createUser("User 1", 0);
823         assertThat(user).isNotNull();
824         assertThrows(SecurityException.class,
825                 () -> mUserManager.getUserCreationTime(asHandle(user.id)));
826     }
827 
828     @Nullable
getUser(int id)829     private UserInfo getUser(int id) {
830         List<UserInfo> list = mUserManager.getUsers();
831 
832         for (UserInfo user : list) {
833             if (user.id == id) {
834                 return user;
835             }
836         }
837         return null;
838     }
839 
hasUser(int id)840     private boolean hasUser(int id) {
841         return getUser(id) != null;
842     }
843 
844     @MediumTest
845     @Test
testSerialNumber()846     public void testSerialNumber() {
847         UserInfo user1 = createUser("User 1", 0);
848         int serialNumber1 = user1.serialNumber;
849         assertThat(mUserManager.getUserSerialNumber(user1.id)).isEqualTo(serialNumber1);
850         assertThat(mUserManager.getUserHandle(serialNumber1)).isEqualTo(user1.id);
851         UserInfo user2 = createUser("User 2", 0);
852         int serialNumber2 = user2.serialNumber;
853         assertThat(serialNumber1 == serialNumber2).isFalse();
854         assertThat(mUserManager.getUserSerialNumber(user2.id)).isEqualTo(serialNumber2);
855         assertThat(mUserManager.getUserHandle(serialNumber2)).isEqualTo(user2.id);
856     }
857 
858     @MediumTest
859     @Test
testGetSerialNumbersOfUsers()860     public void testGetSerialNumbersOfUsers() {
861         UserInfo user1 = createUser("User 1", 0);
862         UserInfo user2 = createUser("User 2", 0);
863         long[] serialNumbersOfUsers = mUserManager.getSerialNumbersOfUsers(false);
864         assertThat(serialNumbersOfUsers).asList().containsAtLeast(
865                 (long) user1.serialNumber, (long) user2.serialNumber);
866     }
867 
868     @MediumTest
869     @Test
testMaxUsers()870     public void testMaxUsers() {
871         int N = UserManager.getMaxSupportedUsers();
872         int count = mUserManager.getUsers().size();
873         // Create as many users as permitted and make sure creation passes
874         while (count < N) {
875             UserInfo ui = createUser("User " + count, 0);
876             assertThat(ui).isNotNull();
877             count++;
878         }
879         // Try to create one more user and make sure it fails
880         UserInfo extra = createUser("One more", 0);
881         assertThat(extra).isNull();
882     }
883 
884     @MediumTest
885     @Test
testGetUserCount()886     public void testGetUserCount() {
887         int count = mUserManager.getUsers().size();
888         UserInfo user1 = createUser("User 1", 0);
889         assertThat(user1).isNotNull();
890         UserInfo user2 = createUser("User 2", 0);
891         assertThat(user2).isNotNull();
892         assertThat(mUserManager.getUserCount()).isEqualTo(count + 2);
893     }
894 
895     @MediumTest
896     @Test
testRestrictions()897     public void testRestrictions() {
898         UserInfo testUser = createUser("User 1", 0);
899 
900         mUserManager.setUserRestriction(
901                 UserManager.DISALLOW_INSTALL_APPS, true, asHandle(testUser.id));
902         mUserManager.setUserRestriction(
903                 UserManager.DISALLOW_CONFIG_WIFI, false, asHandle(testUser.id));
904 
905         Bundle stored = mUserManager.getUserRestrictions(asHandle(testUser.id));
906         // Note this will fail if DO already sets those restrictions.
907         assertThat(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI)).isFalse();
908         assertThat(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS)).isFalse();
909         assertThat(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS)).isTrue();
910     }
911 
912     @MediumTest
913     @Test
testDefaultRestrictionsApplied()914     public void testDefaultRestrictionsApplied() throws Exception {
915         final UserInfo userInfo = createUser("Useroid", UserManager.USER_TYPE_FULL_SECONDARY, 0);
916         final UserTypeDetails userTypeDetails =
917                 UserTypeFactory.getUserTypes().get(UserManager.USER_TYPE_FULL_SECONDARY);
918         final Bundle expectedRestrictions = userTypeDetails.getDefaultRestrictions();
919         // Note this can fail if DO unset those restrictions.
920         for (String restriction : expectedRestrictions.keySet()) {
921             if (expectedRestrictions.getBoolean(restriction)) {
922                 assertThat(mUserManager.hasUserRestriction(restriction, UserHandle.of(userInfo.id)))
923                         .isTrue();
924             }
925         }
926     }
927 
928     @MediumTest
929     @Test
testSetDefaultGuestRestrictions()930     public void testSetDefaultGuestRestrictions() {
931         final Bundle origGuestRestrictions = mUserManager.getDefaultGuestRestrictions();
932         Bundle restrictions = new Bundle();
933         restrictions.putBoolean(UserManager.DISALLOW_FUN, true);
934         mUserManager.setDefaultGuestRestrictions(restrictions);
935 
936         try {
937             UserInfo guest = createUser("Guest", UserInfo.FLAG_GUEST);
938             assertThat(guest).isNotNull();
939             assertThat(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN,
940                     guest.getUserHandle())).isTrue();
941         } finally {
942             mUserManager.setDefaultGuestRestrictions(origGuestRestrictions);
943         }
944     }
945 
946     @Test
testGetUserSwitchability()947     public void testGetUserSwitchability() {
948         int userSwitchable = mUserManager.getUserSwitchability();
949         assertWithMessage("Expected users to be switchable").that(userSwitchable)
950                 .isEqualTo(UserManager.SWITCHABILITY_STATUS_OK);
951     }
952 
953     @LargeTest
954     @Test
testSwitchUser()955     public void testSwitchUser() {
956         ActivityManager am = mContext.getSystemService(ActivityManager.class);
957         final int startUser = am.getCurrentUser();
958         UserInfo user = createUser("User", 0);
959         assertThat(user).isNotNull();
960         // Switch to the user just created.
961         switchUser(user.id, null, true);
962         // Switch back to the starting user.
963         switchUser(startUser, null, true);
964     }
965 
966     @LargeTest
967     @Test
testSwitchUserByHandle()968     public void testSwitchUserByHandle() {
969         ActivityManager am = mContext.getSystemService(ActivityManager.class);
970         final int startUser = am.getCurrentUser();
971         UserInfo user = createUser("User", 0);
972         assertThat(user).isNotNull();
973         // Switch to the user just created.
974         switchUser(-1, user.getUserHandle(), false);
975         // Switch back to the starting user.
976         switchUser(-1, UserHandle.of(startUser), false);
977     }
978 
979     @Test
testSwitchUserByHandle_ThrowsException()980     public void testSwitchUserByHandle_ThrowsException() {
981         ActivityManager am = mContext.getSystemService(ActivityManager.class);
982         assertThrows(IllegalArgumentException.class, () -> am.switchUser(null));
983     }
984 
985     @MediumTest
986     @Test
testConcurrentUserCreate()987     public void testConcurrentUserCreate() throws Exception {
988         int userCount = mUserManager.getUserCount();
989         int maxSupportedUsers = UserManager.getMaxSupportedUsers();
990         int canBeCreatedCount = maxSupportedUsers - userCount;
991         // Test exceeding the limit while running in parallel
992         int createUsersCount = canBeCreatedCount + 5;
993         ExecutorService es = Executors.newCachedThreadPool();
994         AtomicInteger created = new AtomicInteger();
995         for (int i = 0; i < createUsersCount; i++) {
996             final String userName = "testConcUser" + i;
997             es.submit(() -> {
998                 UserInfo user = mUserManager.createUser(userName, 0);
999                 if (user != null) {
1000                     created.incrementAndGet();
1001                     synchronized (mUserRemoveLock) {
1002                         usersToRemove.add(user.id);
1003                     }
1004                 }
1005             });
1006         }
1007         es.shutdown();
1008         es.awaitTermination(20, TimeUnit.SECONDS);
1009         assertThat(mUserManager.getUserCount()).isEqualTo(maxSupportedUsers);
1010         assertThat(created.get()).isEqualTo(canBeCreatedCount);
1011     }
1012 
1013     @MediumTest
1014     @Test
testGetUserHandles_createNewUser_shouldFindNewUser()1015     public void testGetUserHandles_createNewUser_shouldFindNewUser() {
1016         UserInfo user = createUser("Guest 1", UserManager.USER_TYPE_FULL_GUEST, /*flags*/ 0);
1017 
1018         boolean found = false;
1019         List<UserHandle> userHandles = mUserManager.getUserHandles(/* excludeDying= */ true);
1020         for (UserHandle userHandle: userHandles) {
1021             if (userHandle.getIdentifier() == user.id) {
1022                 found = true;
1023             }
1024         }
1025 
1026         assertThat(found).isTrue();
1027     }
1028 
1029     @Test
testCreateProfile_withContextUserId()1030     public void testCreateProfile_withContextUserId() throws Exception {
1031         assumeManagedUsersSupported();
1032         final int primaryUserId = mUserManager.getPrimaryUser().id;
1033 
1034         UserInfo userProfile = createProfileForUser("Managed 1",
1035                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
1036         assertThat(userProfile).isNotNull();
1037 
1038         UserManager um = (UserManager) mContext.createPackageContextAsUser(
1039                 "android", 0, mUserManager.getPrimaryUser().getUserHandle())
1040                 .getSystemService(Context.USER_SERVICE);
1041 
1042         List<UserHandle> profiles = um.getAllProfiles();
1043         assertThat(profiles.size()).isEqualTo(2);
1044         assertThat(profiles.get(0).equals(userProfile.getUserHandle())
1045                 || profiles.get(1).equals(userProfile.getUserHandle())).isTrue();
1046     }
1047 
1048     @Test
testSetUserName_withContextUserId()1049     public void testSetUserName_withContextUserId() throws Exception {
1050         assumeManagedUsersSupported();
1051         final int primaryUserId = mUserManager.getPrimaryUser().id;
1052 
1053         UserInfo userInfo1 = createProfileForUser("Managed 1",
1054                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
1055         assertThat(userInfo1).isNotNull();
1056 
1057         UserManager um = (UserManager) mContext.createPackageContextAsUser(
1058                 "android", 0, userInfo1.getUserHandle())
1059                 .getSystemService(Context.USER_SERVICE);
1060 
1061         final String newName = "Managed_user 1";
1062         um.setUserName(newName);
1063 
1064         UserInfo userInfo = mUserManager.getUserInfo(userInfo1.id);
1065         assertThat(userInfo.name).isEqualTo(newName);
1066 
1067         // get user name from getUserName using context.getUserId
1068         assertThat(um.getUserName()).isEqualTo(newName);
1069     }
1070 
1071     @Test
testGetUserName_withContextUserId()1072     public void testGetUserName_withContextUserId() throws Exception {
1073         final String userName = "User 2";
1074         UserInfo user2 = createUser(userName, 0);
1075         assertThat(user2).isNotNull();
1076 
1077         UserManager um = (UserManager) mContext.createPackageContextAsUser(
1078                 "android", 0, user2.getUserHandle())
1079                 .getSystemService(Context.USER_SERVICE);
1080 
1081         assertThat(um.getUserName()).isEqualTo(userName);
1082     }
1083 
1084     @Test
testGetUserName_shouldReturnTranslatedTextForNullNamedGuestUser()1085     public void testGetUserName_shouldReturnTranslatedTextForNullNamedGuestUser() throws Exception {
1086         UserInfo guestWithNullName = createUser(null, UserManager.USER_TYPE_FULL_GUEST, 0);
1087         assertThat(guestWithNullName).isNotNull();
1088 
1089         UserManager um = (UserManager) mContext.createPackageContextAsUser(
1090                 "android", 0, guestWithNullName.getUserHandle())
1091                 .getSystemService(Context.USER_SERVICE);
1092 
1093         assertThat(um.getUserName()).isEqualTo(
1094                 mContext.getString(com.android.internal.R.string.guest_name));
1095     }
1096 
1097     @Test
testGetUserIcon_withContextUserId()1098     public void testGetUserIcon_withContextUserId() throws Exception {
1099         assumeManagedUsersSupported();
1100         final int primaryUserId = mUserManager.getPrimaryUser().id;
1101 
1102         UserInfo userInfo1 = createProfileForUser("Managed 1",
1103                 UserManager.USER_TYPE_PROFILE_MANAGED, primaryUserId);
1104         assertThat(userInfo1).isNotNull();
1105 
1106         UserManager um = (UserManager) mContext.createPackageContextAsUser(
1107                 "android", 0, userInfo1.getUserHandle())
1108                 .getSystemService(Context.USER_SERVICE);
1109 
1110         final String newName = "Managed_user 1";
1111         um.setUserName(newName);
1112 
1113         UserInfo userInfo = mUserManager.getUserInfo(userInfo1.id);
1114         assertThat(userInfo.name).isEqualTo(newName);
1115     }
1116 
isPackageInstalledForUser(String packageName, int userId)1117     private boolean isPackageInstalledForUser(String packageName, int userId) {
1118         try {
1119             return mPackageManager.getPackageInfoAsUser(packageName, 0, userId) != null;
1120         } catch (PackageManager.NameNotFoundException e) {
1121             return false;
1122         }
1123     }
1124 
1125     /**
1126      * @param userId value will be used to call switchUser(int) only if ignoreHandle is false.
1127      * @param user value will be used to call switchUser(UserHandle) only if ignoreHandle is true.
1128      * @param ignoreHandle if true, switchUser(int) will be called with the provided userId,
1129      *                     else, switchUser(UserHandle) will be called with the provided user.
1130      */
switchUser(int userId, UserHandle user, boolean ignoreHandle)1131     private void switchUser(int userId, UserHandle user, boolean ignoreHandle) {
1132         synchronized (mUserSwitchLock) {
1133             ActivityManager am = mContext.getSystemService(ActivityManager.class);
1134             if (ignoreHandle) {
1135                 am.switchUser(userId);
1136             } else {
1137                 am.switchUser(user);
1138             }
1139             long time = System.currentTimeMillis();
1140             try {
1141                 mUserSwitchLock.wait(SWITCH_USER_TIMEOUT_MILLIS);
1142             } catch (InterruptedException ie) {
1143                 Thread.currentThread().interrupt();
1144                 return;
1145             }
1146             if (System.currentTimeMillis() - time > SWITCH_USER_TIMEOUT_MILLIS) {
1147                 fail("Timeout waiting for the user switch to u"
1148                         + (ignoreHandle ? userId : user.getIdentifier()));
1149             }
1150         }
1151     }
1152 
removeUser(int userId)1153     private void removeUser(int userId) {
1154         synchronized (mUserRemoveLock) {
1155             mUserManager.removeUser(userId);
1156             waitForUserRemovalLocked(userId);
1157         }
1158     }
1159 
1160     @GuardedBy("mUserRemoveLock")
waitForUserRemovalLocked(int userId)1161     private void waitForUserRemovalLocked(int userId) {
1162         long time = System.currentTimeMillis();
1163         while (mUserManager.getUserInfo(userId) != null) {
1164             try {
1165                 mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS);
1166             } catch (InterruptedException ie) {
1167                 Thread.currentThread().interrupt();
1168                 return;
1169             }
1170             if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) {
1171                 fail("Timeout waiting for removeUser. userId = " + userId);
1172             }
1173         }
1174     }
1175 
createUser(String name, int flags)1176     private UserInfo createUser(String name, int flags) {
1177         UserInfo user = mUserManager.createUser(name, flags);
1178         if (user != null) {
1179             usersToRemove.add(user.id);
1180         }
1181         return user;
1182     }
1183 
createUser(String name, String userType, int flags)1184     private UserInfo createUser(String name, String userType, int flags) {
1185         UserInfo user = mUserManager.createUser(name, userType, flags);
1186         if (user != null) {
1187             usersToRemove.add(user.id);
1188         }
1189         return user;
1190     }
1191 
createProfileForUser(String name, String userType, int userHandle)1192     private UserInfo createProfileForUser(String name, String userType, int userHandle) {
1193         return createProfileForUser(name, userType, userHandle, null);
1194     }
1195 
createProfileForUser(String name, String userType, int userHandle, String[] disallowedPackages)1196     private UserInfo createProfileForUser(String name, String userType, int userHandle,
1197             String[] disallowedPackages) {
1198         UserInfo profile = mUserManager.createProfileForUser(
1199                 name, userType, 0, userHandle, disallowedPackages);
1200         if (profile != null) {
1201             usersToRemove.add(profile.id);
1202         }
1203         return profile;
1204     }
1205 
createProfileEvenWhenDisallowedForUser(String name, String userType, int userHandle)1206     private UserInfo createProfileEvenWhenDisallowedForUser(String name, String userType,
1207             int userHandle) {
1208         UserInfo profile = mUserManager.createProfileForUserEvenWhenDisallowed(
1209                 name, userType, 0, userHandle, null);
1210         if (profile != null) {
1211             usersToRemove.add(profile.id);
1212         }
1213         return profile;
1214     }
1215 
createRestrictedProfile(String name)1216     private UserInfo createRestrictedProfile(String name) {
1217         UserInfo profile = mUserManager.createRestrictedProfile(name);
1218         if (profile != null) {
1219             usersToRemove.add(profile.id);
1220         }
1221         return profile;
1222     }
1223 
assumeManagedUsersSupported()1224     private void assumeManagedUsersSupported() {
1225         // In Automotive, if headless system user is enabled, a managed user cannot be created
1226         // under a primary user.
1227         assumeTrue("device doesn't support managed users",
1228                 mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)
1229                 && (!isAutomotive() || !UserManager.isHeadlessSystemUserMode()));
1230     }
1231 
isAutomotive()1232     private boolean isAutomotive() {
1233         return mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
1234     }
1235 
asHandle(int userId)1236     private static UserHandle asHandle(int userId) {
1237         return new UserHandle(userId);
1238     }
1239 }
1240