diff options
author | Ying Zheng | 2018-06-19 18:01:05 -0500 |
---|---|---|
committer | Ying Zheng | 2018-06-20 18:42:07 -0500 |
commit | f4339b8cb132a3b6635f4516eb7f65cf8e074fe7 (patch) | |
tree | a0b8c826ec1b60d6a2cc0ff791e71dc9f78f7258 /tests | |
parent | d812d4c1ac4590e98d41c01fab14f654ea0b3657 (diff) | |
download | platform-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.java | 267 | ||||
-rw-r--r-- | tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java | 46 |
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; | |||
19 | import static com.google.common.truth.Truth.assertThat; | 19 | import static com.google.common.truth.Truth.assertThat; |
20 | 20 | ||
21 | import static org.mockito.ArgumentMatchers.anyInt; | 21 | import static org.mockito.ArgumentMatchers.anyInt; |
22 | import static org.mockito.Mockito.doReturn; | ||
22 | import static org.mockito.Mockito.never; | 23 | import static org.mockito.Mockito.never; |
23 | import static org.mockito.Mockito.verify; | 24 | import static org.mockito.Mockito.verify; |
24 | import static org.mockito.Mockito.when; | ||
25 | 25 | ||
26 | import android.app.ActivityManager; | 26 | import android.app.ActivityManager; |
27 | import android.car.user.CarUserManagerHelper; | 27 | import android.car.user.CarUserManagerHelper; |
@@ -40,6 +40,10 @@ import android.support.test.InstrumentationRegistry; | |||
40 | import android.support.test.filters.SmallTest; | 40 | import android.support.test.filters.SmallTest; |
41 | import android.support.test.runner.AndroidJUnit4; | 41 | import android.support.test.runner.AndroidJUnit4; |
42 | 42 | ||
43 | import java.util.ArrayList; | ||
44 | import java.util.Arrays; | ||
45 | import java.util.List; | ||
46 | |||
43 | import org.junit.Before; | 47 | import org.junit.Before; |
44 | import org.junit.Test; | 48 | import org.junit.Test; |
45 | import org.junit.runner.RunWith; | 49 | import org.junit.runner.RunWith; |
@@ -47,10 +51,6 @@ import org.mockito.ArgumentCaptor; | |||
47 | import org.mockito.Mock; | 51 | import org.mockito.Mock; |
48 | import org.mockito.MockitoAnnotations; | 52 | import org.mockito.MockitoAnnotations; |
49 | 53 | ||
50 | import java.util.ArrayList; | ||
51 | import java.util.Arrays; | ||
52 | import 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 | } |