summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorYing Zheng2018-06-19 18:01:05 -0500
committerYing Zheng2018-06-20 18:42:07 -0500
commitf4339b8cb132a3b6635f4516eb7f65cf8e074fe7 (patch)
treea0b8c826ec1b60d6a2cc0ff791e71dc9f78f7258 /tests
parentd812d4c1ac4590e98d41c01fab14f654ea0b3657 (diff)
downloadplatform-packages-services-car-f4339b8cb132a3b6635f4516eb7f65cf8e074fe7.tar.gz
platform-packages-services-car-f4339b8cb132a3b6635f4516eb7f65cf8e074fe7.tar.xz
platform-packages-services-car-f4339b8cb132a3b6635f4516eb7f65cf8e074fe7.zip
Complete the logic around last active user, including:
- Update CarSettings last active user when user switched. - Boot into the last active user if valid, or boot into the smallest user id. - Not allow deleting the last admin user, so we have a user 10+ to boot into. Test: Unit test Bug: 110156344,110425490,110425354 Change-Id: I3e85805bf469bd17709973936e8c3285c8f44207
Diffstat (limited to 'tests')
-rw-r--r--tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java267
-rw-r--r--tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java46
2 files changed, 215 insertions, 98 deletions
diff --git a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
index 3c97ca19..ca6e0278 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
@@ -19,9 +19,9 @@ package com.android.car;
19import static com.google.common.truth.Truth.assertThat; 19import static com.google.common.truth.Truth.assertThat;
20 20
21import static org.mockito.ArgumentMatchers.anyInt; 21import static org.mockito.ArgumentMatchers.anyInt;
22import static org.mockito.Mockito.doReturn;
22import static org.mockito.Mockito.never; 23import static org.mockito.Mockito.never;
23import static org.mockito.Mockito.verify; 24import static org.mockito.Mockito.verify;
24import static org.mockito.Mockito.when;
25 25
26import android.app.ActivityManager; 26import android.app.ActivityManager;
27import android.car.user.CarUserManagerHelper; 27import android.car.user.CarUserManagerHelper;
@@ -40,6 +40,10 @@ import android.support.test.InstrumentationRegistry;
40import android.support.test.filters.SmallTest; 40import android.support.test.filters.SmallTest;
41import android.support.test.runner.AndroidJUnit4; 41import android.support.test.runner.AndroidJUnit4;
42 42
43import java.util.ArrayList;
44import java.util.Arrays;
45import java.util.List;
46
43import org.junit.Before; 47import org.junit.Before;
44import org.junit.Test; 48import org.junit.Test;
45import org.junit.runner.RunWith; 49import org.junit.runner.RunWith;
@@ -47,10 +51,6 @@ import org.mockito.ArgumentCaptor;
47import org.mockito.Mock; 51import org.mockito.Mock;
48import org.mockito.MockitoAnnotations; 52import org.mockito.MockitoAnnotations;
49 53
50import java.util.ArrayList;
51import java.util.Arrays;
52import java.util.List;
53
54/** 54/**
55 * This class contains unit tests for the {@link CarUserManagerHelper}. 55 * This class contains unit tests for the {@link CarUserManagerHelper}.
56 * It tests that {@link CarUserManagerHelper} does the right thing for user management flows. 56 * It tests that {@link CarUserManagerHelper} does the right thing for user management flows.
@@ -73,7 +73,7 @@ public class CarUserManagerHelperTest {
73 @Mock 73 @Mock
74 private CarUserManagerHelper.OnUsersUpdateListener mTestListener; 74 private CarUserManagerHelper.OnUsersUpdateListener mTestListener;
75 75
76 private CarUserManagerHelper mHelper; 76 private CarUserManagerHelper mCarUserManagerHelper;
77 private UserInfo mCurrentProcessUser; 77 private UserInfo mCurrentProcessUser;
78 private UserInfo mSystemUser; 78 private UserInfo mSystemUser;
79 private String mGuestUserName = "testGuest"; 79 private String mGuestUserName = "testGuest";
@@ -84,16 +84,16 @@ public class CarUserManagerHelperTest {
84 @Before 84 @Before
85 public void setUpMocksAndVariables() throws Exception { 85 public void setUpMocksAndVariables() throws Exception {
86 MockitoAnnotations.initMocks(this); 86 MockitoAnnotations.initMocks(this);
87 when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 87 doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
88 when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager); 88 doReturn(mActivityManager).when(mContext).getSystemService(Context.ACTIVITY_SERVICE);
89 when(mContext.getResources()) 89 doReturn(InstrumentationRegistry.getTargetContext().getResources())
90 .thenReturn(InstrumentationRegistry.getTargetContext().getResources()); 90 .when(mContext).getResources();
91 when(mContext.getApplicationContext()).thenReturn(mContext); 91 doReturn(mContext).when(mContext).getApplicationContext();
92 mHelper = new CarUserManagerHelper(mContext); 92 mCarUserManagerHelper = new CarUserManagerHelper(mContext);
93 93
94 mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId()); 94 mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
95 mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM); 95 mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
96 when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentProcessUser); 96 doReturn(mCurrentProcessUser).when(mUserManager).getUserInfo(UserHandle.myUserId());
97 97
98 // Get the ID of the foreground user running this test. 98 // Get the ID of the foreground user running this test.
99 // We cannot mock the foreground user since getCurrentUser is static. 99 // We cannot mock the foreground user since getCurrentUser is static.
@@ -111,10 +111,10 @@ public class CarUserManagerHelperTest {
111 UserInfo testInfo = new UserInfo(); 111 UserInfo testInfo = new UserInfo();
112 112
113 testInfo.id = UserHandle.USER_SYSTEM; 113 testInfo.id = UserHandle.USER_SYSTEM;
114 assertThat(mHelper.isSystemUser(testInfo)).isTrue(); 114 assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isTrue();
115 115
116 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. 116 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
117 assertThat(mHelper.isSystemUser(testInfo)).isFalse(); 117 assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isFalse();
118 } 118 }
119 119
120 // System user will not be returned when calling get all users. 120 // System user will not be returned when calling get all users.
@@ -131,10 +131,10 @@ public class CarUserManagerHelperTest {
131 testUsers.add(otherUser2); 131 testUsers.add(otherUser2);
132 testUsers.add(otherUser3); 132 testUsers.add(otherUser3);
133 133
134 when(mUserManager.getUsers(true)).thenReturn(testUsers); 134 doReturn(testUsers).when(mUserManager).getUsers(true);
135 135
136 assertThat(mHelper.getAllUsers()).hasSize(3); 136 assertThat(mCarUserManagerHelper.getAllUsers()).hasSize(3);
137 assertThat(mHelper.getAllUsers()) 137 assertThat(mCarUserManagerHelper.getAllUsers())
138 .containsExactly(otherUser1, otherUser2, otherUser3); 138 .containsExactly(otherUser1, otherUser2, otherUser3);
139 } 139 }
140 140
@@ -146,14 +146,14 @@ public class CarUserManagerHelperTest {
146 146
147 List<UserInfo> testUsers = Arrays.asList(mForegroundUser, user1, user2); 147 List<UserInfo> testUsers = Arrays.asList(mForegroundUser, user1, user2);
148 148
149 when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers)); 149 doReturn(new ArrayList<>(testUsers)).when(mUserManager).getUsers(true);
150 150
151 // Should return all 3 users. 151 // Should return all 3 users.
152 assertThat(mHelper.getAllUsers()).hasSize(3); 152 assertThat(mCarUserManagerHelper.getAllUsers()).hasSize(3);
153 153
154 // Should return all non-foreground users. 154 // Should return all non-foreground users.
155 assertThat(mHelper.getAllSwitchableUsers()).hasSize(2); 155 assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).hasSize(2);
156 assertThat(mHelper.getAllSwitchableUsers()).containsExactly(user1, user2); 156 assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).containsExactly(user1, user2);
157 } 157 }
158 158
159 @Test 159 @Test
@@ -162,80 +162,89 @@ public class CarUserManagerHelperTest {
162 162
163 // System user cannot be removed. 163 // System user cannot be removed.
164 testInfo.id = UserHandle.USER_SYSTEM; 164 testInfo.id = UserHandle.USER_SYSTEM;
165 assertThat(mHelper.canUserBeRemoved(testInfo)).isFalse(); 165 assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isFalse();
166 166
167 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id. 167 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
168 assertThat(mHelper.canUserBeRemoved(testInfo)).isTrue(); 168 assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isTrue();
169 } 169 }
170 170
171 @Test 171 @Test
172 public void testCurrentProcessCanAddUsers() { 172 public void testCurrentProcessCanAddUsers() {
173 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false); 173 doReturn(false).when(mUserManager)
174 assertThat(mHelper.canCurrentProcessAddUsers()).isTrue(); 174 .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
175 assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isTrue();
175 176
176 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true); 177 doReturn(true).when(mUserManager)
177 assertThat(mHelper.canCurrentProcessAddUsers()).isFalse(); 178 .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
179 assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isFalse();
178 } 180 }
179 181
180 @Test 182 @Test
181 public void testCurrentProcessCanRemoveUsers() { 183 public void testCurrentProcessCanRemoveUsers() {
182 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false); 184 doReturn(false).when(mUserManager)
183 assertThat(mHelper.canCurrentProcessRemoveUsers()).isTrue(); 185 .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
186 assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isTrue();
184 187
185 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true); 188 doReturn(true).when(mUserManager)
186 assertThat(mHelper.canCurrentProcessRemoveUsers()).isFalse(); 189 .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
190 assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isFalse();
187 } 191 }
188 192
189 @Test 193 @Test
190 public void testCurrentProcessCanSwitchUsers() { 194 public void testCurrentProcessCanSwitchUsers() {
191 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false); 195 doReturn(false).when(mUserManager)
192 assertThat(mHelper.canCurrentProcessSwitchUsers()).isTrue(); 196 .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
197 assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isTrue();
193 198
194 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true); 199 doReturn(true).when(mUserManager)
195 assertThat(mHelper.canCurrentProcessSwitchUsers()).isFalse(); 200 .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
201 assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isFalse();
196 } 202 }
197 203
198 @Test 204 @Test
199 public void testCurrentGuestProcessCannotModifyAccounts() { 205 public void testCurrentGuestProcessCannotModifyAccounts() {
200 assertThat(mHelper.canCurrentProcessModifyAccounts()).isTrue(); 206 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
207
208 doReturn(true).when(mUserManager).isGuestUser();
201 209
202 when(mUserManager.isGuestUser()).thenReturn(true); 210 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
203 assertThat(mHelper.canCurrentProcessModifyAccounts()).isFalse();
204 } 211 }
205 212
206 @Test 213 @Test
207 public void testCurrentDemoProcessCannotModifyAccounts() { 214 public void testCurrentDemoProcessCannotModifyAccounts() {
208 assertThat(mHelper.canCurrentProcessModifyAccounts()).isTrue(); 215 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
209 216
210 when(mUserManager.isDemoUser()).thenReturn(true); 217 doReturn(true).when(mUserManager).isDemoUser();
211 assertThat(mHelper.canCurrentProcessModifyAccounts()).isFalse(); 218
219 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
212 } 220 }
213 221
214 @Test 222 @Test
215 public void testCurrentDisallowModifyAccountsProcessIsEnforced() { 223 public void testCurrentDisallowModifyAccountsProcessIsEnforced() {
216 assertThat(mHelper.canCurrentProcessModifyAccounts()).isTrue(); 224 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
225
226 doReturn(true).when(mUserManager)
227 .hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS);
217 228
218 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) 229 assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
219 .thenReturn(true);
220 assertThat(mHelper.canCurrentProcessModifyAccounts()).isFalse();
221 } 230 }
222 231
223 @Test 232 @Test
224 public void testCreateNewAdminUser() { 233 public void testCreateNewAdminUser() {
225 // Make sure current user is admin, since only admins can create other admins. 234 // Make sure current user is admin, since only admins can create other admins.
226 when(mUserManager.isAdminUser()).thenReturn(true); 235 doReturn(true).when(mUserManager).isAdminUser();
227 236
228 // Verify createUser on UserManager gets called. 237 // Verify createUser on UserManager gets called.
229 mHelper.createNewAdminUser(mTestUserName); 238 mCarUserManagerHelper.createNewAdminUser(mTestUserName);
230 verify(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN); 239 verify(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
231 240
232 when(mUserManager.createUser(mTestUserName, UserInfo.FLAG_ADMIN)).thenReturn(null); 241 doReturn(null).when(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
233 assertThat(mHelper.createNewAdminUser(mTestUserName)).isNull(); 242 assertThat(mCarUserManagerHelper.createNewAdminUser(mTestUserName)).isNull();
234 243
235 UserInfo newUser = new UserInfo(); 244 UserInfo newUser = new UserInfo();
236 newUser.name = mTestUserName; 245 newUser.name = mTestUserName;
237 when(mUserManager.createUser(mTestUserName, UserInfo.FLAG_ADMIN)).thenReturn(newUser); 246 doReturn(newUser).when(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
238 assertThat(mHelper.createNewAdminUser(mTestUserName)).isEqualTo(newUser); 247 assertThat(mCarUserManagerHelper.createNewAdminUser(mTestUserName)).isEqualTo(newUser);
239 } 248 }
240 249
241 @Test 250 @Test
@@ -243,11 +252,11 @@ public class CarUserManagerHelperTest {
243 String newAdminName = "Test new admin"; 252 String newAdminName = "Test new admin";
244 UserInfo expectedAdmin = new UserInfo(); 253 UserInfo expectedAdmin = new UserInfo();
245 expectedAdmin.name = newAdminName; 254 expectedAdmin.name = newAdminName;
246 when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin); 255 doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
247 256
248 // Admins can create other admins. 257 // Admins can create other admins.
249 when(mUserManager.isAdminUser()).thenReturn(true); 258 doReturn(true).when(mUserManager).isAdminUser();
250 UserInfo actualAdmin = mHelper.createNewAdminUser(newAdminName); 259 UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
251 assertThat(actualAdmin).isEqualTo(expectedAdmin); 260 assertThat(actualAdmin).isEqualTo(expectedAdmin);
252 } 261 }
253 262
@@ -256,11 +265,11 @@ public class CarUserManagerHelperTest {
256 String newAdminName = "Test new admin"; 265 String newAdminName = "Test new admin";
257 UserInfo expectedAdmin = new UserInfo(); 266 UserInfo expectedAdmin = new UserInfo();
258 expectedAdmin.name = newAdminName; 267 expectedAdmin.name = newAdminName;
259 when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin); 268 doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
260 269
261 // Test that non-admins cannot create new admins. 270 // Test that non-admins cannot create new admins.
262 when(mUserManager.isAdminUser()).thenReturn(false); // Current user non-admin. 271 doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
263 assertThat(mHelper.createNewAdminUser(newAdminName)).isNull(); 272 assertThat(mCarUserManagerHelper.createNewAdminUser(newAdminName)).isNull();
264 } 273 }
265 274
266 @Test 275 @Test
@@ -268,82 +277,99 @@ public class CarUserManagerHelperTest {
268 String newAdminName = "Test new admin"; 277 String newAdminName = "Test new admin";
269 UserInfo expectedAdmin = new UserInfo(); 278 UserInfo expectedAdmin = new UserInfo();
270 expectedAdmin.name = newAdminName; 279 expectedAdmin.name = newAdminName;
271 when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin); 280
281 doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
272 282
273 // System user can create admins. 283 // System user can create admins.
274 when(mUserManager.isSystemUser()).thenReturn(true); 284 doReturn(true).when(mUserManager).isSystemUser();
275 UserInfo actualAdmin = mHelper.createNewAdminUser(newAdminName); 285 UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
276 assertThat(actualAdmin).isEqualTo(expectedAdmin); 286 assertThat(actualAdmin).isEqualTo(expectedAdmin);
277 } 287 }
278 288
279 @Test 289 @Test
280 public void testCreateNewNonAdminUser() { 290 public void testCreateNewNonAdminUser() {
281 // Verify createUser on UserManager gets called. 291 // Verify createUser on UserManager gets called.
282 mHelper.createNewNonAdminUser(mTestUserName); 292 mCarUserManagerHelper.createNewNonAdminUser(mTestUserName);
283 verify(mUserManager).createUser(mTestUserName, 0); 293 verify(mUserManager).createUser(mTestUserName, 0);
284 294
285 when(mUserManager.createUser(mTestUserName, 0)).thenReturn(null); 295 doReturn(null).when(mUserManager).createUser(mTestUserName, 0);
286 assertThat(mHelper.createNewNonAdminUser(mTestUserName)).isNull(); 296 assertThat(mCarUserManagerHelper.createNewNonAdminUser(mTestUserName)).isNull();
287 297
288 UserInfo newUser = new UserInfo(); 298 UserInfo newUser = new UserInfo();
289 newUser.name = mTestUserName; 299 newUser.name = mTestUserName;
290 when(mUserManager.createUser(mTestUserName, 0)).thenReturn(newUser); 300 doReturn(newUser).when(mUserManager).createUser(mTestUserName, 0);
291 assertThat(mHelper.createNewNonAdminUser(mTestUserName)).isEqualTo(newUser); 301 assertThat(mCarUserManagerHelper.createNewNonAdminUser(mTestUserName)).isEqualTo(newUser);
292 } 302 }
293 303
294 @Test 304 @Test
295 public void testCannotRemoveSystemUser() { 305 public void testCannotRemoveSystemUser() {
296 assertThat(mHelper.removeUser(mSystemUser, mGuestUserName)).isFalse(); 306 assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse();
297 } 307 }
298 308
299 @Test 309 @Test
300 public void testAdminsCanRemoveOtherUsers() { 310 public void testAdminsCanRemoveOtherUsers() {
301 int idToRemove = mCurrentProcessUser.id + 2; 311 int idToRemove = mCurrentProcessUser.id + 2;
302 UserInfo userToRemove = createUserInfoForId(idToRemove); 312 UserInfo userToRemove = createUserInfoForId(idToRemove);
303 when(mUserManager.removeUser(idToRemove)).thenReturn(true); 313
314 doReturn(true).when(mUserManager).removeUser(idToRemove);
304 315
305 // If Admin is removing non-current, non-system user, simply calls removeUser. 316 // If Admin is removing non-current, non-system user, simply calls removeUser.
306 when(mUserManager.isAdminUser()).thenReturn(true); 317 doReturn(true).when(mUserManager).isAdminUser();
307 assertThat(mHelper.removeUser(userToRemove, mGuestUserName)).isTrue(); 318 assertThat(mCarUserManagerHelper.removeUser(userToRemove, mGuestUserName)).isTrue();
308 verify(mUserManager).removeUser(idToRemove); 319 verify(mUserManager).removeUser(idToRemove);
309 } 320 }
310 321
311 @Test 322 @Test
312 public void testNonAdminsCanOnlyRemoveThemselves() { 323 public void testNonAdminsCanNotRemoveOtherUsers() {
313 UserInfo otherUser = createUserInfoForId(mCurrentProcessUser.id + 2); 324 UserInfo otherUser = createUserInfoForId(mCurrentProcessUser.id + 2);
314 325
315 // Make current user non-admin. 326 // Make current user non-admin.
316 when(mUserManager.isAdminUser()).thenReturn(false); 327 doReturn(false).when(mUserManager).isAdminUser();
317 328
318 // Mock so that removeUser always pretends it's successful. 329 // Mock so that removeUser always pretends it's successful.
319 when(mUserManager.removeUser(anyInt())).thenReturn(true); 330 doReturn(true).when(mUserManager).removeUser(anyInt());
320 331
321 // If Non-Admin is trying to remove someone other than themselves, they should fail. 332 // If Non-Admin is trying to remove someone other than themselves, they should fail.
322 assertThat(mHelper.removeUser(otherUser, mGuestUserName)).isFalse(); 333 assertThat(mCarUserManagerHelper.removeUser(otherUser, mGuestUserName)).isFalse();
323 verify(mUserManager, never()).removeUser(otherUser.id); 334 verify(mUserManager, never()).removeUser(otherUser.id);
324 } 335 }
325 336
326 @Test 337 @Test
338 public void testRemoveLastActiveUser() {
339 // Cannot remove system user.
340 assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse();
341
342 UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN);
343 List<UserInfo> users = new ArrayList<UserInfo>();
344 users.add(adminInfo);
345
346 doReturn(users).when(mUserManager).getUsers(true);
347
348 assertThat(mCarUserManagerHelper.removeUser(adminInfo, mGuestUserName))
349 .isEqualTo(false);
350 }
351
352 @Test
327 public void testSwitchToGuest() { 353 public void testSwitchToGuest() {
328 mHelper.startNewGuestSession(mGuestUserName); 354 mCarUserManagerHelper.startNewGuestSession(mGuestUserName);
329 verify(mUserManager).createGuest(mContext, mGuestUserName); 355 verify(mUserManager).createGuest(mContext, mGuestUserName);
330 356
331 UserInfo guestInfo = new UserInfo(21, mGuestUserName, UserInfo.FLAG_GUEST); 357 UserInfo guestInfo = new UserInfo(/* id= */21, mGuestUserName, UserInfo.FLAG_GUEST);
332 when(mUserManager.createGuest(mContext, mGuestUserName)).thenReturn(guestInfo); 358 doReturn(guestInfo).when(mUserManager).createGuest(mContext, mGuestUserName);
333 mHelper.startNewGuestSession(mGuestUserName); 359 mCarUserManagerHelper.startNewGuestSession(mGuestUserName);
334 verify(mActivityManager).switchUser(21); 360 verify(mActivityManager).switchUser(21);
335 } 361 }
336 362
337 @Test 363 @Test
338 public void testGetUserIcon() { 364 public void testGetUserIcon() {
339 mHelper.getUserIcon(mCurrentProcessUser); 365 mCarUserManagerHelper.getUserIcon(mCurrentProcessUser);
340 verify(mUserManager).getUserIcon(mCurrentProcessUser.id); 366 verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
341 } 367 }
342 368
343 @Test 369 @Test
344 public void testScaleUserIcon() { 370 public void testScaleUserIcon() {
345 Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); 371 Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
346 Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300); 372 Drawable scaledIcon = mCarUserManagerHelper.scaleUserIcon(fakeIcon, 300);
347 assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300); 373 assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
348 assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300); 374 assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
349 } 375 }
@@ -352,17 +378,17 @@ public class CarUserManagerHelperTest {
352 public void testSetUserName() { 378 public void testSetUserName() {
353 UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3); 379 UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
354 String newName = "New Test Name"; 380 String newName = "New Test Name";
355 mHelper.setUserName(testInfo, newName); 381 mCarUserManagerHelper.setUserName(testInfo, newName);
356 verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, newName); 382 verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, newName);
357 } 383 }
358 384
359 @Test 385 @Test
360 public void testIsCurrentProcessSystemUser() { 386 public void testIsCurrentProcessSystemUser() {
361 when(mUserManager.isAdminUser()).thenReturn(true); 387 doReturn(true).when(mUserManager).isAdminUser();
362 assertThat(mHelper.isCurrentProcessAdminUser()).isTrue(); 388 assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isTrue();
363 389
364 when(mUserManager.isAdminUser()).thenReturn(false); 390 doReturn(false).when(mUserManager).isAdminUser();
365 assertThat(mHelper.isCurrentProcessAdminUser()).isFalse(); 391 assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isFalse();
366 } 392 }
367 393
368 @Test 394 @Test
@@ -371,13 +397,13 @@ public class CarUserManagerHelperTest {
371 UserInfo testInfo = createUserInfoForId(userId); 397 UserInfo testInfo = createUserInfoForId(userId);
372 398
373 // Test that non-admins cannot assign admin privileges. 399 // Test that non-admins cannot assign admin privileges.
374 when(mUserManager.isAdminUser()).thenReturn(false); // Current user non-admin. 400 doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
375 mHelper.assignAdminPrivileges(testInfo); 401 mCarUserManagerHelper.assignAdminPrivileges(testInfo);
376 verify(mUserManager, never()).setUserAdmin(userId); 402 verify(mUserManager, never()).setUserAdmin(userId);
377 403
378 // Admins can assign admin privileges. 404 // Admins can assign admin privileges.
379 when(mUserManager.isAdminUser()).thenReturn(true); 405 doReturn(true).when(mUserManager).isAdminUser();
380 mHelper.assignAdminPrivileges(testInfo); 406 mCarUserManagerHelper.assignAdminPrivileges(testInfo);
381 verify(mUserManager).setUserAdmin(userId); 407 verify(mUserManager).setUserAdmin(userId);
382 } 408 }
383 409
@@ -386,11 +412,13 @@ public class CarUserManagerHelperTest {
386 int userId = 20; 412 int userId = 20;
387 UserInfo testInfo = createUserInfoForId(userId); 413 UserInfo testInfo = createUserInfoForId(userId);
388 414
389 mHelper.setUserRestriction(testInfo, UserManager.DISALLOW_ADD_USER, /* enable= */ true); 415 mCarUserManagerHelper.setUserRestriction(
416 testInfo, UserManager.DISALLOW_ADD_USER, /* enable= */ true);
390 verify(mUserManager).setUserRestriction( 417 verify(mUserManager).setUserRestriction(
391 UserManager.DISALLOW_ADD_USER, true, UserHandle.of(userId)); 418 UserManager.DISALLOW_ADD_USER, true, UserHandle.of(userId));
392 419
393 mHelper.setUserRestriction(testInfo, UserManager.DISALLOW_REMOVE_USER, /* enable= */ false); 420 mCarUserManagerHelper.setUserRestriction(
421 testInfo, UserManager.DISALLOW_REMOVE_USER, /* enable= */ false);
394 verify(mUserManager).setUserRestriction( 422 verify(mUserManager).setUserRestriction(
395 UserManager.DISALLOW_REMOVE_USER, false, UserHandle.of(userId)); 423 UserManager.DISALLOW_REMOVE_USER, false, UserHandle.of(userId));
396 } 424 }
@@ -400,9 +428,10 @@ public class CarUserManagerHelperTest {
400 String testUserName = "Test User"; 428 String testUserName = "Test User";
401 int userId = 20; 429 int userId = 20;
402 UserInfo newNonAdmin = createUserInfoForId(userId); 430 UserInfo newNonAdmin = createUserInfoForId(userId);
403 when(mUserManager.createUser(testUserName, /* flags= */ 0)).thenReturn(newNonAdmin);
404 431
405 mHelper.createNewNonAdminUser(testUserName); 432 doReturn(newNonAdmin).when(mUserManager).createUser(testUserName, /* flags= */ 0);
433
434 mCarUserManagerHelper.createNewNonAdminUser(testUserName);
406 435
407 verify(mUserManager).setUserRestriction( 436 verify(mUserManager).setUserRestriction(
408 UserManager.DISALLOW_FACTORY_RESET, /* enable= */ true, UserHandle.of(userId)); 437 UserManager.DISALLOW_FACTORY_RESET, /* enable= */ true, UserHandle.of(userId));
@@ -417,9 +446,11 @@ public class CarUserManagerHelperTest {
417 int testUserId = 30; 446 int testUserId = 30;
418 boolean restrictionEnabled = false; 447 boolean restrictionEnabled = false;
419 UserInfo testInfo = createUserInfoForId(testUserId); 448 UserInfo testInfo = createUserInfoForId(testUserId);
420 when(mUserManager.isAdminUser()).thenReturn(true); // Only admins can assign privileges.
421 449
422 mHelper.assignAdminPrivileges(testInfo); 450 // Only admins can assign privileges.
451 doReturn(true).when(mUserManager).isAdminUser();
452
453 mCarUserManagerHelper.assignAdminPrivileges(testInfo);
423 454
424 verify(mUserManager).setUserRestriction( 455 verify(mUserManager).setUserRestriction(
425 UserManager.DISALLOW_FACTORY_RESET, restrictionEnabled, UserHandle.of(testUserId)); 456 UserManager.DISALLOW_FACTORY_RESET, restrictionEnabled, UserHandle.of(testUserId));
@@ -427,7 +458,7 @@ public class CarUserManagerHelperTest {
427 458
428 @Test 459 @Test
429 public void testRegisterUserChangeReceiver() { 460 public void testRegisterUserChangeReceiver() {
430 mHelper.registerOnUsersUpdateListener(mTestListener); 461 mCarUserManagerHelper.registerOnUsersUpdateListener(mTestListener);
431 462
432 ArgumentCaptor<BroadcastReceiver> receiverCaptor = 463 ArgumentCaptor<BroadcastReceiver> receiverCaptor =
433 ArgumentCaptor.forClass(BroadcastReceiver.class); 464 ArgumentCaptor.forClass(BroadcastReceiver.class);
@@ -465,10 +496,52 @@ public class CarUserManagerHelperTest {
465 assertThat(handlerCaptor.getValue()).isNull(); 496 assertThat(handlerCaptor.getValue()).isNull();
466 497
467 // Unregister the receiver. 498 // Unregister the receiver.
468 mHelper.unregisterOnUsersUpdateListener(); 499 mCarUserManagerHelper.unregisterOnUsersUpdateListener();
469 verify(mContext).unregisterReceiver(receiverCaptor.getValue()); 500 verify(mContext).unregisterReceiver(receiverCaptor.getValue());
470 } 501 }
471 502
503 @Test
504 public void testGetInitialUserWithValidLastActiveUser() {
505 SystemProperties.set("android.car.systemuser.headless", "true");
506 int lastActiveUserId = 12;
507
508 UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
509 UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
510 UserInfo otherUser3 = createUserInfoForId(lastActiveUserId);
511
512 List<UserInfo> testUsers = new ArrayList<>();
513 testUsers.add(mSystemUser);
514 testUsers.add(otherUser1);
515 testUsers.add(otherUser2);
516 testUsers.add(otherUser3);
517
518 mCarUserManagerHelper.setLastActiveUser(
519 lastActiveUserId, /* skipGlobalSettings= */ true);
520 doReturn(testUsers).when(mUserManager).getUsers(true);
521
522 assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId);
523 }
524
525 @Test
526 public void testGetInitialUserWithNonExistLastActiveUser() {
527 SystemProperties.set("android.car.systemuser.headless", "true");
528 int lastActiveUserId = 12;
529
530 UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
531 UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
532
533 List<UserInfo> testUsers = new ArrayList<>();
534 testUsers.add(mSystemUser);
535 testUsers.add(otherUser1);
536 testUsers.add(otherUser2);
537
538 mCarUserManagerHelper.setLastActiveUser(
539 lastActiveUserId, /* skipGlobalSettings= */ true);
540 doReturn(testUsers).when(mUserManager).getUsers(true);
541
542 assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId - 2);
543 }
544
472 private UserInfo createUserInfoForId(int id) { 545 private UserInfo createUserInfoForId(int id) {
473 UserInfo userInfo = new UserInfo(); 546 UserInfo userInfo = new UserInfo();
474 userInfo.id = id; 547 userInfo.id = id;
diff --git a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
index 20cb060f..a6b48bf8 100644
--- a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
@@ -84,9 +84,10 @@ public class CarUserServiceTest {
84 mCarUserService.init(); 84 mCarUserService.init();
85 verify(mMockContext).registerReceiver(eq(mCarUserService), argument.capture()); 85 verify(mMockContext).registerReceiver(eq(mCarUserService), argument.capture());
86 IntentFilter intentFilter = argument.getValue(); 86 IntentFilter intentFilter = argument.getValue();
87 assertThat(intentFilter.countActions()).isEqualTo(1); 87 assertThat(intentFilter.countActions()).isEqualTo(2);
88 88
89 assertThat(intentFilter.getAction(0)).isEqualTo(Intent.ACTION_LOCKED_BOOT_COMPLETED); 89 assertThat(intentFilter.getAction(0)).isEqualTo(Intent.ACTION_LOCKED_BOOT_COMPLETED);
90 assertThat(intentFilter.getAction(1)).isEqualTo(Intent.ACTION_USER_SWITCHED);
90 } 91 }
91 92
92 /** 93 /**
@@ -139,4 +140,47 @@ public class CarUserServiceTest {
139 verify(mCarUserManagerHelper). 140 verify(mCarUserManagerHelper).
140 setUserRestriction(user0, UserManager.DISALLOW_MODIFY_ACCOUNTS, true); 141 setUserRestriction(user0, UserManager.DISALLOW_MODIFY_ACCOUNTS, true);
141 } 142 }
143
144 /**
145 * Test that the {@link CarUserService} starts up the last active user on reboot.
146 */
147 @Test
148 public void testStartsLastActiveUserOnReboot() {
149 List<UserInfo> users = new ArrayList<>();
150
151 int adminUserId = 10;
152 UserInfo admin = new UserInfo(adminUserId, CarUserService.OWNER_NAME, UserInfo.FLAG_ADMIN);
153
154 int secUserId = 11;
155 UserInfo secUser =
156 new UserInfo(secUserId, CarUserService.OWNER_NAME, UserInfo.FLAG_ADMIN);
157
158 users.add(admin);
159 users.add(secUser);
160
161 doReturn(users).when(mCarUserManagerHelper).getAllUsers();
162 doReturn(secUserId).when(mCarUserManagerHelper).getLastActiveUser();
163
164 mCarUserService.onReceive(mMockContext,
165 new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
166
167 verify(mCarUserManagerHelper).switchToUserId(secUserId);
168 }
169
170 /**
171 * Test that the {@link CarUserService} updates last active user on user switch intent.
172 */
173 @Test
174 public void testLastActiveUserUpdatedOnUserSwitch() {
175 int lastActiveUserId = 11;
176
177 doReturn(false).when(mCarUserManagerHelper).isForegroundUserGuest();
178 doReturn(lastActiveUserId).when(mCarUserManagerHelper).getCurrentForegroundUserId();
179
180 mCarUserService.onReceive(mMockContext,
181 new Intent(Intent.ACTION_USER_SWITCHED));
182
183 verify(mCarUserManagerHelper).setLastActiveUser(
184 lastActiveUserId, /* skipGlobalSetting= */ false);
185 }
142} 186}