blob: 3a7430b49d236910f5d380116446fc41d161cb5b [file] [log] [blame]
Felipe Leme8cb16852020-03-17 13:56:44 -07001/*
2 * Copyright (C) 2020 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 */
Mayank Garg665c20b2020-08-07 16:19:28 -070016package com.android.car.user;
Felipe Leme8cb16852020-03-17 13:56:44 -070017
Mayank Garge90a4082020-09-30 12:57:34 -070018import static android.car.test.mocks.AndroidMockitoHelper.mockUmGetAliveUsers;
19import static android.car.test.mocks.AndroidMockitoHelper.mockUmGetSystemUser;
20import static android.car.test.mocks.AndroidMockitoHelper.mockUmGetUserInfo;
felipeal7f731772020-04-27 14:16:43 -070021import static android.car.test.mocks.CarArgumentMatchers.isUserInfo;
felipeal1b9eae82020-04-28 17:30:11 -070022import static android.car.test.util.UserTestingHelper.newGuestUser;
23import static android.car.test.util.UserTestingHelper.newSecondaryUser;
Mayank Garge90a4082020-09-30 12:57:34 -070024import static android.car.test.util.UserTestingHelper.newUser;
25import static android.os.UserHandle.USER_SYSTEM;
felipeal7f731772020-04-27 14:16:43 -070026
felipeal283b58f2020-04-01 12:49:05 -070027import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
felipeal283b58f2020-04-01 12:49:05 -070028
felipeald38a34a2020-03-31 11:17:10 -070029import static com.google.common.truth.Truth.assertThat;
felipeal61ce3732020-04-03 11:01:00 -070030import static com.google.common.truth.Truth.assertWithMessage;
felipeald38a34a2020-03-31 11:17:10 -070031
felipealf43e3632020-03-25 09:56:21 -070032import static org.mockito.ArgumentMatchers.anyBoolean;
Felipe Leme8cb16852020-03-17 13:56:44 -070033import static org.mockito.ArgumentMatchers.anyInt;
felipealc5683ce2020-03-19 18:31:59 -070034import static org.mockito.ArgumentMatchers.anyString;
felipeal53e5ee82020-05-15 17:47:24 -070035import static org.mockito.ArgumentMatchers.argThat;
felipealf43e3632020-03-25 09:56:21 -070036import static org.mockito.ArgumentMatchers.eq;
felipeald38a34a2020-03-31 11:17:10 -070037import static org.mockito.Mockito.doReturn;
Felipe Leme8cb16852020-03-17 13:56:44 -070038import static org.mockito.Mockito.never;
39import static org.mockito.Mockito.spy;
40import static org.mockito.Mockito.verify;
41import static org.mockito.Mockito.when;
felipeald38a34a2020-03-31 11:17:10 -070042import static org.testng.Assert.assertThrows;
Felipe Leme8cb16852020-03-17 13:56:44 -070043
felipeale47b6c52020-03-18 17:53:10 -070044import android.annotation.NonNull;
Felipe Leme8cb16852020-03-17 13:56:44 -070045import android.annotation.Nullable;
46import android.annotation.UserIdInt;
felipeal283b58f2020-04-01 12:49:05 -070047import android.app.ActivityManager;
felipealae8b5e92020-04-08 13:07:36 -070048import android.app.IActivityManager;
Mayank Garge90a4082020-09-30 12:57:34 -070049import android.car.settings.CarSettings;
felipeal1b9eae82020-04-28 17:30:11 -070050import android.car.test.mocks.AbstractExtendedMockitoTestCase;
felipeala68ecef2020-05-19 12:46:08 -070051import android.content.Context;
Felipe Leme8cb16852020-03-17 13:56:44 -070052import android.content.pm.UserInfo;
53import android.content.pm.UserInfo.UserInfoFlag;
54import android.hardware.automotive.vehicle.V2_0.UserFlags;
felipealae8b5e92020-04-08 13:07:36 -070055import android.os.RemoteException;
felipealf43e3632020-03-25 09:56:21 -070056import android.os.UserHandle;
Felipe Leme8cb16852020-03-17 13:56:44 -070057import android.os.UserManager;
felipeala68ecef2020-05-19 12:46:08 -070058import android.provider.Settings;
Mayank Garge90a4082020-09-30 12:57:34 -070059import android.sysprop.CarProperties;
Felipe Leme8cb16852020-03-17 13:56:44 -070060
Mayank Garg665c20b2020-08-07 16:19:28 -070061import com.android.car.user.InitialUserSetter.Builder;
62import com.android.car.user.InitialUserSetter.InitialUserInfo;
Yan Zhu185a3102020-04-06 22:43:54 -070063import com.android.internal.widget.LockPatternUtils;
64
Felipe Leme8cb16852020-03-17 13:56:44 -070065import org.junit.Before;
66import org.junit.Test;
Felipe Leme8cb16852020-03-17 13:56:44 -070067import org.mockito.Mock;
Felipe Leme8cb16852020-03-17 13:56:44 -070068
Mayank Garge90a4082020-09-30 12:57:34 -070069import java.util.Optional;
felipeal61ce3732020-04-03 11:01:00 -070070import java.util.function.Consumer;
71
felipeal1b9eae82020-04-28 17:30:11 -070072public final class InitialUserSetterTest extends AbstractExtendedMockitoTestCase {
Felipe Leme8cb16852020-03-17 13:56:44 -070073
felipeald1643e02020-03-23 14:52:04 -070074 @UserInfoFlag
75 private static final int NO_FLAGS = 0;
76
77 private static final String OWNER_NAME = "OwnerOfALonelyDevice";
felipeald38a34a2020-03-31 11:17:10 -070078 private static final String GUEST_NAME = "GuessWhot";
felipeald1643e02020-03-23 14:52:04 -070079
felipeal283b58f2020-04-01 12:49:05 -070080 private static final int USER_ID = 10;
81 private static final int NEW_USER_ID = 11;
82 private static final int CURRENT_USER_ID = 12;
83
Felipe Leme8cb16852020-03-17 13:56:44 -070084 @Mock
felipeala68ecef2020-05-19 12:46:08 -070085 private Context mContext;
86
87 @Mock
felipealae8b5e92020-04-08 13:07:36 -070088 private IActivityManager mIActivityManager;
89
90 @Mock
Felipe Leme8cb16852020-03-17 13:56:44 -070091 private UserManager mUm;
92
Yan Zhu185a3102020-04-06 22:43:54 -070093 @Mock
Felipe Lemecceb2992020-11-18 18:22:44 -080094 private CarUserService mCarUserService;
95
96 @Mock
Yan Zhu185a3102020-04-06 22:43:54 -070097 private LockPatternUtils mLockPatternUtils;
98
Felipe Leme8cb16852020-03-17 13:56:44 -070099 // Spy used in tests that need to verify the default behavior as fallback
100 private InitialUserSetter mSetter;
101
felipeal61ce3732020-04-03 11:01:00 -0700102 private final MyListener mListener = new MyListener();
103
felipeal3e8b49d2020-04-27 14:16:43 -0700104 @Override
105 protected void onSessionBuilder(CustomMockitoSessionBuilder session) {
106 session
107 .spyStatic(ActivityManager.class)
Mayank Garge90a4082020-09-30 12:57:34 -0700108 .spyStatic(CarProperties.class)
felipeal3e8b49d2020-04-27 14:16:43 -0700109 .spyStatic(UserManager.class);
110 }
111
Felipe Leme8cb16852020-03-17 13:56:44 -0700112 @Before
113 public void setFixtures() {
Felipe Lemecceb2992020-11-18 18:22:44 -0800114 mSetter = spy(new InitialUserSetter(mContext, mUm, mCarUserService, mListener,
felipeal53e5ee82020-05-15 17:47:24 -0700115 mLockPatternUtils, OWNER_NAME, GUEST_NAME));
felipeal283b58f2020-04-01 12:49:05 -0700116
felipealae8b5e92020-04-08 13:07:36 -0700117 doReturn(mIActivityManager).when(() -> ActivityManager.getService());
felipeal3e8b49d2020-04-27 14:16:43 -0700118 mockGetCurrentUser(CURRENT_USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700119 }
120
121 @Test
felipeal53e5ee82020-05-15 17:47:24 -0700122 public void testSet_null() throws Exception {
123 assertThrows(IllegalArgumentException.class, () -> mSetter.set(null));
124 }
125
126 @Test
127 public void testInitialUserInfoBuilder_invalidType() throws Exception {
128 assertThrows(IllegalArgumentException.class, () -> new InitialUserSetter.Builder(-1));
129 }
130
131 @Test
132 public void testInitialUserInfoBuilder_invalidSetSwitchUserId() throws Exception {
133 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
134 InitialUserSetter.TYPE_CREATE);
135 assertThrows(IllegalArgumentException.class, () -> builder.setSwitchUserId(USER_ID));
136 }
137
138 @Test
139 public void testInitialUserInfoBuilder_invalidSetNewUserName() throws Exception {
140 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
141 InitialUserSetter.TYPE_SWITCH);
142 assertThrows(IllegalArgumentException.class, () -> builder.setNewUserName(OWNER_NAME));
143 }
144
145 @Test
146 public void testInitialUserInfoBuilder_invalidSetNewUserFlags() throws Exception {
147 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
148 InitialUserSetter.TYPE_SWITCH);
149 assertThrows(IllegalArgumentException.class,
150 () -> builder.setNewUserFlags(UserFlags.ADMIN));
151 }
152
153 @Test
felipeald38a34a2020-03-31 11:17:10 -0700154 public void testSwitchUser_ok_nonGuest() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700155 UserInfo user = expectUserExists(USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700156 expectSwitchUser(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700157
felipeal53e5ee82020-05-15 17:47:24 -0700158 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
159 .setSwitchUserId(USER_ID)
160 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700161
felipeal283b58f2020-04-01 12:49:05 -0700162 verifyUserSwitched(USER_ID);
felipealc5683ce2020-03-19 18:31:59 -0700163 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700164 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700165 assertInitialUserSet(user);
felipealf43e3632020-03-25 09:56:21 -0700166 }
167
168 @Test
169 public void testSwitchUser_ok_systemUser() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700170 UserInfo user = expectUserExists(UserHandle.USER_SYSTEM);
felipealf43e3632020-03-25 09:56:21 -0700171 expectSwitchUser(UserHandle.USER_SYSTEM);
172
felipeal53e5ee82020-05-15 17:47:24 -0700173 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
174 .setSwitchUserId(UserHandle.USER_SYSTEM)
175 .build());
felipealf43e3632020-03-25 09:56:21 -0700176
177 verifyUserSwitched(UserHandle.USER_SYSTEM);
178 verifyFallbackDefaultBehaviorNeverCalled();
179 verifySystemUserNeverUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700180 assertInitialUserSet(user);
Felipe Leme8cb16852020-03-17 13:56:44 -0700181 }
182
183 @Test
felipeald38a34a2020-03-31 11:17:10 -0700184 public void testSwitchUser_ok_guestReplaced() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700185 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipeal3e8b49d2020-04-27 14:16:43 -0700186 mockGetCurrentUser(CURRENT_USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700187 expectGuestExists(USER_ID, ephemeral); // ephemeral doesn't matter
188 UserInfo newGuest = newGuestUser(NEW_USER_ID, ephemeral);
189 expectGuestReplaced(USER_ID, newGuest);
felipeal283b58f2020-04-01 12:49:05 -0700190 expectSwitchUser(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700191
felipeal53e5ee82020-05-15 17:47:24 -0700192 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
193 .setSwitchUserId(USER_ID)
194 .setReplaceGuest(true)
195 .build());
felipeald38a34a2020-03-31 11:17:10 -0700196
felipeal283b58f2020-04-01 12:49:05 -0700197 verifyUserSwitched(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700198 verifyFallbackDefaultBehaviorNeverCalled();
199 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700200 verifyUserDeleted(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700201 assertInitialUserSet(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700202 }
203
204 @Test
felipealc59107a2020-04-10 16:18:34 -0700205 public void testSwitchUser_ok_guestDoesNotNeedToBeReplaced() throws Exception {
felipeal09807c22020-04-09 15:16:52 -0700206 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipealc59107a2020-04-10 16:18:34 -0700207 UserInfo existingGuest = expectGuestExists(USER_ID, ephemeral);
felipeal09807c22020-04-09 15:16:52 -0700208 expectSwitchUser(USER_ID);
209
felipeal53e5ee82020-05-15 17:47:24 -0700210 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
211 .setSwitchUserId(USER_ID)
212 .setReplaceGuest(false)
213 .build());
felipeal09807c22020-04-09 15:16:52 -0700214
felipealc59107a2020-04-10 16:18:34 -0700215 verifyUserSwitched(USER_ID);
felipeal09807c22020-04-09 15:16:52 -0700216 verifyGuestNeverMarkedForDeletion();
217 verifyFallbackDefaultBehaviorNeverCalled();
218 verifySystemUserUnlocked();
felipealc59107a2020-04-10 16:18:34 -0700219 assertInitialUserSet(existingGuest);
felipeal09807c22020-04-09 15:16:52 -0700220 }
221
felipeal53e5ee82020-05-15 17:47:24 -0700222
felipeal09807c22020-04-09 15:16:52 -0700223 @Test
felipeald38a34a2020-03-31 11:17:10 -0700224 public void testSwitchUser_fail_guestReplacementFailed() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700225 expectGuestExists(USER_ID, /* isEphemeral= */ true); // ephemeral doesn't matter
felipeal61ce3732020-04-03 11:01:00 -0700226 expectGuestReplaced(USER_ID, /* newGuest= */ null);
felipeald38a34a2020-03-31 11:17:10 -0700227
felipeal53e5ee82020-05-15 17:47:24 -0700228 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
229 .setSwitchUserId(USER_ID)
230 .setReplaceGuest(true)
231 .build());
felipeald38a34a2020-03-31 11:17:10 -0700232
233 verifyUserNeverSwitched();
234 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
235 verifySystemUserNeverUnlocked();
236 }
237
238 @Test
felipeal283b58f2020-04-01 12:49:05 -0700239 public void testSwitchUser_fail_switchFail() throws Exception {
240 expectUserExists(USER_ID);
felipealae8b5e92020-04-08 13:07:36 -0700241 expectSwitchUserFails(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700242
felipeal53e5ee82020-05-15 17:47:24 -0700243 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
244 .setSwitchUserId(USER_ID)
245 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700246
felipealf43e3632020-03-25 09:56:21 -0700247 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
248 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700249 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -0700250 }
251
252 @Test
felipeal283b58f2020-04-01 12:49:05 -0700253 public void testSwitchUser_fail_userDoesntExist() throws Exception {
felipeald38a34a2020-03-31 11:17:10 -0700254 // No need to set user exists expectation / will return null by default
255
felipeal53e5ee82020-05-15 17:47:24 -0700256 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
257 .setSwitchUserId(USER_ID)
258 .build());
felipeald38a34a2020-03-31 11:17:10 -0700259
260 verifyUserNeverSwitched();
261 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
262 verifySystemUserNeverUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700263 }
264
265 @Test
felipeal23e068b2020-04-10 13:53:03 -0700266 public void testSwitchUser_fail_switchThrowsException() throws Exception {
267 expectUserExists(USER_ID);
268 expectSwitchUserThrowsException(USER_ID);
269
felipeal53e5ee82020-05-15 17:47:24 -0700270 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
271 .setSwitchUserId(USER_ID)
272 .build());
felipeal23e068b2020-04-10 13:53:03 -0700273
274 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
275 verifySystemUserUnlocked();
276 verifyLastActiveUserNeverSet();
277 }
278
279 @Test
felipeal283b58f2020-04-01 12:49:05 -0700280 public void testSwitchUser_ok_targetIsCurrentUser() throws Exception {
felipeal3e8b49d2020-04-27 14:16:43 -0700281 mockGetCurrentUser(CURRENT_USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700282 UserInfo currentUser = expectUserExists(CURRENT_USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700283
felipeal53e5ee82020-05-15 17:47:24 -0700284 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
285 .setSwitchUserId(CURRENT_USER_ID)
286 .build());
felipeal283b58f2020-04-01 12:49:05 -0700287
288 verifyUserNeverSwitched();
289 verifyFallbackDefaultBehaviorNeverCalled();
290 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700291 assertInitialUserSet(currentUser);
felipeald38a34a2020-03-31 11:17:10 -0700292 }
293
294 @Test
295 public void testReplaceGuestIfNeeded_null() {
296 assertThrows(IllegalArgumentException.class, () -> mSetter.replaceGuestIfNeeded(null));
297 }
298
299 @Test
300 public void testReplaceGuestIfNeeded_nonGuest() {
felipeal283b58f2020-04-01 12:49:05 -0700301 UserInfo user = newSecondaryUser(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700302
Alexander Dorokhine1b903752020-09-18 15:45:10 -0700303 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameInstanceAs(user);
felipeald38a34a2020-03-31 11:17:10 -0700304
305 verifyGuestNeverMarkedForDeletion();
306 verifyUserNeverCreated();
307 }
308
309 @Test
310 public void testReplaceGuestIfNeeded_ok_nonEphemeralGuest() {
felipeal61ce3732020-04-03 11:01:00 -0700311 UserInfo newGuest = expectCreateGuestUser(NEW_USER_ID, GUEST_NAME, NO_FLAGS);
felipeal283b58f2020-04-01 12:49:05 -0700312 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ false);
felipeal61ce3732020-04-03 11:01:00 -0700313
Alexander Dorokhine1b903752020-09-18 15:45:10 -0700314 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameInstanceAs(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700315
felipeal283b58f2020-04-01 12:49:05 -0700316 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700317 }
318
319 @Test
Yan Zhu185a3102020-04-06 22:43:54 -0700320 public void testReplaceGuestIfNeeded_lockScreen() throws Exception {
321 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ false);
322 expectUserIsSecure(USER_ID);
Alexander Dorokhine1b903752020-09-18 15:45:10 -0700323 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameInstanceAs(user);
Yan Zhu185a3102020-04-06 22:43:54 -0700324
325 verifyGuestNeverMarkedForDeletion();
326 verifyUserNeverCreated();
327 }
328
329 @Test
felipeald38a34a2020-03-31 11:17:10 -0700330 public void testReplaceGuestIfNeeded_ok_ephemeralGuest() {
felipeal61ce3732020-04-03 11:01:00 -0700331 UserInfo newGuest = expectCreateGuestUser(NEW_USER_ID, GUEST_NAME, UserInfo.FLAG_EPHEMERAL);
felipeal283b58f2020-04-01 12:49:05 -0700332 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ true);
felipeal61ce3732020-04-03 11:01:00 -0700333
Alexander Dorokhine1b903752020-09-18 15:45:10 -0700334 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameInstanceAs(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700335
felipeal283b58f2020-04-01 12:49:05 -0700336 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700337 }
338
339 @Test
340 public void testReplaceGuestIfNeeded_fail_ephemeralGuest_createFailed() {
341 // don't set create guest expectation, so it returns null
342
felipeal283b58f2020-04-01 12:49:05 -0700343 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ true);
felipeal61ce3732020-04-03 11:01:00 -0700344 assertThat(mSetter.replaceGuestIfNeeded(user)).isEqualTo(null);
felipeald38a34a2020-03-31 11:17:10 -0700345
felipeal283b58f2020-04-01 12:49:05 -0700346 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700347 }
348
349 @Test
Mayank Garg09aa7292020-08-05 17:10:52 -0700350 public void testCanReplaceGuestUser_NotGuest() {
351 UserInfo user = expectUserExists(USER_ID);
352
353 assertThat(mSetter.canReplaceGuestUser(user)).isFalse();
354 }
355
356 @Test
357 public void testCanReplaceGuestUser_Guest() {
358 UserInfo user = expectGuestExists(USER_ID, /* isEphemeral */true);
359
360 assertThat(mSetter.canReplaceGuestUser(user)).isTrue();
361 }
362
363 @Test
364 public void testCanReplaceGuestUser_GuestLocked() {
365 UserInfo user = expectGuestExists(USER_ID, /* isEphemeral */true);
366 expectUserIsSecure(USER_ID);
367
368 assertThat(mSetter.canReplaceGuestUser(user)).isFalse();
369 }
370
371 @Test
Felipe Leme8cb16852020-03-17 13:56:44 -0700372 public void testCreateUser_ok_noflags() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700373 UserInfo newUser = expectCreateFullUser(USER_ID, "TheDude", NO_FLAGS);
felipeal283b58f2020-04-01 12:49:05 -0700374 expectSwitchUser(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700375
felipeal53e5ee82020-05-15 17:47:24 -0700376 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
377 .setNewUserName("TheDude")
378 .setNewUserFlags(UserFlags.NONE)
379 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700380
felipeal283b58f2020-04-01 12:49:05 -0700381 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700382 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700383 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700384 assertInitialUserSet(newUser);
Felipe Leme8cb16852020-03-17 13:56:44 -0700385 }
386
387 @Test
felipeale47b6c52020-03-18 17:53:10 -0700388 public void testCreateUser_ok_admin() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700389 UserInfo newUser = expectCreateFullUser(USER_ID, "TheDude", UserInfo.FLAG_ADMIN);
felipeal283b58f2020-04-01 12:49:05 -0700390 expectSwitchUser(USER_ID);
felipeale47b6c52020-03-18 17:53:10 -0700391
felipeal53e5ee82020-05-15 17:47:24 -0700392 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
393 .setNewUserName("TheDude")
394 .setNewUserFlags(UserFlags.ADMIN)
395 .build());
felipeale47b6c52020-03-18 17:53:10 -0700396
felipeal283b58f2020-04-01 12:49:05 -0700397 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700398 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700399 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700400 assertInitialUserSet(newUser);
felipeale47b6c52020-03-18 17:53:10 -0700401 }
402
403 @Test
felipeala68ecef2020-05-19 12:46:08 -0700404 public void testCreateUser_ok_admin_setLocale() throws Exception {
405 UserInfo newUser = expectCreateFullUser(USER_ID, "TheDude", UserInfo.FLAG_ADMIN);
406 expectSwitchUser(USER_ID);
407
408 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
409 .setNewUserName("TheDude")
410 .setNewUserFlags(UserFlags.ADMIN)
411 .setUserLocales("LOL")
412 .build());
413
414 verifyUserSwitched(USER_ID);
415 verifyFallbackDefaultBehaviorNeverCalled();
416 verifySystemUserUnlocked();
417 assertInitialUserSet(newUser);
418 assertSystemLocales("LOL");
419 }
420
421
422 @Test
felipeale47b6c52020-03-18 17:53:10 -0700423 public void testCreateUser_ok_ephemeralGuest() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700424 UserInfo newGuest = expectCreateGuestUser(USER_ID, "TheDude", UserInfo.FLAG_EPHEMERAL);
felipeal283b58f2020-04-01 12:49:05 -0700425 expectSwitchUser(USER_ID);
felipeale47b6c52020-03-18 17:53:10 -0700426
felipeal53e5ee82020-05-15 17:47:24 -0700427 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
428 .setNewUserName("TheDude")
429 .setNewUserFlags(UserFlags.EPHEMERAL | UserFlags.GUEST)
430 .build());
felipeale47b6c52020-03-18 17:53:10 -0700431
felipeal283b58f2020-04-01 12:49:05 -0700432 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700433 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700434 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700435 assertInitialUserSet(newGuest);
felipeale47b6c52020-03-18 17:53:10 -0700436 }
437
438 @Test
439 public void testCreateUser_fail_systemUser() throws Exception {
Felipe Lemecceb2992020-11-18 18:22:44 -0800440 // No need to mock createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700441
felipeal53e5ee82020-05-15 17:47:24 -0700442 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
443 .setNewUserName("TheDude")
444 .setNewUserFlags(UserFlags.SYSTEM)
445 .build());
felipeale47b6c52020-03-18 17:53:10 -0700446
447 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700448 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
449 verifySystemUserNeverUnlocked();
felipeale47b6c52020-03-18 17:53:10 -0700450 }
451
452 @Test
453 public void testCreateUser_fail_guestAdmin() throws Exception {
Felipe Lemecceb2992020-11-18 18:22:44 -0800454 // No need to set createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700455
felipeal53e5ee82020-05-15 17:47:24 -0700456 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
457 .setNewUserName("TheDude")
458 .setNewUserFlags(UserFlags.GUEST | UserFlags.ADMIN)
459 .build());
felipeale47b6c52020-03-18 17:53:10 -0700460
461 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700462 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
felipeale47b6c52020-03-18 17:53:10 -0700463 }
464
465 @Test
466 public void testCreateUser_fail_ephemeralAdmin() throws Exception {
Felipe Lemecceb2992020-11-18 18:22:44 -0800467 // No need to set createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700468
felipeal53e5ee82020-05-15 17:47:24 -0700469 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
470 .setNewUserName("TheDude")
471 .setNewUserFlags(UserFlags.EPHEMERAL | UserFlags.ADMIN)
472 .build());
felipeale47b6c52020-03-18 17:53:10 -0700473
474 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700475 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
felipeale47b6c52020-03-18 17:53:10 -0700476 }
477
478 @Test
479 public void testCreateUser_fail_createFail() throws Exception {
Felipe Lemecceb2992020-11-18 18:22:44 -0800480 // No need to set createUser() expectation - it will return false by default
felipeal23e068b2020-04-10 13:53:03 -0700481
felipeal53e5ee82020-05-15 17:47:24 -0700482 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
483 .setNewUserName("TheDude")
484 .setNewUserFlags(UserFlags.NONE)
485 .build());
felipeal23e068b2020-04-10 13:53:03 -0700486
487 verifyUserNeverSwitched();
488 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
489 }
490
491 @Test
492 public void testCreateUser_fail_createThrowsException() throws Exception {
493 expectCreateUserThrowsException("TheDude", UserFlags.NONE);
Felipe Leme8cb16852020-03-17 13:56:44 -0700494
felipeal53e5ee82020-05-15 17:47:24 -0700495 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
496 .setNewUserName("TheDude")
497 .setNewUserFlags(UserFlags.NONE)
498 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700499
500 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700501 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
Felipe Leme8cb16852020-03-17 13:56:44 -0700502 }
503
504 @Test
felipeale47b6c52020-03-18 17:53:10 -0700505 public void testCreateUser_fail_switchFail() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700506 expectCreateFullUser(USER_ID, "TheDude", NO_FLAGS);
felipealae8b5e92020-04-08 13:07:36 -0700507 expectSwitchUserFails(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700508
felipeal53e5ee82020-05-15 17:47:24 -0700509 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
510 .setNewUserName("TheDude")
511 .setNewUserFlags(UserFlags.NONE)
512 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700513
felipealf43e3632020-03-25 09:56:21 -0700514 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
515 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700516 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -0700517 }
518
felipeald1643e02020-03-23 14:52:04 -0700519 @Test
Mayank Garg09aa7292020-08-05 17:10:52 -0700520 public void testReplaceUser_ok() throws Exception {
521 mockGetCurrentUser(CURRENT_USER_ID);
522 expectGuestExists(CURRENT_USER_ID, /* ephemeral */ true); // ephemeral doesn't matter
523 UserInfo newGuest = expectGuestExists(NEW_USER_ID, /* ephemeral */ true);
524 expectGuestReplaced(CURRENT_USER_ID, newGuest);
525 expectSwitchUser(NEW_USER_ID);
526
527 mSetter.set(new Builder(InitialUserSetter.TYPE_REPLACE_GUEST)
528 .build());
529
530 verifyUserSwitched(NEW_USER_ID);
531 verifyFallbackDefaultBehaviorNeverCalled();
532 verifySystemUserUnlocked();
533 verifyUserDeleted(CURRENT_USER_ID);
534 assertInitialUserSet(newGuest);
535 }
536
537 @Test
538 public void testReplaceUser_fail_cantCreate() throws Exception {
539 mockGetCurrentUser(CURRENT_USER_ID);
540 expectGuestExists(CURRENT_USER_ID, /* ephemeral */ true); // ephemeral doesn't matter
541 expectGuestReplaced(CURRENT_USER_ID, null);
542
543 mSetter.set(new Builder(InitialUserSetter.TYPE_REPLACE_GUEST)
544 .build());
545
546 verifyFallbackDefaultBehaviorCalledFromReaplceUser();
547 }
548
549 @Test
550 public void testReplaceUser_ok_sameUser() throws Exception {
551 mockGetCurrentUser(CURRENT_USER_ID);
552 UserInfo userInfo = expectGuestExists(CURRENT_USER_ID, /* ephemeral */ true);
553 expectGuestReplaced(CURRENT_USER_ID, userInfo);
554
555 mSetter.set(new Builder(InitialUserSetter.TYPE_REPLACE_GUEST)
556 .build());
557
558 verifyUserNeverSwitched();
559 verifyFallbackDefaultBehaviorNeverCalled();
560 verifySystemUserUnlocked();
561 assertInitialUserSet(userInfo);
562 }
563
564 @Test
felipeald1643e02020-03-23 14:52:04 -0700565 public void testDefaultBehavior_firstBoot_ok() throws Exception {
566 // no need to mock hasInitialUser(), it will return false by default
felipeal61ce3732020-04-03 11:01:00 -0700567 UserInfo newUser = expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
felipeal283b58f2020-04-01 12:49:05 -0700568 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700569
felipeal53e5ee82020-05-15 17:47:24 -0700570 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700571
felipeal283b58f2020-04-01 12:49:05 -0700572 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700573 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700574 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700575 assertInitialUserSet(newUser);
felipeald1643e02020-03-23 14:52:04 -0700576 }
577
578 @Test
felipeala68ecef2020-05-19 12:46:08 -0700579 public void testDefaultBehavior_firstBoot_ok_setLocale() throws Exception {
580 // no need to mock hasInitialUser(), it will return false by default
581 UserInfo newUser = expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
582 expectSwitchUser(USER_ID);
583
584 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
585 .setUserLocales("LOL")
586 .build());
587
588 verifyUserSwitched(USER_ID);
589 verifyFallbackDefaultBehaviorNeverCalled();
590 verifySystemUserUnlocked();
591 assertInitialUserSet(newUser);
592 assertSystemLocales("LOL");
593 }
594
595 @Test
felipeald1643e02020-03-23 14:52:04 -0700596 public void testDefaultBehavior_firstBoot_fail_createUserFailed() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700597 // no need to mock hasInitialUser(), it will return false by default
598 // no need to mock createUser(), it will return null by default
599
felipeal53e5ee82020-05-15 17:47:24 -0700600 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700601
602 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700603 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
604 verifySystemUserNeverUnlocked();
felipeald1643e02020-03-23 14:52:04 -0700605 }
606
607 @Test
608 public void testDefaultBehavior_firstBoot_fail_switchFailed() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700609 // no need to mock hasInitialUser(), it will return false by default
felipeal283b58f2020-04-01 12:49:05 -0700610 expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
felipealae8b5e92020-04-08 13:07:36 -0700611 expectSwitchUserFails(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700612
felipeal53e5ee82020-05-15 17:47:24 -0700613 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700614
felipealf43e3632020-03-25 09:56:21 -0700615 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
616 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700617 verifyLastActiveUserNeverSet();
felipeald1643e02020-03-23 14:52:04 -0700618 }
619
620 @Test
felipeala68ecef2020-05-19 12:46:08 -0700621 public void testDefaultBehavior_firstBoot_fail_switchFailed_setLocale() throws Exception {
622 // no need to mock hasInitialUser(), it will return false by default
623 expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
624 expectSwitchUserFails(USER_ID);
625
626 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
627 .setUserLocales("LOL")
628 .build());
629
630 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
631 verifySystemUserUnlocked();
632 verifyLastActiveUserNeverSet();
633 assertSystemLocales("LOL");
634 }
635
636 @Test
felipeald1643e02020-03-23 14:52:04 -0700637 public void testDefaultBehavior_nonFirstBoot_ok() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700638 UserInfo existingUser = expectHasInitialUser(USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700639 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700640
felipeal53e5ee82020-05-15 17:47:24 -0700641 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700642
felipeal283b58f2020-04-01 12:49:05 -0700643 verifyUserSwitched(USER_ID);
644 verifyFallbackDefaultBehaviorNeverCalled();
645 verifyUserNeverCreated();
646 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700647 assertInitialUserSet(existingUser);
felipeal283b58f2020-04-01 12:49:05 -0700648 }
649
650 @Test
651 public void testDefaultBehavior_nonFirstBoot_ok_targetIsCurrentUser() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700652 UserInfo currentUser = expectHasInitialUser(CURRENT_USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700653 expectSwitchUser(CURRENT_USER_ID);
654
felipeal53e5ee82020-05-15 17:47:24 -0700655 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeal283b58f2020-04-01 12:49:05 -0700656
657 verifyUserNeverSwitched();
felipeald1643e02020-03-23 14:52:04 -0700658 verifyFallbackDefaultBehaviorNeverCalled();
659 verifyUserNeverCreated();
felipealf43e3632020-03-25 09:56:21 -0700660 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700661 assertInitialUserSet(currentUser);
felipeald1643e02020-03-23 14:52:04 -0700662 }
663
664 @Test
665 public void testDefaultBehavior_nonFirstBoot_fail_switchFail() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700666 expectHasInitialUser(USER_ID);
felipealae8b5e92020-04-08 13:07:36 -0700667 expectSwitchUserFails(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700668
felipeal53e5ee82020-05-15 17:47:24 -0700669 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700670
felipealf43e3632020-03-25 09:56:21 -0700671 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
felipeald1643e02020-03-23 14:52:04 -0700672 verifyUserNeverCreated();
felipealf43e3632020-03-25 09:56:21 -0700673 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700674 verifyLastActiveUserNeverSet();
felipeald1643e02020-03-23 14:52:04 -0700675 }
676
677 @Test
felipeald38a34a2020-03-31 11:17:10 -0700678 public void testDefaultBehavior_nonFirstBoot_ok_guestReplaced() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700679 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipeal283b58f2020-04-01 12:49:05 -0700680 expectHasInitialUser(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700681 expectGuestExists(USER_ID, ephemeral);
682 UserInfo newGuest = newGuestUser(NEW_USER_ID, ephemeral);
683 expectGuestReplaced(USER_ID, newGuest);
felipeal283b58f2020-04-01 12:49:05 -0700684 expectSwitchUser(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700685
felipeal53e5ee82020-05-15 17:47:24 -0700686 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
687 .setReplaceGuest(true)
688 .build());
felipeald38a34a2020-03-31 11:17:10 -0700689
felipeal283b58f2020-04-01 12:49:05 -0700690 verifyUserSwitched(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700691 verifyFallbackDefaultBehaviorNeverCalled();
692 verifyUserNeverCreated();
693 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700694 verifyUserDeleted(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700695 assertInitialUserSet(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700696 }
697
698 @Test
699 public void testDefaultBehavior_nonFirstBoot_fail_guestReplacementFailed() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700700 expectHasInitialUser(USER_ID);
701 expectGuestExists(USER_ID, /* isEphemeral= */ true); // ephemeral doesn't matter
felipeal61ce3732020-04-03 11:01:00 -0700702 expectGuestReplaced(USER_ID, /* newGuest= */ null);
felipeald38a34a2020-03-31 11:17:10 -0700703
felipeal53e5ee82020-05-15 17:47:24 -0700704 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
705 .setReplaceGuest(true)
706 .build());
felipeald38a34a2020-03-31 11:17:10 -0700707
708 verifyUserNeverSwitched();
709 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
710 verifyUserNeverCreated();
711 verifySystemUserNeverUnlocked();
712 }
713
714 @Test
felipealae8b5e92020-04-08 13:07:36 -0700715 public void testDefaultBehavior_nonFirstBoot_ok_withOverriddenProperty() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700716 boolean supportsOverrideUserIdProperty = true;
felipeal61ce3732020-04-03 11:01:00 -0700717 UserInfo user = expectHasInitialUser(USER_ID, supportsOverrideUserIdProperty);
felipeal53e5ee82020-05-15 17:47:24 -0700718 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700719
felipeal53e5ee82020-05-15 17:47:24 -0700720 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
721 .setSupportsOverrideUserIdProperty(true)
722 .build());
felipeald1643e02020-03-23 14:52:04 -0700723
felipeal53e5ee82020-05-15 17:47:24 -0700724 verifyUserSwitched(USER_ID);
725 verifyFallbackDefaultBehaviorNeverCalled(supportsOverrideUserIdProperty);
felipeald1643e02020-03-23 14:52:04 -0700726 verifyUserNeverCreated();
felipeal53e5ee82020-05-15 17:47:24 -0700727 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700728 assertInitialUserSet(user);
felipeald1643e02020-03-23 14:52:04 -0700729 }
730
felipealae8b5e92020-04-08 13:07:36 -0700731 @Test
felipeal948f6b62020-04-15 16:06:40 -0700732 public void testDefaultBehavior_nonFirstBoot_ok_guestDoesNotNeedToBeReplaced()
733 throws Exception {
felipeal948f6b62020-04-15 16:06:40 -0700734 UserInfo existingGuest = expectHasInitialGuest(USER_ID);
735 expectSwitchUser(USER_ID);
736
felipeal53e5ee82020-05-15 17:47:24 -0700737 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
738 .setReplaceGuest(false)
739 .build());
felipeal948f6b62020-04-15 16:06:40 -0700740
741 verifyUserSwitched(USER_ID);
742 verifyGuestNeverMarkedForDeletion();
743 verifyFallbackDefaultBehaviorNeverCalled();
744 verifyUserNeverCreated();
745 verifySystemUserUnlocked();
746 assertInitialUserSet(existingGuest);
747 }
748
749 @Test
felipealae8b5e92020-04-08 13:07:36 -0700750 public void testUnlockSystemUser_startedOk() throws Exception {
751 when(mIActivityManager.startUserInBackground(UserHandle.USER_SYSTEM)).thenReturn(true);
752
753 mSetter.unlockSystemUser();
754
755 verify(mIActivityManager, never()).unlockUser(UserHandle.USER_SYSTEM, /* token= */ null,
756 /* secret= */ null, /* listener= */ null);
757 }
758
759 @Test
760 public void testUnlockSystemUser_startFailUnlockedInstead() throws Exception {
761 // No need to set startUserInBackground() expectation as it will return false by default
762
763 mSetter.unlockSystemUser();
764
765 verify(mIActivityManager).unlockUser(UserHandle.USER_SYSTEM, /* token= */ null,
766 /* secret= */ null, /* listener= */ null);
767 }
768
769 @Test
770 public void testStartForegroundUser_ok() throws Exception {
771 expectAmStartFgUser(10);
772
773 assertThat(mSetter.startForegroundUser(10)).isTrue();
774 }
775
776 @Test
777 public void testStartForegroundUser_fail() {
778 // startUserInForegroundWithListener will return false by default
779
780 assertThat(mSetter.startForegroundUser(10)).isFalse();
781 }
782
783 @Test
784 public void testStartForegroundUser_remoteException() throws Exception {
785 expectAmStartFgUserThrowsException(10);
786
787 assertThat(mSetter.startForegroundUser(10)).isFalse();
788 }
789
790 @Test
791 public void testStartForegroundUser_nonHeadlessSystemUser() throws Exception {
felipeal7f731772020-04-27 14:16:43 -0700792 mockIsHeadlessSystemUserMode(false);
felipealae8b5e92020-04-08 13:07:36 -0700793 expectAmStartFgUser(UserHandle.USER_SYSTEM);
794
795 assertThat(mSetter.startForegroundUser(UserHandle.USER_SYSTEM)).isTrue();
796 }
797
798 @Test
799 public void testStartForegroundUser_headlessSystemUser() throws Exception {
felipeal7f731772020-04-27 14:16:43 -0700800 mockIsHeadlessSystemUserMode(true);
felipealae8b5e92020-04-08 13:07:36 -0700801
802 assertThat(mSetter.startForegroundUser(UserHandle.USER_SYSTEM)).isFalse();
803
804 verify(mIActivityManager, never()).startUserInForegroundWithListener(UserHandle.USER_SYSTEM,
805 null);
806 }
807
Mayank Garge90a4082020-09-30 12:57:34 -0700808 @Test
809 public void testGetInitialUser_WithValidLastActiveUser_ReturnsLastActiveUser() {
810 setLastActiveUser(12);
811 mockGeAliveUsers(USER_SYSTEM, 10, 11, 12);
812
813 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
814 .isEqualTo(12);
815 }
816
817 @Test
818 public void testGetInitialUser_WithNonExistLastActiveUser_ReturnsLastPersistentUser() {
819 setLastActiveUser(120);
820 setLastPersistentActiveUser(110);
821 mockGeAliveUsers(USER_SYSTEM, 100, 110);
822
823 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
824 .isEqualTo(110);
825 // should have reset last active user
826 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID))
827 .isEqualTo(UserHandle.USER_NULL);
828 }
829
830 @Test
831 public void testGetInitialUser_WithNonExistLastActiveAndPersistentUsers_ReturnsSmallestUser() {
832 setLastActiveUser(120);
833 setLastPersistentActiveUser(120);
834 mockGeAliveUsers(USER_SYSTEM, 100, 110);
835
836 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
837 .isEqualTo(100);
838 // should have reset both settions
839 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID))
840 .isEqualTo(UserHandle.USER_NULL);
841 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID))
842 .isEqualTo(UserHandle.USER_NULL);
843 }
844
845 @Test
846 public void testGetInitialUser_WithOverrideId_ReturnsOverrideId() {
847 setDefaultBootUserOverride(11);
848 setLastActiveUser(12);
849 mockGeAliveUsers(USER_SYSTEM, 10, 11, 12);
850
851 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
852 .isEqualTo(11);
853 }
854
855 @Test
856 public void testGetInitialUser_WithInvalidOverrideId_ReturnsLastActiveUserId() {
857 setDefaultBootUserOverride(15);
858 setLastActiveUser(12);
859 mockGeAliveUsers(USER_SYSTEM, 10, 11, 12);
860
861 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
862 .isEqualTo(12);
863 }
864
865 @Test
866 public void testGetInitialUser_WithInvalidOverrideAndLastActiveUserIds_ReturnsSmallestUserId() {
867 int minimumUserId = 10;
868 int invalidLastActiveUserId = 14;
869 int invalidOverrideUserId = 15;
870
871 setDefaultBootUserOverride(invalidOverrideUserId);
872 setLastActiveUser(invalidLastActiveUserId);
873 mockGeAliveUsers(USER_SYSTEM, minimumUserId, minimumUserId + 1, minimumUserId + 2);
874
875 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
876 .isEqualTo(minimumUserId);
877 }
878
879 @Test
880 public void testGetInitialUser_WhenOverrideIdIsIgnored() {
881 setDefaultBootUserOverride(11);
882 setLastActiveUser(12);
883 mockGeAliveUsers(USER_SYSTEM, 10, 11, 12);
884
885 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ false))
886 .isEqualTo(12);
887 }
888
889 @Test
890 public void testGetInitialUser_WithEmptyReturnNull() {
891 assertThat(mSetter.getInitialUser(/* usesOverrideUserIdProperty= */ true))
892 .isEqualTo(UserHandle.USER_NULL);
893 }
894
895 @Test
896 public void testHasInitialUser_onlyHeadlessSystemUser() {
897 mockIsHeadlessSystemUserMode(true);
898 mockGeAliveUsers(USER_SYSTEM);
899
900 assertThat(mSetter.hasInitialUser()).isFalse();
901 }
902
903 @Test
904 public void testHasInitialUser_onlyNonHeadlessSystemUser() {
905 mockIsHeadlessSystemUserMode(false);
906 mockGeAliveUsers(USER_SYSTEM);
907
908 assertThat(mSetter.hasInitialUser()).isTrue();
909 }
910
911 @Test
912 public void testHasInitialUser_hasNormalUser() {
913 mockIsHeadlessSystemUserMode(true);
914 mockGeAliveUsers(USER_SYSTEM, 10);
915
916 assertThat(mSetter.hasInitialUser()).isTrue();
917 }
918
919 @Test
920 public void testHasInitialUser_hasOnlyWorkProfile() {
921 mockIsHeadlessSystemUserMode(true);
922
923 UserInfo systemUser = newUser(UserHandle.USER_SYSTEM);
924
925 UserInfo workProfile = newUser(10);
926 workProfile.userType = UserManager.USER_TYPE_PROFILE_MANAGED;
927 assertThat(workProfile.isManagedProfile()).isTrue(); // Confidence check
928
929 mockGetAliveUsers(systemUser, workProfile);
930
931 assertThat(mSetter.hasInitialUser()).isFalse();
932 }
933
934 @Test
935 public void testSetLastActiveUser_headlessSystem() {
936 mockIsHeadlessSystemUserMode(true);
937 mockUmGetSystemUser(mUm);
938
939 mSetter.setLastActiveUser(UserHandle.USER_SYSTEM);
940
941 assertSettingsNotSet(CarSettings.Global.LAST_ACTIVE_USER_ID);
942 assertSettingsNotSet(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID);
943 }
944
945 @Test
946 public void testSetLastActiveUser_nonHeadlessSystem() {
947 mockIsHeadlessSystemUserMode(false);
948 mockUmGetSystemUser(mUm);
949
950 mSetter.setLastActiveUser(UserHandle.USER_SYSTEM);
951
952 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID))
953 .isEqualTo(UserHandle.USER_SYSTEM);
954 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID))
955 .isEqualTo(UserHandle.USER_SYSTEM);
956 }
957
958 @Test
959 public void testSetLastActiveUser_nonExistingUser() {
960 // Don't need to mock um.getUser(), it will return null by default
961 mSetter.setLastActiveUser(42);
962
963 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID)).isEqualTo(42);
964 assertSettingsNotSet(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID);
965 }
966
967 @Test
968 public void testSetLastActiveUser_ephemeralUser() {
969 int persistentUserId = 42;
970 int ephemeralUserid = 108;
971 mockUmGetUserInfo(mUm, persistentUserId, NO_FLAGS);
972 mockUmGetUserInfo(mUm, ephemeralUserid, UserInfo.FLAG_EPHEMERAL);
973
974 mSetter.setLastActiveUser(persistentUserId);
975 mSetter.setLastActiveUser(ephemeralUserid);
976
977 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID))
978 .isEqualTo(ephemeralUserid);
979 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID))
980 .isEqualTo(persistentUserId);
981 }
982
983 @Test
984 public void testSetLastActiveUser_nonEphemeralUser() {
985 mockUmGetUserInfo(mUm, 42, NO_FLAGS);
986
987 mSetter.setLastActiveUser(42);
988
989 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID)).isEqualTo(42);
990 assertThat(getSettingsInt(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID)).isEqualTo(42);
991 }
992
993 private void mockGeAliveUsers(@NonNull @UserIdInt int... userIds) {
994 mockUmGetAliveUsers(mUm, userIds);
995 }
996
997 private void mockGetAliveUsers(@NonNull UserInfo... users) {
998 mockUmGetAliveUsers(mUm, users);
999 }
1000
1001 private void setLastActiveUser(@UserIdInt int userId) {
1002 putSettingsInt(CarSettings.Global.LAST_ACTIVE_USER_ID, userId);
1003 }
1004
1005 private void setLastPersistentActiveUser(@UserIdInt int userId) {
1006 putSettingsInt(CarSettings.Global.LAST_ACTIVE_PERSISTENT_USER_ID, userId);
1007 }
1008
1009 private void setDefaultBootUserOverride(@UserIdInt int userId) {
1010 doReturn(Optional.of(userId)).when(() -> CarProperties.boot_user_override_id());
1011 }
1012
felipeal61ce3732020-04-03 11:01:00 -07001013 private UserInfo expectHasInitialUser(@UserIdInt int userId) {
1014 return expectHasInitialUser(userId, /* supportsOverrideUserIdProperty= */ false);
felipeald1643e02020-03-23 14:52:04 -07001015 }
1016
felipeal61ce3732020-04-03 11:01:00 -07001017 private UserInfo expectHasInitialUser(@UserIdInt int userId,
felipeald1643e02020-03-23 14:52:04 -07001018 boolean supportsOverrideUserIdProperty) {
felipeal948f6b62020-04-15 16:06:40 -07001019 return expectHasInitialUser(userId, /* isGuest= */ false, supportsOverrideUserIdProperty);
1020 }
1021
1022 private UserInfo expectHasInitialGuest(int userId) {
1023 return expectHasInitialUser(userId, /* isGuest= */ true,
1024 /* supportsOverrideUserIdProperty= */ false);
1025 }
1026 private UserInfo expectHasInitialUser(@UserIdInt int userId, boolean isGuest,
1027 boolean supportsOverrideUserIdProperty) {
Mayank Garge90a4082020-09-30 12:57:34 -07001028 doReturn(true).when(mSetter).hasInitialUser();
1029 doReturn(userId).when(mSetter).getInitialUser(supportsOverrideUserIdProperty);
felipeal948f6b62020-04-15 16:06:40 -07001030 return isGuest ? expectGuestExists(userId, /* isEphemeral= */ true)
1031 : expectUserExists(userId);
felipeald38a34a2020-03-31 11:17:10 -07001032 }
1033
felipeal61ce3732020-04-03 11:01:00 -07001034 private UserInfo expectUserExists(@UserIdInt int userId) {
felipeald38a34a2020-03-31 11:17:10 -07001035 UserInfo user = new UserInfo();
1036 user.id = userId;
1037 when(mUm.getUserInfo(userId)).thenReturn(user);
felipeal61ce3732020-04-03 11:01:00 -07001038 return user;
felipeald38a34a2020-03-31 11:17:10 -07001039 }
1040
Yan Zhu185a3102020-04-06 22:43:54 -07001041 private void expectUserIsSecure(@UserIdInt int userId) {
1042 when(mLockPatternUtils.isSecure(userId)).thenReturn(true);
1043 }
1044
felipealc59107a2020-04-10 16:18:34 -07001045 private UserInfo expectGuestExists(@UserIdInt int userId, boolean isEphemeral) {
felipeald38a34a2020-03-31 11:17:10 -07001046 UserInfo user = new UserInfo();
1047 user.id = userId;
1048 user.userType = UserManager.USER_TYPE_FULL_GUEST;
1049 if (isEphemeral) {
1050 user.flags = UserInfo.FLAG_EPHEMERAL;
1051 }
1052 when(mUm.getUserInfo(userId)).thenReturn(user);
felipealc59107a2020-04-10 16:18:34 -07001053 return user;
felipeald38a34a2020-03-31 11:17:10 -07001054 }
1055
felipeal61ce3732020-04-03 11:01:00 -07001056 private void expectGuestReplaced(int existingGuestId, UserInfo newGuest) {
1057 doReturn(newGuest).when(mSetter).replaceGuestIfNeeded(isUserInfo(existingGuestId));
felipeald1643e02020-03-23 14:52:04 -07001058 }
Felipe Leme8cb16852020-03-17 13:56:44 -07001059
felipealc5683ce2020-03-19 18:31:59 -07001060 private void expectSwitchUser(@UserIdInt int userId) throws Exception {
felipeal53e5ee82020-05-15 17:47:24 -07001061 doReturn(true).when(mSetter).startForegroundUser(userId);
felipealae8b5e92020-04-08 13:07:36 -07001062 }
1063 private void expectSwitchUserFails(@UserIdInt int userId) {
1064 when(mSetter.startForegroundUser(userId)).thenReturn(false);
Felipe Leme8cb16852020-03-17 13:56:44 -07001065 }
1066
felipeal23e068b2020-04-10 13:53:03 -07001067 private void expectSwitchUserThrowsException(@UserIdInt int userId) {
1068 when(mSetter.startForegroundUser(userId))
1069 .thenThrow(new RuntimeException("D'OH! Cannot switch to " + userId));
1070 }
1071
felipeal61ce3732020-04-03 11:01:00 -07001072 private UserInfo expectCreateFullUser(@UserIdInt int userId, @Nullable String name,
Felipe Leme8cb16852020-03-17 13:56:44 -07001073 @UserInfoFlag int flags) {
felipeal61ce3732020-04-03 11:01:00 -07001074 return expectCreateUserOfType(UserManager.USER_TYPE_FULL_SECONDARY, userId, name, flags);
felipeale47b6c52020-03-18 17:53:10 -07001075 }
1076
felipeal61ce3732020-04-03 11:01:00 -07001077 private UserInfo expectCreateGuestUser(@UserIdInt int userId, @Nullable String name,
felipeale47b6c52020-03-18 17:53:10 -07001078 @UserInfoFlag int flags) {
felipeal61ce3732020-04-03 11:01:00 -07001079 return expectCreateUserOfType(UserManager.USER_TYPE_FULL_GUEST, userId, name, flags);
felipeale47b6c52020-03-18 17:53:10 -07001080 }
1081
felipeal61ce3732020-04-03 11:01:00 -07001082 private UserInfo expectCreateUserOfType(@NonNull String type, @UserIdInt int userId,
felipeale47b6c52020-03-18 17:53:10 -07001083 @Nullable String name, @UserInfoFlag int flags) {
Felipe Leme8cb16852020-03-17 13:56:44 -07001084 UserInfo userInfo = new UserInfo(userId, name, flags);
Felipe Lemecceb2992020-11-18 18:22:44 -08001085 when(mCarUserService.createUserEvenWhenDisallowed(name, type, flags)).thenReturn(userInfo);
felipeald38a34a2020-03-31 11:17:10 -07001086 // Once user is created, it should exist...
1087 when(mUm.getUserInfo(userId)).thenReturn(userInfo);
felipeal61ce3732020-04-03 11:01:00 -07001088 return userInfo;
Felipe Leme8cb16852020-03-17 13:56:44 -07001089 }
1090
felipeal23e068b2020-04-10 13:53:03 -07001091 private void expectCreateUserThrowsException(@NonNull String name, @UserIdInt int userId) {
Felipe Lemecceb2992020-11-18 18:22:44 -08001092 when(mCarUserService.createUserEvenWhenDisallowed(eq(name), anyString(), eq(userId)))
felipeal23e068b2020-04-10 13:53:03 -07001093 .thenThrow(new RuntimeException("Cannot create user. D'OH!"));
1094 }
1095
felipealae8b5e92020-04-08 13:07:36 -07001096 private void expectAmStartFgUser(@UserIdInt int userId) throws Exception {
1097 when(mIActivityManager.startUserInForegroundWithListener(userId, null)).thenReturn(true);
1098 }
1099
1100 private void expectAmStartFgUserThrowsException(@UserIdInt int userId) throws Exception {
1101 when(mIActivityManager.startUserInForegroundWithListener(userId, null))
felipeal23e068b2020-04-10 13:53:03 -07001102 .thenThrow(new RemoteException("D'OH! Cannot switch to " + userId));
felipealae8b5e92020-04-08 13:07:36 -07001103 }
1104
felipealf43e3632020-03-25 09:56:21 -07001105 private void verifyUserSwitched(@UserIdInt int userId) throws Exception {
felipeal53e5ee82020-05-15 17:47:24 -07001106 verify(mSetter).startForegroundUser(userId);
Mayank Garge90a4082020-09-30 12:57:34 -07001107 verify(mSetter).setLastActiveUser(userId);
Felipe Leme8cb16852020-03-17 13:56:44 -07001108 }
1109
felipealc5683ce2020-03-19 18:31:59 -07001110 private void verifyUserNeverSwitched() throws Exception {
felipealae8b5e92020-04-08 13:07:36 -07001111 verify(mSetter, never()).startForegroundUser(anyInt());
felipeal283b58f2020-04-01 12:49:05 -07001112 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -07001113 }
1114
felipeald1643e02020-03-23 14:52:04 -07001115 private void verifyUserNeverCreated() {
1116 verify(mUm, never()).createUser(anyString(), anyString(), anyInt());
1117 }
1118
felipeald38a34a2020-03-31 11:17:10 -07001119 private void verifyGuestMarkedForDeletion(@UserIdInt int userId) {
1120 verify(mUm).markGuestForDeletion(userId);
1121 }
1122
1123 private void verifyGuestNeverMarkedForDeletion() {
1124 verify(mUm, never()).markGuestForDeletion(anyInt());
1125 }
1126
1127 private void verifyUserDeleted(@UserIdInt int userId) {
1128 verify(mUm).removeUser(userId);
1129 }
1130
felipealf43e3632020-03-25 09:56:21 -07001131 private void verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch() {
felipeal53e5ee82020-05-15 17:47:24 -07001132 verify(mSetter).fallbackDefaultBehavior(isInitialInfo(false), eq(true), anyString());
felipeal61ce3732020-04-03 11:01:00 -07001133 assertInitialUserSet(null);
felipealf43e3632020-03-25 09:56:21 -07001134 }
1135
1136 private void verifyFallbackDefaultBehaviorCalledFromDefaultBehavior() {
felipeal53e5ee82020-05-15 17:47:24 -07001137 verify(mSetter).fallbackDefaultBehavior(isInitialInfo(false), eq(false), anyString());
felipeal61ce3732020-04-03 11:01:00 -07001138 assertInitialUserSet(null);
Felipe Leme8cb16852020-03-17 13:56:44 -07001139 }
1140
Mayank Garg09aa7292020-08-05 17:10:52 -07001141 private void verifyFallbackDefaultBehaviorCalledFromReaplceUser() {
1142 verify(mSetter).fallbackDefaultBehavior(isInitialInfo(false), eq(true), anyString());
1143 assertInitialUserSet(null);
1144 }
1145
felipealc5683ce2020-03-19 18:31:59 -07001146 private void verifyFallbackDefaultBehaviorNeverCalled() {
felipeal53e5ee82020-05-15 17:47:24 -07001147 verifyFallbackDefaultBehaviorNeverCalled(/* supportsOverrideUserIdProperty= */ false);
1148 }
1149
1150 private void verifyFallbackDefaultBehaviorNeverCalled(boolean supportsOverrideUserIdProperty) {
1151 verify(mSetter, never()).fallbackDefaultBehavior(
1152 isInitialInfo(supportsOverrideUserIdProperty), anyBoolean(), anyString());
1153 }
1154
felipeala68ecef2020-05-19 12:46:08 -07001155 private static InitialUserInfo isInitialInfo(boolean supportsOverrideUserIdProperty) {
felipeal53e5ee82020-05-15 17:47:24 -07001156 return argThat((info) -> {
1157 return info.supportsOverrideUserIdProperty == supportsOverrideUserIdProperty;
1158 });
felipealf43e3632020-03-25 09:56:21 -07001159 }
1160
1161 private void verifySystemUserUnlocked() {
felipeal53e5ee82020-05-15 17:47:24 -07001162 verify(mSetter).unlockSystemUser();
felipealf43e3632020-03-25 09:56:21 -07001163 }
1164
1165 private void verifySystemUserNeverUnlocked() {
felipealae8b5e92020-04-08 13:07:36 -07001166 verify(mSetter, never()).unlockSystemUser();
felipealf43e3632020-03-25 09:56:21 -07001167 }
1168
felipeal283b58f2020-04-01 12:49:05 -07001169 private void verifyLastActiveUserNeverSet() {
Mayank Garge90a4082020-09-30 12:57:34 -07001170 verify(mSetter, never()).setLastActiveUser(anyInt());
felipealc5683ce2020-03-19 18:31:59 -07001171 }
felipeald38a34a2020-03-31 11:17:10 -07001172
felipeal61ce3732020-04-03 11:01:00 -07001173 private void assertInitialUserSet(@NonNull UserInfo expectedUser) {
1174 assertWithMessage("listener called wrong number of times").that(mListener.numberCalls)
1175 .isEqualTo(1);
1176 assertWithMessage("wrong initial user set on listener").that(mListener.initialUser)
Alexander Dorokhine1b903752020-09-18 15:45:10 -07001177 .isSameInstanceAs(expectedUser);
felipeal61ce3732020-04-03 11:01:00 -07001178 }
1179
felipeala68ecef2020-05-19 12:46:08 -07001180 private void assertSystemLocales(@NonNull String expected) {
1181 // TODO(b/156033195): should test specific userId
1182 assertThat(getSettingsString(Settings.System.SYSTEM_LOCALES)).isEqualTo(expected);
1183 }
1184
felipeal61ce3732020-04-03 11:01:00 -07001185 private final class MyListener implements Consumer<UserInfo> {
1186 public int numberCalls;
1187 public UserInfo initialUser;
1188
1189 @Override
1190 public void accept(UserInfo initialUser) {
1191 this.initialUser = initialUser;
1192 numberCalls++;
1193 }
1194 }
Felipe Leme8cb16852020-03-17 13:56:44 -07001195}