1 /* 2 * Copyright (C) 2019 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.car.settings.profiles; 18 19 import static android.car.test.mocks.AndroidMockitoHelper.mockUmGetAliveUsers; 20 import static android.os.UserManager.USER_TYPE_SYSTEM_HEADLESS; 21 22 import static com.google.common.truth.Truth.assertThat; 23 24 import static org.mockito.ArgumentMatchers.any; 25 import static org.mockito.ArgumentMatchers.anyInt; 26 import static org.mockito.Mockito.never; 27 import static org.mockito.Mockito.verify; 28 import static org.mockito.Mockito.when; 29 30 import android.app.ActivityManager; 31 import android.car.user.CarUserManager; 32 import android.car.user.UserCreationResult; 33 import android.car.user.UserRemovalResult; 34 import android.car.user.UserSwitchResult; 35 import android.car.util.concurrent.AndroidAsyncFuture; 36 import android.car.util.concurrent.AndroidFuture; 37 import android.content.Context; 38 import android.content.pm.UserInfo; 39 import android.content.res.Resources; 40 import android.os.UserHandle; 41 import android.os.UserManager; 42 43 import com.android.car.settings.testutils.ShadowActivityManager; 44 import com.android.car.settings.testutils.ShadowUserIconProvider; 45 import com.android.car.settings.testutils.ShadowUserManager; 46 47 import org.junit.After; 48 import org.junit.Before; 49 import org.junit.Test; 50 import org.junit.runner.RunWith; 51 import org.mockito.Mock; 52 import org.mockito.MockitoAnnotations; 53 import org.robolectric.RobolectricTestRunner; 54 import org.robolectric.RuntimeEnvironment; 55 import org.robolectric.annotation.Config; 56 import org.robolectric.shadows.ShadowProcess; 57 58 @RunWith(RobolectricTestRunner.class) 59 @Config(shadows = {ShadowActivityManager.class, ShadowUserManager.class, 60 ShadowUserIconProvider.class}) 61 public class ProfileHelperTest { 62 63 private static final String DEFAULT_ADMIN_NAME = "default_admin"; 64 private static final String DEFAULT_GUEST_NAME = "default_guest"; 65 66 private Context mContext; 67 private ProfileHelper mProfileHelper; 68 69 @Mock 70 private UserManager mMockUserManager; 71 @Mock 72 private Resources mMockResources; 73 @Mock 74 private CarUserManager mMockCarUserManager; 75 76 @Before setUp()77 public void setUp() { 78 MockitoAnnotations.initMocks(this); 79 mContext = RuntimeEnvironment.application; 80 mProfileHelper = new ProfileHelper(mMockUserManager, mMockResources, 81 DEFAULT_ADMIN_NAME, DEFAULT_GUEST_NAME, mMockCarUserManager); 82 83 when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) 84 .thenReturn(false); 85 when(mMockUserManager.isDemoUser()).thenReturn(false); 86 when(mMockUserManager.isGuestUser()).thenReturn(false); 87 88 ShadowUserManager.setIsHeadlessSystemUserMode(true); 89 ShadowActivityManager.setCurrentUser(10); 90 } 91 92 @After tearDown()93 public void tearDown() { 94 ShadowActivityManager.reset(); 95 ShadowUserManager.reset(); 96 } 97 98 @Test canCurrentProcessModifyAccounts_baseline_returnsTrue()99 public void canCurrentProcessModifyAccounts_baseline_returnsTrue() { 100 assertThat(mProfileHelper.canCurrentProcessModifyAccounts()).isTrue(); 101 } 102 103 @Test canCurrentProcessModifyAccounts_hasDisallowModifyAccounts_returnsFalse()104 public void canCurrentProcessModifyAccounts_hasDisallowModifyAccounts_returnsFalse() { 105 when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) 106 .thenReturn(true); 107 assertThat(mProfileHelper.canCurrentProcessModifyAccounts()).isFalse(); 108 } 109 110 @Test canCurrentProcessModifyAccounts_isDemoUser_returnsFalse()111 public void canCurrentProcessModifyAccounts_isDemoUser_returnsFalse() { 112 when(mMockUserManager.isDemoUser()).thenReturn(true); 113 assertThat(mProfileHelper.canCurrentProcessModifyAccounts()).isFalse(); 114 } 115 116 @Test canCurrentProcessModifyAccounts_isGuestUser_returnsFalse()117 public void canCurrentProcessModifyAccounts_isGuestUser_returnsFalse() { 118 when(mMockUserManager.isGuestUser()).thenReturn(true); 119 assertThat(mProfileHelper.canCurrentProcessModifyAccounts()).isFalse(); 120 } 121 122 @Test testGetAllsers()123 public void testGetAllsers() { 124 // Add system user 125 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 126 127 // Create two admin, and two non-admin users. 128 int fgUserId = ActivityManager.getCurrentUser(); 129 UserInfo fgUser = createNonAdminUser(fgUserId); 130 UserInfo user2 = createAdminUser(fgUserId + 1); 131 UserInfo user3 = createNonAdminUser(fgUserId + 2); 132 UserInfo user4 = createAdminUser(fgUserId + 3); 133 134 mockGetUsers(systemUser, fgUser, user2, user3, user4); 135 136 // Should return all non-system users 137 assertThat(mProfileHelper.getAllProfiles()).containsExactly(fgUser, user2, user3, user4); 138 } 139 140 @Test testGetAllUsers_notHeadless()141 public void testGetAllUsers_notHeadless() { 142 ShadowUserManager.setIsHeadlessSystemUserMode(false); 143 144 // Add system user 145 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 146 147 // Create two admin, and two non-admin users. 148 int fgUserId = ActivityManager.getCurrentUser(); 149 UserInfo fgUser = createNonAdminUser(fgUserId); 150 UserInfo user2 = createAdminUser(fgUserId + 1); 151 UserInfo user3 = createNonAdminUser(fgUserId + 2); 152 UserInfo user4 = createAdminUser(fgUserId + 3); 153 154 mockGetUsers(systemUser, fgUser, user2, user3, user4); 155 156 // Should return all users 157 assertThat(mProfileHelper.getAllProfiles()) 158 .containsExactly(systemUser, fgUser, user2, user3, user4); 159 } 160 161 @Test testGetAllSwitchableUsers()162 public void testGetAllSwitchableUsers() { 163 // Add system user 164 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 165 166 // Create two non-foreground users. 167 int fgUserId = ActivityManager.getCurrentUser(); 168 UserInfo fgUser = createAdminUser(fgUserId); 169 UserInfo user1 = createAdminUser(fgUserId + 1); 170 UserInfo user2 = createAdminUser(fgUserId + 2); 171 172 mockGetUsers(systemUser, fgUser, user1, user2); 173 174 // Should return all non-foreground users. 175 assertThat(mProfileHelper.getAllSwitchableProfiles()).containsExactly(user1, user2); 176 } 177 178 @Test testGetAllSwitchableUsers_notHeadless()179 public void testGetAllSwitchableUsers_notHeadless() { 180 ShadowUserManager.setIsHeadlessSystemUserMode(false); 181 182 // Add system user 183 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 184 185 // Create two non-foreground users. 186 int fgUserId = ActivityManager.getCurrentUser(); 187 UserInfo fgUser = createAdminUser(fgUserId); 188 UserInfo user1 = createAdminUser(fgUserId + 1); 189 UserInfo user2 = createAdminUser(fgUserId + 2); 190 191 mockGetUsers(systemUser, fgUser, user1, user2); 192 193 // Should return all non-foreground users. 194 assertThat(mProfileHelper.getAllSwitchableProfiles()).containsExactly(systemUser, user1, 195 user2); 196 } 197 198 @Test testGetAllPersistentUsers()199 public void testGetAllPersistentUsers() { 200 // Add system user 201 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 202 203 // Create two non-ephemeral users. 204 int fgUserId = ActivityManager.getCurrentUser(); 205 UserInfo fgUser = createAdminUser(fgUserId); 206 UserInfo user2 = createAdminUser(fgUserId + 1); 207 // Create two ephemeral users. 208 UserInfo user3 = createEphemeralUser(fgUserId + 2); 209 UserInfo user4 = createEphemeralUser(fgUserId + 3); 210 211 mockGetUsers(systemUser, fgUser, user2, user3, user4); 212 213 // Should return all non-ephemeral users. 214 assertThat(mProfileHelper.getAllPersistentProfiles()).containsExactly(fgUser, user2); 215 } 216 217 @Test testGetAllPersistentUsers_notHeadless()218 public void testGetAllPersistentUsers_notHeadless() { 219 ShadowUserManager.setIsHeadlessSystemUserMode(false); 220 221 // Add system user 222 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 223 224 // Create two non-ephemeral users. 225 int fgUserId = ActivityManager.getCurrentUser(); 226 UserInfo fgUser = createAdminUser(fgUserId); 227 UserInfo user2 = createAdminUser(fgUserId + 1); 228 // Create two ephemeral users. 229 UserInfo user3 = createEphemeralUser(fgUserId + 2); 230 UserInfo user4 = createEphemeralUser(fgUserId + 3); 231 232 mockGetUsers(systemUser, fgUser, user2, user3, user4); 233 234 // Should return all non-ephemeral users. 235 assertThat(mProfileHelper.getAllPersistentProfiles()).containsExactly(systemUser, fgUser, 236 user2); 237 } 238 239 @Test testGetAllAdminUsers()240 public void testGetAllAdminUsers() { 241 // Add system user 242 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 243 244 // Create two admin, and two non-admin users. 245 int fgUserId = ActivityManager.getCurrentUser(); 246 UserInfo fgUser = createNonAdminUser(fgUserId); 247 UserInfo user2 = createAdminUser(fgUserId + 1); 248 UserInfo user3 = createNonAdminUser(fgUserId + 2); 249 UserInfo user4 = createAdminUser(fgUserId + 3); 250 251 mockGetUsers(systemUser, fgUser, user2, user3, user4); 252 253 // Should return only admin users. 254 assertThat(mProfileHelper.getAllAdminProfiles()).containsExactly(user2, user4); 255 } 256 257 @Test testGetAllAdminUsers_notHeadless()258 public void testGetAllAdminUsers_notHeadless() { 259 ShadowUserManager.setIsHeadlessSystemUserMode(false); 260 261 // Add system user 262 UserInfo systemUser = createAdminUser(UserHandle.USER_SYSTEM); 263 264 // Create two admin, and two non-admin users. 265 int fgUserId = ActivityManager.getCurrentUser(); 266 UserInfo fgUser = createNonAdminUser(fgUserId); 267 UserInfo user2 = createAdminUser(fgUserId + 1); 268 UserInfo user3 = createNonAdminUser(fgUserId + 2); 269 UserInfo user4 = createAdminUser(fgUserId + 3); 270 271 mockGetUsers(systemUser, fgUser, user2, user3, user4); 272 273 // Should return only admin users. 274 assertThat(mProfileHelper.getAllAdminProfiles()).containsExactly(systemUser, user2, user4); 275 } 276 277 @Test testRemoveUser_isAdminUser_cannotRemoveSystemUser()278 public void testRemoveUser_isAdminUser_cannotRemoveSystemUser() { 279 UserInfo systemUser = new UserInfo( 280 UserHandle.USER_SYSTEM, 281 "Driver", 282 /* iconPath= */ null, 283 /* flags= */ UserInfo.FLAG_ADMIN | UserInfo.FLAG_SYSTEM, 284 /* userType= */ USER_TYPE_SYSTEM_HEADLESS); 285 286 assertThat(mProfileHelper.removeProfile(mContext, systemUser)) 287 .isEqualTo(ProfileHelper.REMOVE_PROFILE_RESULT_FAILED); 288 } 289 290 @Test testRemoveUser_isAdmin_canRemoveOtherUsers()291 public void testRemoveUser_isAdmin_canRemoveOtherUsers() { 292 // Create admin user and non-admin user 293 int fgUserId = ActivityManager.getCurrentUser(); 294 int nonAdminUserId = fgUserId + 1; 295 UserInfo fgUser = createAdminUser(fgUserId); 296 UserInfo nonAdminUser = createNonAdminUser(nonAdminUserId); 297 298 mockGetUsers(fgUser, nonAdminUser); 299 mockRemoveUser(nonAdminUserId, UserRemovalResult.STATUS_SUCCESSFUL); 300 // If Admin is removing non-current, non-system user, simply calls removeUser. 301 when(mMockUserManager.isAdminUser()).thenReturn(true); 302 303 assertThat(mProfileHelper.removeProfile(mContext, nonAdminUser)) 304 .isEqualTo(ProfileHelper.REMOVE_PROFILE_RESULT_SUCCESS); 305 verify(mMockCarUserManager).removeUser(nonAdminUserId); 306 } 307 308 @Test testRemoveUser_isNonAdmin_cannotRemoveOtherUsers()309 public void testRemoveUser_isNonAdmin_cannotRemoveOtherUsers() { 310 // Create two non-admin users 311 int fgUserId = ActivityManager.getCurrentUser(); 312 UserInfo fgUser = createNonAdminUser(fgUserId); 313 UserInfo user2 = createNonAdminUser(fgUserId + 1); 314 mockGetUsers(fgUser, user2); 315 316 // Make current user non-admin. 317 when(mMockUserManager.isAdminUser()).thenReturn(false); 318 // Mock so that removeUser always pretends it's successful. 319 mockRemoveUserSuccess(); 320 321 // If Non-Admin is trying to remove someone other than themselves, they should fail. 322 assertThat(mProfileHelper.removeProfile(mContext, user2)) 323 .isEqualTo(ProfileHelper.REMOVE_PROFILE_RESULT_FAILED); 324 verify(mMockCarUserManager, never()).removeUser(user2.id); 325 } 326 327 328 @Test testRemoveUser_removesLastAdminUser_createsAndSwitchesToNewAdminUser()329 public void testRemoveUser_removesLastAdminUser_createsAndSwitchesToNewAdminUser() { 330 // Ensure admin status 331 when(mMockUserManager.isAdminUser()).thenReturn(true); 332 333 // Create one admin and one non-admin 334 int baseId = 10; 335 UserInfo adminUser = createAdminUser(baseId); 336 UserInfo nonAdminInfo = createNonAdminUser(baseId + 1); 337 mockGetUsers(adminUser, nonAdminInfo); 338 UserInfo newAdminInfo = createAdminUser(baseId + 2); 339 mockRemoveUserSuccess(); 340 mockCreateUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN, 341 UserCreationResult.STATUS_SUCCESSFUL, newAdminInfo); 342 mockSwitchUserSuccess(); 343 344 assertThat(mProfileHelper.removeProfile(mContext, adminUser)) 345 .isEqualTo(ProfileHelper.REMOVE_PROFILE_RESULT_SUCCESS); 346 347 verify(mMockCarUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN); 348 verify(mMockCarUserManager).switchUser(newAdminInfo.id); 349 verify(mMockCarUserManager).removeUser(adminUser.id); 350 } 351 352 @Test testRemoveUser_removesLastAdminUserFailsCreateNewUser_doesNotRemoveOrSwitchUser()353 public void testRemoveUser_removesLastAdminUserFailsCreateNewUser_doesNotRemoveOrSwitchUser() { 354 // Ensure admin status 355 when(mMockUserManager.isAdminUser()).thenReturn(true); 356 357 // Create one admin and one non-admin 358 int baseId = 10; 359 UserInfo adminUser = createAdminUser(baseId); 360 UserInfo nonAdminInfo = createNonAdminUser(baseId + 1); 361 mockGetUsers(adminUser, nonAdminInfo); 362 363 // Fail to create a new user to force a failure case 364 mockCreateUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN, 365 UserCreationResult.STATUS_ANDROID_FAILURE, null); 366 367 assertThat(mProfileHelper.removeProfile(mContext, adminUser)) 368 .isEqualTo(ProfileHelper.REMOVE_PROFILE_RESULT_FAILED); 369 verify(mMockCarUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN); 370 verify(mMockCarUserManager, never()).switchUser(anyInt()); 371 verify(mMockCarUserManager, never()).removeUser(adminUser.id); 372 } 373 374 @Test testRemoveUser_removeForegroundUser_callsSwitchToGuest()375 public void testRemoveUser_removeForegroundUser_callsSwitchToGuest() { 376 // Create foreground user 377 int baseId = 10; 378 ShadowProcess.setUid(baseId * UserHandle.PER_USER_RANGE); // User 10 379 UserInfo currentUser = createNonAdminUser(baseId); 380 when(mMockUserManager.isAdminUser()).thenReturn(false); 381 mockGetUsers(currentUser); 382 383 UserInfo guestUser = createGuestUser(baseId + 1); 384 mockRemoveUserSuccess(); 385 mockCreateGuest(DEFAULT_GUEST_NAME, UserCreationResult.STATUS_SUCCESSFUL, guestUser); 386 mockSwitchUserSuccess(); 387 388 assertUserRemoved(ProfileHelper.REMOVE_PROFILE_RESULT_SUCCESS, guestUser, currentUser); 389 } 390 391 @Test testRemoveUser_removeForegroundUser_switchFails_returnsSetEphemeralResult()392 public void testRemoveUser_removeForegroundUser_switchFails_returnsSetEphemeralResult() { 393 // Create foreground user 394 int baseId = 10; 395 ShadowProcess.setUid(baseId * UserHandle.PER_USER_RANGE); // User 10 396 UserInfo currentUser = createNonAdminUser(baseId); 397 when(mMockUserManager.isAdminUser()).thenReturn(false); 398 mockGetUsers(currentUser); 399 400 UserInfo guestUser = createGuestUser(baseId + 1); 401 mockRemoveUserSuccess(); 402 mockCreateGuest(DEFAULT_GUEST_NAME, UserCreationResult.STATUS_SUCCESSFUL, guestUser); 403 mockSwitchUserFailure(); 404 405 assertUserRemoved(ProfileHelper.REMOVE_PROFILE_RESULT_SWITCH_FAILED, guestUser, 406 currentUser); 407 } 408 assertUserRemoved(int expectedResult, UserInfo newUser, UserInfo removedUser)409 private void assertUserRemoved(int expectedResult, UserInfo newUser, UserInfo removedUser) { 410 assertThat(mProfileHelper.removeProfile(mContext, removedUser)).isEqualTo(expectedResult); 411 verify(mMockCarUserManager).createGuest(newUser.name); 412 verify(mMockCarUserManager).switchUser(newUser.id); 413 verify(mMockCarUserManager).removeUser(removedUser.id); 414 } 415 416 @Test testGetMaxSupportedRealUsers_isHeadless()417 public void testGetMaxSupportedRealUsers_isHeadless() { 418 ShadowUserManager.setIsHeadlessSystemUserMode(true); 419 ShadowUserManager.setMaxSupportedUsers(7); 420 421 // Create System user, two managed profiles, and two normal users. 422 UserInfo user0 = createAdminUser(0); 423 UserInfo user1 = createNonAdminUser(10); 424 UserInfo user2 = createManagedProfile(11); 425 UserInfo user3 = createNonAdminUser(13); 426 UserInfo user4 = createManagedProfile(14); 427 428 mockGetUsers(user0, user1, user2, user3, user4); 429 430 // Max users - # managed profiles - headless system user. 431 assertThat(mProfileHelper.getMaxSupportedRealProfiles()).isEqualTo(4); 432 } 433 434 @Test testGetMaxSupportedRealUsers_isNotHeadless()435 public void testGetMaxSupportedRealUsers_isNotHeadless() { 436 ShadowUserManager.setIsHeadlessSystemUserMode(false); 437 ShadowUserManager.setMaxSupportedUsers(7); 438 439 // Create System user, two managed profiles, and two normal users. 440 UserInfo user0 = createAdminUser(0); 441 UserInfo user1 = createNonAdminUser(10); 442 UserInfo user2 = createManagedProfile(11); 443 UserInfo user3 = createNonAdminUser(13); 444 UserInfo user4 = createManagedProfile(14); 445 446 mockGetUsers(user0, user1, user2, user3, user4); 447 448 // Max users - # managed profiles 449 assertThat(mProfileHelper.getMaxSupportedRealProfiles()).isEqualTo(5); 450 } 451 452 @Test testCreateNewOrFindExistingGuest_ifGuestExists_returnsExistingGuest()453 public void testCreateNewOrFindExistingGuest_ifGuestExists_returnsExistingGuest() { 454 // Create two users and a guest user. 455 UserInfo user1 = createAdminUser(10); 456 UserInfo user2 = createNonAdminUser(12); 457 UserInfo guestUser = createGuestUser(13); 458 459 mockGetUsers(user1, user2, guestUser); 460 mockCreateUserFail(); 461 462 when(mMockUserManager.findCurrentGuestUser()).thenReturn(guestUser); 463 464 UserInfo guest = mProfileHelper.createNewOrFindExistingGuest(mContext); 465 assertThat(guest).isEqualTo(guestUser); 466 } 467 468 @Test testCreateNewOrFindExistingGuest_ifNoGuest_createsNewGuest()469 public void testCreateNewOrFindExistingGuest_ifNoGuest_createsNewGuest() { 470 // Create two users. 471 UserInfo user1 = createAdminUser(10); 472 UserInfo user2 = createNonAdminUser(12); 473 474 mockGetUsers(user1, user2); 475 476 // Create a user for the "new guest" user. 477 UserInfo guestInfo = createGuestUser(21); 478 479 mockCreateGuest(DEFAULT_GUEST_NAME, UserCreationResult.STATUS_SUCCESSFUL, guestInfo); 480 481 UserInfo guest = mProfileHelper.createNewOrFindExistingGuest(mContext); 482 verify(mMockCarUserManager).createGuest(DEFAULT_GUEST_NAME); 483 assertThat(guest).isEqualTo(guestInfo); 484 } 485 createAdminUser(int id)486 private UserInfo createAdminUser(int id) { 487 return new UserInfo(id, null, UserInfo.FLAG_ADMIN); 488 } 489 createNonAdminUser(int id)490 private UserInfo createNonAdminUser(int id) { 491 return new UserInfo(id, null, 0); 492 } 493 createEphemeralUser(int id)494 private UserInfo createEphemeralUser(int id) { 495 return new UserInfo(id, null, UserInfo.FLAG_EPHEMERAL); 496 } 497 createManagedProfile(int id)498 private UserInfo createManagedProfile(int id) { 499 return new UserInfo(id, null, UserInfo.FLAG_MANAGED_PROFILE); 500 } 501 createGuestUser(int id)502 private UserInfo createGuestUser(int id) { 503 return new UserInfo(id, null, UserInfo.FLAG_GUEST); 504 } 505 mockGetUsers(UserInfo... users)506 private void mockGetUsers(UserInfo... users) { 507 mockUmGetAliveUsers(mMockUserManager, users); 508 } 509 mockRemoveUser(int userId, int status)510 private void mockRemoveUser(int userId, int status) { 511 when(mMockCarUserManager.removeUser(userId)).thenReturn(new UserRemovalResult(status)); 512 } 513 mockRemoveUserSuccess()514 private void mockRemoveUserSuccess() { 515 when(mMockCarUserManager.removeUser(anyInt())) 516 .thenReturn(new UserRemovalResult(UserRemovalResult.STATUS_SUCCESSFUL)); 517 } 518 mockCreateUserFail()519 private void mockCreateUserFail() { 520 AndroidFuture<UserCreationResult> future = new AndroidFuture<>(); 521 future.complete(new UserCreationResult(UserCreationResult.STATUS_ANDROID_FAILURE, 522 /* user= */ null)); 523 AndroidAsyncFuture<UserCreationResult> asyncFuture = new AndroidAsyncFuture<>(future); 524 when(mMockCarUserManager.createUser(any(), anyInt())).thenReturn(asyncFuture); 525 when(mMockCarUserManager.createGuest(any())).thenReturn(asyncFuture); 526 } 527 mockCreateUser(String name, int flag, int status, UserInfo userInfo)528 private void mockCreateUser(String name, int flag, int status, UserInfo userInfo) { 529 AndroidFuture<UserCreationResult> future = new AndroidFuture<>(); 530 future.complete(new UserCreationResult(status, userInfo.getUserHandle())); 531 when(mMockCarUserManager.createUser(name, flag)) 532 .thenReturn(new AndroidAsyncFuture<>(future)); 533 } 534 mockCreateGuest(String name, int status, UserInfo userInfo)535 private void mockCreateGuest(String name, int status, UserInfo userInfo) { 536 AndroidFuture<UserCreationResult> future = new AndroidFuture<>(); 537 future.complete(new UserCreationResult(status, userInfo.getUserHandle())); 538 when(mMockCarUserManager.createGuest(name)).thenReturn(new AndroidAsyncFuture<>(future)); 539 } 540 mockSwitchUserSuccess()541 private void mockSwitchUserSuccess() { 542 AndroidFuture<UserSwitchResult> future = new AndroidFuture<>(); 543 future.complete( 544 new UserSwitchResult(UserSwitchResult.STATUS_SUCCESSFUL, /* errorMessage= */null)); 545 when(mMockCarUserManager.switchUser(anyInt())).thenReturn(new AndroidAsyncFuture<>(future)); 546 } 547 mockSwitchUserFailure()548 private void mockSwitchUserFailure() { 549 AndroidFuture<UserSwitchResult> future = new AndroidFuture<>(); 550 future.complete(new UserSwitchResult(UserSwitchResult.STATUS_ANDROID_FAILURE, 551 /* errorMessage= */null)); 552 when(mMockCarUserManager.switchUser(anyInt())).thenReturn(new AndroidAsyncFuture<>(future)); 553 } 554 } 555