blob: c7a274b17fd0df2bfe128b847672eac10ebff7d6 [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 */
16package android.car.userlib;
17
felipeal7f731772020-04-27 14:16:43 -070018import static android.car.test.mocks.CarArgumentMatchers.isUserInfo;
felipeal1b9eae82020-04-28 17:30:11 -070019import static android.car.test.util.UserTestingHelper.newGuestUser;
20import static android.car.test.util.UserTestingHelper.newSecondaryUser;
felipeal7f731772020-04-27 14:16:43 -070021
felipeal283b58f2020-04-01 12:49:05 -070022import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
felipeal283b58f2020-04-01 12:49:05 -070023
felipeald38a34a2020-03-31 11:17:10 -070024import static com.google.common.truth.Truth.assertThat;
felipeal61ce3732020-04-03 11:01:00 -070025import static com.google.common.truth.Truth.assertWithMessage;
felipeald38a34a2020-03-31 11:17:10 -070026
felipealf43e3632020-03-25 09:56:21 -070027import static org.mockito.ArgumentMatchers.anyBoolean;
Felipe Leme8cb16852020-03-17 13:56:44 -070028import static org.mockito.ArgumentMatchers.anyInt;
felipealc5683ce2020-03-19 18:31:59 -070029import static org.mockito.ArgumentMatchers.anyString;
felipeal53e5ee82020-05-15 17:47:24 -070030import static org.mockito.ArgumentMatchers.argThat;
felipealf43e3632020-03-25 09:56:21 -070031import static org.mockito.ArgumentMatchers.eq;
felipeald38a34a2020-03-31 11:17:10 -070032import static org.mockito.Mockito.doReturn;
Felipe Leme8cb16852020-03-17 13:56:44 -070033import static org.mockito.Mockito.never;
34import static org.mockito.Mockito.spy;
35import static org.mockito.Mockito.verify;
36import static org.mockito.Mockito.when;
felipeald38a34a2020-03-31 11:17:10 -070037import static org.testng.Assert.assertThrows;
Felipe Leme8cb16852020-03-17 13:56:44 -070038
felipeale47b6c52020-03-18 17:53:10 -070039import android.annotation.NonNull;
Felipe Leme8cb16852020-03-17 13:56:44 -070040import android.annotation.Nullable;
41import android.annotation.UserIdInt;
felipeal283b58f2020-04-01 12:49:05 -070042import android.app.ActivityManager;
felipealae8b5e92020-04-08 13:07:36 -070043import android.app.IActivityManager;
felipeal1b9eae82020-04-28 17:30:11 -070044import android.car.test.mocks.AbstractExtendedMockitoTestCase;
felipeal53e5ee82020-05-15 17:47:24 -070045import android.car.userlib.InitialUserSetter.Builder;
46import android.car.userlib.InitialUserSetter.InitialUserInfo;
Felipe Leme8cb16852020-03-17 13:56:44 -070047import android.content.pm.UserInfo;
48import android.content.pm.UserInfo.UserInfoFlag;
49import android.hardware.automotive.vehicle.V2_0.UserFlags;
felipealae8b5e92020-04-08 13:07:36 -070050import android.os.RemoteException;
felipealf43e3632020-03-25 09:56:21 -070051import android.os.UserHandle;
Felipe Leme8cb16852020-03-17 13:56:44 -070052import android.os.UserManager;
53
Yan Zhu185a3102020-04-06 22:43:54 -070054import com.android.internal.widget.LockPatternUtils;
55
Felipe Leme8cb16852020-03-17 13:56:44 -070056import org.junit.Before;
57import org.junit.Test;
Felipe Leme8cb16852020-03-17 13:56:44 -070058import org.mockito.Mock;
Felipe Leme8cb16852020-03-17 13:56:44 -070059
felipeal61ce3732020-04-03 11:01:00 -070060import java.util.function.Consumer;
61
felipeal1b9eae82020-04-28 17:30:11 -070062public final class InitialUserSetterTest extends AbstractExtendedMockitoTestCase {
Felipe Leme8cb16852020-03-17 13:56:44 -070063
felipeald1643e02020-03-23 14:52:04 -070064 @UserInfoFlag
65 private static final int NO_FLAGS = 0;
66
67 private static final String OWNER_NAME = "OwnerOfALonelyDevice";
felipeald38a34a2020-03-31 11:17:10 -070068 private static final String GUEST_NAME = "GuessWhot";
felipeald1643e02020-03-23 14:52:04 -070069
felipeal283b58f2020-04-01 12:49:05 -070070 private static final int USER_ID = 10;
71 private static final int NEW_USER_ID = 11;
72 private static final int CURRENT_USER_ID = 12;
73
Felipe Leme8cb16852020-03-17 13:56:44 -070074 @Mock
75 private CarUserManagerHelper mHelper;
76
77 @Mock
felipealae8b5e92020-04-08 13:07:36 -070078 private IActivityManager mIActivityManager;
79
80 @Mock
Felipe Leme8cb16852020-03-17 13:56:44 -070081 private UserManager mUm;
82
Yan Zhu185a3102020-04-06 22:43:54 -070083 @Mock
84 private LockPatternUtils mLockPatternUtils;
85
Felipe Leme8cb16852020-03-17 13:56:44 -070086 // Spy used in tests that need to verify the default behavior as fallback
87 private InitialUserSetter mSetter;
88
felipeal61ce3732020-04-03 11:01:00 -070089 private final MyListener mListener = new MyListener();
90
felipeal3e8b49d2020-04-27 14:16:43 -070091 @Override
92 protected void onSessionBuilder(CustomMockitoSessionBuilder session) {
93 session
94 .spyStatic(ActivityManager.class)
95 .spyStatic(UserManager.class);
96 }
97
Felipe Leme8cb16852020-03-17 13:56:44 -070098 @Before
99 public void setFixtures() {
Yan Zhu185a3102020-04-06 22:43:54 -0700100 mSetter = spy(new InitialUserSetter(mHelper, mUm, mListener,
felipeal53e5ee82020-05-15 17:47:24 -0700101 mLockPatternUtils, OWNER_NAME, GUEST_NAME));
felipeal283b58f2020-04-01 12:49:05 -0700102
felipealae8b5e92020-04-08 13:07:36 -0700103 doReturn(mIActivityManager).when(() -> ActivityManager.getService());
felipeal3e8b49d2020-04-27 14:16:43 -0700104 mockGetCurrentUser(CURRENT_USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700105 }
106
107 @Test
felipeal53e5ee82020-05-15 17:47:24 -0700108 public void testSet_null() throws Exception {
109 assertThrows(IllegalArgumentException.class, () -> mSetter.set(null));
110 }
111
112 @Test
113 public void testInitialUserInfoBuilder_invalidType() throws Exception {
114 assertThrows(IllegalArgumentException.class, () -> new InitialUserSetter.Builder(-1));
115 }
116
117 @Test
118 public void testInitialUserInfoBuilder_invalidSetSwitchUserId() throws Exception {
119 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
120 InitialUserSetter.TYPE_CREATE);
121 assertThrows(IllegalArgumentException.class, () -> builder.setSwitchUserId(USER_ID));
122 }
123
124 @Test
125 public void testInitialUserInfoBuilder_invalidSetNewUserName() throws Exception {
126 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
127 InitialUserSetter.TYPE_SWITCH);
128 assertThrows(IllegalArgumentException.class, () -> builder.setNewUserName(OWNER_NAME));
129 }
130
131 @Test
132 public void testInitialUserInfoBuilder_invalidSetNewUserFlags() throws Exception {
133 InitialUserSetter.Builder builder = new InitialUserSetter.Builder(
134 InitialUserSetter.TYPE_SWITCH);
135 assertThrows(IllegalArgumentException.class,
136 () -> builder.setNewUserFlags(UserFlags.ADMIN));
137 }
138
139 @Test
felipeald38a34a2020-03-31 11:17:10 -0700140 public void testSwitchUser_ok_nonGuest() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700141 UserInfo user = expectUserExists(USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700142 expectSwitchUser(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700143
felipeal53e5ee82020-05-15 17:47:24 -0700144 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
145 .setSwitchUserId(USER_ID)
146 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700147
felipeal283b58f2020-04-01 12:49:05 -0700148 verifyUserSwitched(USER_ID);
felipealc5683ce2020-03-19 18:31:59 -0700149 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700150 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700151 assertInitialUserSet(user);
felipealf43e3632020-03-25 09:56:21 -0700152 }
153
154 @Test
155 public void testSwitchUser_ok_systemUser() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700156 UserInfo user = expectUserExists(UserHandle.USER_SYSTEM);
felipealf43e3632020-03-25 09:56:21 -0700157 expectSwitchUser(UserHandle.USER_SYSTEM);
158
felipeal53e5ee82020-05-15 17:47:24 -0700159 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
160 .setSwitchUserId(UserHandle.USER_SYSTEM)
161 .build());
felipealf43e3632020-03-25 09:56:21 -0700162
163 verifyUserSwitched(UserHandle.USER_SYSTEM);
164 verifyFallbackDefaultBehaviorNeverCalled();
165 verifySystemUserNeverUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700166 assertInitialUserSet(user);
Felipe Leme8cb16852020-03-17 13:56:44 -0700167 }
168
169 @Test
felipeald38a34a2020-03-31 11:17:10 -0700170 public void testSwitchUser_ok_guestReplaced() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700171 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipeal3e8b49d2020-04-27 14:16:43 -0700172 mockGetCurrentUser(CURRENT_USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700173 expectGuestExists(USER_ID, ephemeral); // ephemeral doesn't matter
174 UserInfo newGuest = newGuestUser(NEW_USER_ID, ephemeral);
175 expectGuestReplaced(USER_ID, newGuest);
felipeal283b58f2020-04-01 12:49:05 -0700176 expectSwitchUser(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700177
felipeal53e5ee82020-05-15 17:47:24 -0700178 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
179 .setSwitchUserId(USER_ID)
180 .setReplaceGuest(true)
181 .build());
felipeald38a34a2020-03-31 11:17:10 -0700182
felipeal283b58f2020-04-01 12:49:05 -0700183 verifyUserSwitched(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700184 verifyFallbackDefaultBehaviorNeverCalled();
185 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700186 verifyUserDeleted(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700187 assertInitialUserSet(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700188 }
189
190 @Test
felipealc59107a2020-04-10 16:18:34 -0700191 public void testSwitchUser_ok_guestDoesNotNeedToBeReplaced() throws Exception {
felipeal09807c22020-04-09 15:16:52 -0700192 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipealc59107a2020-04-10 16:18:34 -0700193 UserInfo existingGuest = expectGuestExists(USER_ID, ephemeral);
felipeal09807c22020-04-09 15:16:52 -0700194 expectSwitchUser(USER_ID);
195
felipeal53e5ee82020-05-15 17:47:24 -0700196 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
197 .setSwitchUserId(USER_ID)
198 .setReplaceGuest(false)
199 .build());
felipeal09807c22020-04-09 15:16:52 -0700200
felipealc59107a2020-04-10 16:18:34 -0700201 verifyUserSwitched(USER_ID);
felipeal09807c22020-04-09 15:16:52 -0700202 verifyGuestNeverMarkedForDeletion();
203 verifyFallbackDefaultBehaviorNeverCalled();
204 verifySystemUserUnlocked();
felipealc59107a2020-04-10 16:18:34 -0700205 assertInitialUserSet(existingGuest);
felipeal09807c22020-04-09 15:16:52 -0700206 }
207
felipeal53e5ee82020-05-15 17:47:24 -0700208
felipeal09807c22020-04-09 15:16:52 -0700209 @Test
felipeald38a34a2020-03-31 11:17:10 -0700210 public void testSwitchUser_fail_guestReplacementFailed() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700211 expectGuestExists(USER_ID, /* isEphemeral= */ true); // ephemeral doesn't matter
felipeal61ce3732020-04-03 11:01:00 -0700212 expectGuestReplaced(USER_ID, /* newGuest= */ null);
felipeald38a34a2020-03-31 11:17:10 -0700213
felipeal53e5ee82020-05-15 17:47:24 -0700214 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
215 .setSwitchUserId(USER_ID)
216 .setReplaceGuest(true)
217 .build());
felipeald38a34a2020-03-31 11:17:10 -0700218
219 verifyUserNeverSwitched();
220 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
221 verifySystemUserNeverUnlocked();
222 }
223
224 @Test
felipeal283b58f2020-04-01 12:49:05 -0700225 public void testSwitchUser_fail_switchFail() throws Exception {
226 expectUserExists(USER_ID);
felipealae8b5e92020-04-08 13:07:36 -0700227 expectSwitchUserFails(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700228
felipeal53e5ee82020-05-15 17:47:24 -0700229 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
230 .setSwitchUserId(USER_ID)
231 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700232
felipealf43e3632020-03-25 09:56:21 -0700233 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
234 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700235 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -0700236 }
237
238 @Test
felipeal283b58f2020-04-01 12:49:05 -0700239 public void testSwitchUser_fail_userDoesntExist() throws Exception {
felipeald38a34a2020-03-31 11:17:10 -0700240 // No need to set user exists expectation / will return null by default
241
felipeal53e5ee82020-05-15 17:47:24 -0700242 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
243 .setSwitchUserId(USER_ID)
244 .build());
felipeald38a34a2020-03-31 11:17:10 -0700245
246 verifyUserNeverSwitched();
247 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
248 verifySystemUserNeverUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700249 }
250
251 @Test
felipeal23e068b2020-04-10 13:53:03 -0700252 public void testSwitchUser_fail_switchThrowsException() throws Exception {
253 expectUserExists(USER_ID);
254 expectSwitchUserThrowsException(USER_ID);
255
felipeal53e5ee82020-05-15 17:47:24 -0700256 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
257 .setSwitchUserId(USER_ID)
258 .build());
felipeal23e068b2020-04-10 13:53:03 -0700259
260 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
261 verifySystemUserUnlocked();
262 verifyLastActiveUserNeverSet();
263 }
264
265 @Test
felipeal283b58f2020-04-01 12:49:05 -0700266 public void testSwitchUser_ok_targetIsCurrentUser() throws Exception {
felipeal3e8b49d2020-04-27 14:16:43 -0700267 mockGetCurrentUser(CURRENT_USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700268 UserInfo currentUser = expectUserExists(CURRENT_USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700269
felipeal53e5ee82020-05-15 17:47:24 -0700270 mSetter.set(new Builder(InitialUserSetter.TYPE_SWITCH)
271 .setSwitchUserId(CURRENT_USER_ID)
272 .build());
felipeal283b58f2020-04-01 12:49:05 -0700273
274 verifyUserNeverSwitched();
275 verifyFallbackDefaultBehaviorNeverCalled();
276 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700277 assertInitialUserSet(currentUser);
felipeald38a34a2020-03-31 11:17:10 -0700278 }
279
280 @Test
281 public void testReplaceGuestIfNeeded_null() {
282 assertThrows(IllegalArgumentException.class, () -> mSetter.replaceGuestIfNeeded(null));
283 }
284
285 @Test
286 public void testReplaceGuestIfNeeded_nonGuest() {
felipeal283b58f2020-04-01 12:49:05 -0700287 UserInfo user = newSecondaryUser(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700288
felipeal61ce3732020-04-03 11:01:00 -0700289 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameAs(user);
felipeald38a34a2020-03-31 11:17:10 -0700290
291 verifyGuestNeverMarkedForDeletion();
292 verifyUserNeverCreated();
293 }
294
295 @Test
296 public void testReplaceGuestIfNeeded_ok_nonEphemeralGuest() {
felipeal61ce3732020-04-03 11:01:00 -0700297 UserInfo newGuest = expectCreateGuestUser(NEW_USER_ID, GUEST_NAME, NO_FLAGS);
felipeal283b58f2020-04-01 12:49:05 -0700298 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ false);
felipeal61ce3732020-04-03 11:01:00 -0700299
300 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameAs(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700301
felipeal283b58f2020-04-01 12:49:05 -0700302 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700303 }
304
305 @Test
Yan Zhu185a3102020-04-06 22:43:54 -0700306 public void testReplaceGuestIfNeeded_lockScreen() throws Exception {
307 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ false);
308 expectUserIsSecure(USER_ID);
309 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameAs(user);
310
311 verifyGuestNeverMarkedForDeletion();
312 verifyUserNeverCreated();
313 }
314
315 @Test
felipeald38a34a2020-03-31 11:17:10 -0700316 public void testReplaceGuestIfNeeded_ok_ephemeralGuest() {
felipeal61ce3732020-04-03 11:01:00 -0700317 UserInfo newGuest = expectCreateGuestUser(NEW_USER_ID, GUEST_NAME, UserInfo.FLAG_EPHEMERAL);
felipeal283b58f2020-04-01 12:49:05 -0700318 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ true);
felipeal61ce3732020-04-03 11:01:00 -0700319
320 assertThat(mSetter.replaceGuestIfNeeded(user)).isSameAs(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700321
felipeal283b58f2020-04-01 12:49:05 -0700322 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700323 }
324
325 @Test
326 public void testReplaceGuestIfNeeded_fail_ephemeralGuest_createFailed() {
327 // don't set create guest expectation, so it returns null
328
felipeal283b58f2020-04-01 12:49:05 -0700329 UserInfo user = newGuestUser(USER_ID, /* ephemeral= */ true);
felipeal61ce3732020-04-03 11:01:00 -0700330 assertThat(mSetter.replaceGuestIfNeeded(user)).isEqualTo(null);
felipeald38a34a2020-03-31 11:17:10 -0700331
felipeal283b58f2020-04-01 12:49:05 -0700332 verifyGuestMarkedForDeletion(USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700333 }
334
335 @Test
Felipe Leme8cb16852020-03-17 13:56:44 -0700336 public void testCreateUser_ok_noflags() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700337 UserInfo newUser = expectCreateFullUser(USER_ID, "TheDude", NO_FLAGS);
felipeal283b58f2020-04-01 12:49:05 -0700338 expectSwitchUser(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700339
felipeal53e5ee82020-05-15 17:47:24 -0700340 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
341 .setNewUserName("TheDude")
342 .setNewUserFlags(UserFlags.NONE)
343 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700344
felipeal283b58f2020-04-01 12:49:05 -0700345 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700346 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700347 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700348 assertInitialUserSet(newUser);
Felipe Leme8cb16852020-03-17 13:56:44 -0700349 }
350
351 @Test
felipeale47b6c52020-03-18 17:53:10 -0700352 public void testCreateUser_ok_admin() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700353 UserInfo newUser = expectCreateFullUser(USER_ID, "TheDude", UserInfo.FLAG_ADMIN);
felipeal283b58f2020-04-01 12:49:05 -0700354 expectSwitchUser(USER_ID);
felipeale47b6c52020-03-18 17:53:10 -0700355
felipeal53e5ee82020-05-15 17:47:24 -0700356 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
357 .setNewUserName("TheDude")
358 .setNewUserFlags(UserFlags.ADMIN)
359 .build());
felipeale47b6c52020-03-18 17:53:10 -0700360
felipeal283b58f2020-04-01 12:49:05 -0700361 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700362 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700363 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700364 assertInitialUserSet(newUser);
felipeale47b6c52020-03-18 17:53:10 -0700365 }
366
367 @Test
368 public void testCreateUser_ok_ephemeralGuest() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700369 UserInfo newGuest = expectCreateGuestUser(USER_ID, "TheDude", UserInfo.FLAG_EPHEMERAL);
felipeal283b58f2020-04-01 12:49:05 -0700370 expectSwitchUser(USER_ID);
felipeale47b6c52020-03-18 17:53:10 -0700371
felipeal53e5ee82020-05-15 17:47:24 -0700372 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
373 .setNewUserName("TheDude")
374 .setNewUserFlags(UserFlags.EPHEMERAL | UserFlags.GUEST)
375 .build());
felipeale47b6c52020-03-18 17:53:10 -0700376
felipeal283b58f2020-04-01 12:49:05 -0700377 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700378 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700379 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700380 assertInitialUserSet(newGuest);
felipeale47b6c52020-03-18 17:53:10 -0700381 }
382
383 @Test
384 public void testCreateUser_fail_systemUser() throws Exception {
felipealc5683ce2020-03-19 18:31:59 -0700385 // No need to set mUm.createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700386
felipeal53e5ee82020-05-15 17:47:24 -0700387 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
388 .setNewUserName("TheDude")
389 .setNewUserFlags(UserFlags.SYSTEM)
390 .build());
felipeale47b6c52020-03-18 17:53:10 -0700391
392 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700393 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
394 verifySystemUserNeverUnlocked();
felipeale47b6c52020-03-18 17:53:10 -0700395 }
396
397 @Test
398 public void testCreateUser_fail_guestAdmin() throws Exception {
felipealc5683ce2020-03-19 18:31:59 -0700399 // No need to set mUm.createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700400
felipeal53e5ee82020-05-15 17:47:24 -0700401 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
402 .setNewUserName("TheDude")
403 .setNewUserFlags(UserFlags.GUEST | UserFlags.ADMIN)
404 .build());
felipeale47b6c52020-03-18 17:53:10 -0700405
406 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700407 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
felipeale47b6c52020-03-18 17:53:10 -0700408 }
409
410 @Test
411 public void testCreateUser_fail_ephemeralAdmin() throws Exception {
felipealc5683ce2020-03-19 18:31:59 -0700412 // No need to set mUm.createUser() expectation - it shouldn't be called
felipeale47b6c52020-03-18 17:53:10 -0700413
felipeal53e5ee82020-05-15 17:47:24 -0700414 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
415 .setNewUserName("TheDude")
416 .setNewUserFlags(UserFlags.EPHEMERAL | UserFlags.ADMIN)
417 .build());
felipeale47b6c52020-03-18 17:53:10 -0700418
419 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700420 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
felipeale47b6c52020-03-18 17:53:10 -0700421 }
422
423 @Test
424 public void testCreateUser_fail_createFail() throws Exception {
felipeal23e068b2020-04-10 13:53:03 -0700425 // No need to set mUm.createUser() expectation - it will return false by default
426
felipeal53e5ee82020-05-15 17:47:24 -0700427 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
428 .setNewUserName("TheDude")
429 .setNewUserFlags(UserFlags.NONE)
430 .build());
felipeal23e068b2020-04-10 13:53:03 -0700431
432 verifyUserNeverSwitched();
433 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
434 }
435
436 @Test
437 public void testCreateUser_fail_createThrowsException() throws Exception {
438 expectCreateUserThrowsException("TheDude", UserFlags.NONE);
Felipe Leme8cb16852020-03-17 13:56:44 -0700439
felipeal53e5ee82020-05-15 17:47:24 -0700440 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
441 .setNewUserName("TheDude")
442 .setNewUserFlags(UserFlags.NONE)
443 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700444
445 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700446 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
Felipe Leme8cb16852020-03-17 13:56:44 -0700447 }
448
449 @Test
felipeale47b6c52020-03-18 17:53:10 -0700450 public void testCreateUser_fail_switchFail() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700451 expectCreateFullUser(USER_ID, "TheDude", NO_FLAGS);
felipealae8b5e92020-04-08 13:07:36 -0700452 expectSwitchUserFails(USER_ID);
Felipe Leme8cb16852020-03-17 13:56:44 -0700453
felipeal53e5ee82020-05-15 17:47:24 -0700454 mSetter.set(new Builder(InitialUserSetter.TYPE_CREATE)
455 .setNewUserName("TheDude")
456 .setNewUserFlags(UserFlags.NONE)
457 .build());
Felipe Leme8cb16852020-03-17 13:56:44 -0700458
felipealf43e3632020-03-25 09:56:21 -0700459 verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch();
460 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700461 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -0700462 }
463
felipeald1643e02020-03-23 14:52:04 -0700464 @Test
465 public void testDefaultBehavior_firstBoot_ok() throws Exception {
466 // no need to mock hasInitialUser(), it will return false by default
felipeal61ce3732020-04-03 11:01:00 -0700467 UserInfo newUser = expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
felipeal283b58f2020-04-01 12:49:05 -0700468 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700469
felipeal53e5ee82020-05-15 17:47:24 -0700470 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700471
felipeal283b58f2020-04-01 12:49:05 -0700472 verifyUserSwitched(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700473 verifyFallbackDefaultBehaviorNeverCalled();
felipealf43e3632020-03-25 09:56:21 -0700474 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700475 assertInitialUserSet(newUser);
felipeald1643e02020-03-23 14:52:04 -0700476 }
477
478 @Test
479 public void testDefaultBehavior_firstBoot_fail_createUserFailed() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700480 // no need to mock hasInitialUser(), it will return false by default
481 // no need to mock createUser(), it will return null by default
482
felipeal53e5ee82020-05-15 17:47:24 -0700483 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700484
485 verifyUserNeverSwitched();
felipealf43e3632020-03-25 09:56:21 -0700486 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
487 verifySystemUserNeverUnlocked();
felipeald1643e02020-03-23 14:52:04 -0700488 }
489
490 @Test
491 public void testDefaultBehavior_firstBoot_fail_switchFailed() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700492 // no need to mock hasInitialUser(), it will return false by default
felipeal283b58f2020-04-01 12:49:05 -0700493 expectCreateFullUser(USER_ID, OWNER_NAME, UserInfo.FLAG_ADMIN);
felipealae8b5e92020-04-08 13:07:36 -0700494 expectSwitchUserFails(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700495
felipeal53e5ee82020-05-15 17:47:24 -0700496 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700497
felipealf43e3632020-03-25 09:56:21 -0700498 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
499 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700500 verifyLastActiveUserNeverSet();
felipeald1643e02020-03-23 14:52:04 -0700501 }
502
503 @Test
504 public void testDefaultBehavior_nonFirstBoot_ok() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700505 UserInfo existingUser = expectHasInitialUser(USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700506 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700507
felipeal53e5ee82020-05-15 17:47:24 -0700508 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700509
felipeal283b58f2020-04-01 12:49:05 -0700510 verifyUserSwitched(USER_ID);
511 verifyFallbackDefaultBehaviorNeverCalled();
512 verifyUserNeverCreated();
513 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700514 assertInitialUserSet(existingUser);
felipeal283b58f2020-04-01 12:49:05 -0700515 }
516
517 @Test
518 public void testDefaultBehavior_nonFirstBoot_ok_targetIsCurrentUser() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700519 UserInfo currentUser = expectHasInitialUser(CURRENT_USER_ID);
felipeal283b58f2020-04-01 12:49:05 -0700520 expectSwitchUser(CURRENT_USER_ID);
521
felipeal53e5ee82020-05-15 17:47:24 -0700522 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeal283b58f2020-04-01 12:49:05 -0700523
524 verifyUserNeverSwitched();
felipeald1643e02020-03-23 14:52:04 -0700525 verifyFallbackDefaultBehaviorNeverCalled();
526 verifyUserNeverCreated();
felipealf43e3632020-03-25 09:56:21 -0700527 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700528 assertInitialUserSet(currentUser);
felipeald1643e02020-03-23 14:52:04 -0700529 }
530
531 @Test
532 public void testDefaultBehavior_nonFirstBoot_fail_switchFail() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700533 expectHasInitialUser(USER_ID);
felipealae8b5e92020-04-08 13:07:36 -0700534 expectSwitchUserFails(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700535
felipeal53e5ee82020-05-15 17:47:24 -0700536 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR).build());
felipeald1643e02020-03-23 14:52:04 -0700537
felipealf43e3632020-03-25 09:56:21 -0700538 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
felipeald1643e02020-03-23 14:52:04 -0700539 verifyUserNeverCreated();
felipealf43e3632020-03-25 09:56:21 -0700540 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700541 verifyLastActiveUserNeverSet();
felipeald1643e02020-03-23 14:52:04 -0700542 }
543
544 @Test
felipeald38a34a2020-03-31 11:17:10 -0700545 public void testDefaultBehavior_nonFirstBoot_ok_guestReplaced() throws Exception {
felipeal61ce3732020-04-03 11:01:00 -0700546 boolean ephemeral = true; // ephemeral doesn't really matter in this test
felipeal283b58f2020-04-01 12:49:05 -0700547 expectHasInitialUser(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700548 expectGuestExists(USER_ID, ephemeral);
549 UserInfo newGuest = newGuestUser(NEW_USER_ID, ephemeral);
550 expectGuestReplaced(USER_ID, newGuest);
felipeal283b58f2020-04-01 12:49:05 -0700551 expectSwitchUser(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700552
felipeal53e5ee82020-05-15 17:47:24 -0700553 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
554 .setReplaceGuest(true)
555 .build());
felipeald38a34a2020-03-31 11:17:10 -0700556
felipeal283b58f2020-04-01 12:49:05 -0700557 verifyUserSwitched(NEW_USER_ID);
felipeald38a34a2020-03-31 11:17:10 -0700558 verifyFallbackDefaultBehaviorNeverCalled();
559 verifyUserNeverCreated();
560 verifySystemUserUnlocked();
felipeal283b58f2020-04-01 12:49:05 -0700561 verifyUserDeleted(USER_ID);
felipeal61ce3732020-04-03 11:01:00 -0700562 assertInitialUserSet(newGuest);
felipeald38a34a2020-03-31 11:17:10 -0700563 }
564
565 @Test
566 public void testDefaultBehavior_nonFirstBoot_fail_guestReplacementFailed() throws Exception {
felipeal283b58f2020-04-01 12:49:05 -0700567 expectHasInitialUser(USER_ID);
568 expectGuestExists(USER_ID, /* isEphemeral= */ true); // ephemeral doesn't matter
felipeal61ce3732020-04-03 11:01:00 -0700569 expectGuestReplaced(USER_ID, /* newGuest= */ null);
felipeald38a34a2020-03-31 11:17:10 -0700570
felipeal53e5ee82020-05-15 17:47:24 -0700571 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
572 .setReplaceGuest(true)
573 .build());
felipeald38a34a2020-03-31 11:17:10 -0700574
575 verifyUserNeverSwitched();
576 verifyFallbackDefaultBehaviorCalledFromDefaultBehavior();
577 verifyUserNeverCreated();
578 verifySystemUserNeverUnlocked();
579 }
580
581 @Test
felipealae8b5e92020-04-08 13:07:36 -0700582 public void testDefaultBehavior_nonFirstBoot_ok_withOverriddenProperty() throws Exception {
felipeald1643e02020-03-23 14:52:04 -0700583 boolean supportsOverrideUserIdProperty = true;
felipeal61ce3732020-04-03 11:01:00 -0700584 UserInfo user = expectHasInitialUser(USER_ID, supportsOverrideUserIdProperty);
felipeal53e5ee82020-05-15 17:47:24 -0700585 expectSwitchUser(USER_ID);
felipeald1643e02020-03-23 14:52:04 -0700586
felipeal53e5ee82020-05-15 17:47:24 -0700587 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
588 .setSupportsOverrideUserIdProperty(true)
589 .build());
felipeald1643e02020-03-23 14:52:04 -0700590
felipeal53e5ee82020-05-15 17:47:24 -0700591 verifyUserSwitched(USER_ID);
592 verifyFallbackDefaultBehaviorNeverCalled(supportsOverrideUserIdProperty);
felipeald1643e02020-03-23 14:52:04 -0700593 verifyUserNeverCreated();
felipeal53e5ee82020-05-15 17:47:24 -0700594 verifySystemUserUnlocked();
felipeal61ce3732020-04-03 11:01:00 -0700595 assertInitialUserSet(user);
felipeald1643e02020-03-23 14:52:04 -0700596 }
597
felipealae8b5e92020-04-08 13:07:36 -0700598 @Test
felipeal948f6b62020-04-15 16:06:40 -0700599 public void testDefaultBehavior_nonFirstBoot_ok_guestDoesNotNeedToBeReplaced()
600 throws Exception {
601 boolean ephemeral = true; // ephemeral doesn't really matter in this test
602 UserInfo existingGuest = expectHasInitialGuest(USER_ID);
603 expectSwitchUser(USER_ID);
604
felipeal53e5ee82020-05-15 17:47:24 -0700605 mSetter.set(new Builder(InitialUserSetter.TYPE_DEFAULT_BEHAVIOR)
606 .setReplaceGuest(false)
607 .build());
felipeal948f6b62020-04-15 16:06:40 -0700608
609 verifyUserSwitched(USER_ID);
610 verifyGuestNeverMarkedForDeletion();
611 verifyFallbackDefaultBehaviorNeverCalled();
612 verifyUserNeverCreated();
613 verifySystemUserUnlocked();
614 assertInitialUserSet(existingGuest);
615 }
616
617 @Test
felipealae8b5e92020-04-08 13:07:36 -0700618 public void testUnlockSystemUser_startedOk() throws Exception {
619 when(mIActivityManager.startUserInBackground(UserHandle.USER_SYSTEM)).thenReturn(true);
620
621 mSetter.unlockSystemUser();
622
623 verify(mIActivityManager, never()).unlockUser(UserHandle.USER_SYSTEM, /* token= */ null,
624 /* secret= */ null, /* listener= */ null);
625 }
626
627 @Test
628 public void testUnlockSystemUser_startFailUnlockedInstead() throws Exception {
629 // No need to set startUserInBackground() expectation as it will return false by default
630
631 mSetter.unlockSystemUser();
632
633 verify(mIActivityManager).unlockUser(UserHandle.USER_SYSTEM, /* token= */ null,
634 /* secret= */ null, /* listener= */ null);
635 }
636
637 @Test
638 public void testStartForegroundUser_ok() throws Exception {
639 expectAmStartFgUser(10);
640
641 assertThat(mSetter.startForegroundUser(10)).isTrue();
642 }
643
644 @Test
645 public void testStartForegroundUser_fail() {
646 // startUserInForegroundWithListener will return false by default
647
648 assertThat(mSetter.startForegroundUser(10)).isFalse();
649 }
650
651 @Test
652 public void testStartForegroundUser_remoteException() throws Exception {
653 expectAmStartFgUserThrowsException(10);
654
655 assertThat(mSetter.startForegroundUser(10)).isFalse();
656 }
657
658 @Test
659 public void testStartForegroundUser_nonHeadlessSystemUser() throws Exception {
felipeal7f731772020-04-27 14:16:43 -0700660 mockIsHeadlessSystemUserMode(false);
felipealae8b5e92020-04-08 13:07:36 -0700661 expectAmStartFgUser(UserHandle.USER_SYSTEM);
662
663 assertThat(mSetter.startForegroundUser(UserHandle.USER_SYSTEM)).isTrue();
664 }
665
666 @Test
667 public void testStartForegroundUser_headlessSystemUser() throws Exception {
felipeal7f731772020-04-27 14:16:43 -0700668 mockIsHeadlessSystemUserMode(true);
felipealae8b5e92020-04-08 13:07:36 -0700669
670 assertThat(mSetter.startForegroundUser(UserHandle.USER_SYSTEM)).isFalse();
671
672 verify(mIActivityManager, never()).startUserInForegroundWithListener(UserHandle.USER_SYSTEM,
673 null);
674 }
675
felipeal61ce3732020-04-03 11:01:00 -0700676 private UserInfo expectHasInitialUser(@UserIdInt int userId) {
677 return expectHasInitialUser(userId, /* supportsOverrideUserIdProperty= */ false);
felipeald1643e02020-03-23 14:52:04 -0700678 }
679
felipeal61ce3732020-04-03 11:01:00 -0700680 private UserInfo expectHasInitialUser(@UserIdInt int userId,
felipeald1643e02020-03-23 14:52:04 -0700681 boolean supportsOverrideUserIdProperty) {
felipeal948f6b62020-04-15 16:06:40 -0700682 return expectHasInitialUser(userId, /* isGuest= */ false, supportsOverrideUserIdProperty);
683 }
684
685 private UserInfo expectHasInitialGuest(int userId) {
686 return expectHasInitialUser(userId, /* isGuest= */ true,
687 /* supportsOverrideUserIdProperty= */ false);
688 }
689 private UserInfo expectHasInitialUser(@UserIdInt int userId, boolean isGuest,
690 boolean supportsOverrideUserIdProperty) {
felipeald1643e02020-03-23 14:52:04 -0700691 when(mHelper.hasInitialUser()).thenReturn(true);
692 when(mHelper.getInitialUser(supportsOverrideUserIdProperty)).thenReturn(userId);
felipeal948f6b62020-04-15 16:06:40 -0700693 return isGuest ? expectGuestExists(userId, /* isEphemeral= */ true)
694 : expectUserExists(userId);
felipeald38a34a2020-03-31 11:17:10 -0700695 }
696
felipeal61ce3732020-04-03 11:01:00 -0700697 private UserInfo expectUserExists(@UserIdInt int userId) {
felipeald38a34a2020-03-31 11:17:10 -0700698 UserInfo user = new UserInfo();
699 user.id = userId;
700 when(mUm.getUserInfo(userId)).thenReturn(user);
felipeal61ce3732020-04-03 11:01:00 -0700701 return user;
felipeald38a34a2020-03-31 11:17:10 -0700702 }
703
Yan Zhu185a3102020-04-06 22:43:54 -0700704 private void expectUserIsSecure(@UserIdInt int userId) {
705 when(mLockPatternUtils.isSecure(userId)).thenReturn(true);
706 }
707
felipealc59107a2020-04-10 16:18:34 -0700708 private UserInfo expectGuestExists(@UserIdInt int userId, boolean isEphemeral) {
felipeald38a34a2020-03-31 11:17:10 -0700709 UserInfo user = new UserInfo();
710 user.id = userId;
711 user.userType = UserManager.USER_TYPE_FULL_GUEST;
712 if (isEphemeral) {
713 user.flags = UserInfo.FLAG_EPHEMERAL;
714 }
715 when(mUm.getUserInfo(userId)).thenReturn(user);
felipealc59107a2020-04-10 16:18:34 -0700716 return user;
felipeald38a34a2020-03-31 11:17:10 -0700717 }
718
felipeal61ce3732020-04-03 11:01:00 -0700719 private void expectGuestReplaced(int existingGuestId, UserInfo newGuest) {
720 doReturn(newGuest).when(mSetter).replaceGuestIfNeeded(isUserInfo(existingGuestId));
felipeald1643e02020-03-23 14:52:04 -0700721 }
Felipe Leme8cb16852020-03-17 13:56:44 -0700722
felipealc5683ce2020-03-19 18:31:59 -0700723 private void expectSwitchUser(@UserIdInt int userId) throws Exception {
felipeal53e5ee82020-05-15 17:47:24 -0700724 doReturn(true).when(mSetter).startForegroundUser(userId);
felipealae8b5e92020-04-08 13:07:36 -0700725 }
726 private void expectSwitchUserFails(@UserIdInt int userId) {
727 when(mSetter.startForegroundUser(userId)).thenReturn(false);
Felipe Leme8cb16852020-03-17 13:56:44 -0700728 }
729
felipeal23e068b2020-04-10 13:53:03 -0700730 private void expectSwitchUserThrowsException(@UserIdInt int userId) {
731 when(mSetter.startForegroundUser(userId))
732 .thenThrow(new RuntimeException("D'OH! Cannot switch to " + userId));
733 }
734
felipeal61ce3732020-04-03 11:01:00 -0700735 private UserInfo expectCreateFullUser(@UserIdInt int userId, @Nullable String name,
Felipe Leme8cb16852020-03-17 13:56:44 -0700736 @UserInfoFlag int flags) {
felipeal61ce3732020-04-03 11:01:00 -0700737 return expectCreateUserOfType(UserManager.USER_TYPE_FULL_SECONDARY, userId, name, flags);
felipeale47b6c52020-03-18 17:53:10 -0700738 }
739
felipeal61ce3732020-04-03 11:01:00 -0700740 private UserInfo expectCreateGuestUser(@UserIdInt int userId, @Nullable String name,
felipeale47b6c52020-03-18 17:53:10 -0700741 @UserInfoFlag int flags) {
felipeal61ce3732020-04-03 11:01:00 -0700742 return expectCreateUserOfType(UserManager.USER_TYPE_FULL_GUEST, userId, name, flags);
felipeale47b6c52020-03-18 17:53:10 -0700743 }
744
felipeal61ce3732020-04-03 11:01:00 -0700745 private UserInfo expectCreateUserOfType(@NonNull String type, @UserIdInt int userId,
felipeale47b6c52020-03-18 17:53:10 -0700746 @Nullable String name, @UserInfoFlag int flags) {
Felipe Leme8cb16852020-03-17 13:56:44 -0700747 UserInfo userInfo = new UserInfo(userId, name, flags);
felipeale47b6c52020-03-18 17:53:10 -0700748 when(mUm.createUser(name, type, flags)).thenReturn(userInfo);
felipeald38a34a2020-03-31 11:17:10 -0700749 // Once user is created, it should exist...
750 when(mUm.getUserInfo(userId)).thenReturn(userInfo);
felipeal61ce3732020-04-03 11:01:00 -0700751 return userInfo;
Felipe Leme8cb16852020-03-17 13:56:44 -0700752 }
753
felipeal23e068b2020-04-10 13:53:03 -0700754 private void expectCreateUserThrowsException(@NonNull String name, @UserIdInt int userId) {
755 when(mUm.createUser(eq(name), anyString(), eq(userId)))
756 .thenThrow(new RuntimeException("Cannot create user. D'OH!"));
757 }
758
felipealae8b5e92020-04-08 13:07:36 -0700759 private void expectAmStartFgUser(@UserIdInt int userId) throws Exception {
760 when(mIActivityManager.startUserInForegroundWithListener(userId, null)).thenReturn(true);
761 }
762
763 private void expectAmStartFgUserThrowsException(@UserIdInt int userId) throws Exception {
764 when(mIActivityManager.startUserInForegroundWithListener(userId, null))
felipeal23e068b2020-04-10 13:53:03 -0700765 .thenThrow(new RemoteException("D'OH! Cannot switch to " + userId));
felipealae8b5e92020-04-08 13:07:36 -0700766 }
767
felipealf43e3632020-03-25 09:56:21 -0700768 private void verifyUserSwitched(@UserIdInt int userId) throws Exception {
felipeal53e5ee82020-05-15 17:47:24 -0700769 verify(mSetter).startForegroundUser(userId);
felipealf43e3632020-03-25 09:56:21 -0700770 verify(mHelper).setLastActiveUser(userId);
Felipe Leme8cb16852020-03-17 13:56:44 -0700771 }
772
felipealc5683ce2020-03-19 18:31:59 -0700773 private void verifyUserNeverSwitched() throws Exception {
felipealae8b5e92020-04-08 13:07:36 -0700774 verify(mSetter, never()).startForegroundUser(anyInt());
felipeal283b58f2020-04-01 12:49:05 -0700775 verifyLastActiveUserNeverSet();
Felipe Leme8cb16852020-03-17 13:56:44 -0700776 }
777
felipeald1643e02020-03-23 14:52:04 -0700778 private void verifyUserNeverCreated() {
779 verify(mUm, never()).createUser(anyString(), anyString(), anyInt());
780 }
781
felipeald38a34a2020-03-31 11:17:10 -0700782 private void verifyGuestMarkedForDeletion(@UserIdInt int userId) {
783 verify(mUm).markGuestForDeletion(userId);
784 }
785
786 private void verifyGuestNeverMarkedForDeletion() {
787 verify(mUm, never()).markGuestForDeletion(anyInt());
788 }
789
790 private void verifyUserDeleted(@UserIdInt int userId) {
791 verify(mUm).removeUser(userId);
792 }
793
felipealf43e3632020-03-25 09:56:21 -0700794 private void verifyFallbackDefaultBehaviorCalledFromCreateOrSwitch() {
felipeal53e5ee82020-05-15 17:47:24 -0700795 verify(mSetter).fallbackDefaultBehavior(isInitialInfo(false), eq(true), anyString());
felipeal61ce3732020-04-03 11:01:00 -0700796 assertInitialUserSet(null);
felipealf43e3632020-03-25 09:56:21 -0700797 }
798
799 private void verifyFallbackDefaultBehaviorCalledFromDefaultBehavior() {
felipeal53e5ee82020-05-15 17:47:24 -0700800 verify(mSetter).fallbackDefaultBehavior(isInitialInfo(false), eq(false), anyString());
felipeal61ce3732020-04-03 11:01:00 -0700801 assertInitialUserSet(null);
Felipe Leme8cb16852020-03-17 13:56:44 -0700802 }
803
felipealc5683ce2020-03-19 18:31:59 -0700804 private void verifyFallbackDefaultBehaviorNeverCalled() {
felipeal53e5ee82020-05-15 17:47:24 -0700805 verifyFallbackDefaultBehaviorNeverCalled(/* supportsOverrideUserIdProperty= */ false);
806 }
807
808 private void verifyFallbackDefaultBehaviorNeverCalled(boolean supportsOverrideUserIdProperty) {
809 verify(mSetter, never()).fallbackDefaultBehavior(
810 isInitialInfo(supportsOverrideUserIdProperty), anyBoolean(), anyString());
811 }
812
813 private static InitialUserInfo isInitialInfo(boolean supportsOverrideUserIdProperty) {
814 return argThat((info) -> {
815 return info.supportsOverrideUserIdProperty == supportsOverrideUserIdProperty;
816 });
felipealf43e3632020-03-25 09:56:21 -0700817 }
818
819 private void verifySystemUserUnlocked() {
felipeal53e5ee82020-05-15 17:47:24 -0700820 verify(mSetter).unlockSystemUser();
felipealf43e3632020-03-25 09:56:21 -0700821 }
822
823 private void verifySystemUserNeverUnlocked() {
felipealae8b5e92020-04-08 13:07:36 -0700824 verify(mSetter, never()).unlockSystemUser();
felipealf43e3632020-03-25 09:56:21 -0700825 }
826
felipeal283b58f2020-04-01 12:49:05 -0700827 private void verifyLastActiveUserNeverSet() {
felipealf43e3632020-03-25 09:56:21 -0700828 verify(mHelper, never()).setLastActiveUser(anyInt());
felipealc5683ce2020-03-19 18:31:59 -0700829 }
felipeald38a34a2020-03-31 11:17:10 -0700830
felipeal61ce3732020-04-03 11:01:00 -0700831 private void assertInitialUserSet(@NonNull UserInfo expectedUser) {
832 assertWithMessage("listener called wrong number of times").that(mListener.numberCalls)
833 .isEqualTo(1);
834 assertWithMessage("wrong initial user set on listener").that(mListener.initialUser)
835 .isSameAs(expectedUser);
836 }
837
838 private final class MyListener implements Consumer<UserInfo> {
839 public int numberCalls;
840 public UserInfo initialUser;
841
842 @Override
843 public void accept(UserInfo initialUser) {
844 this.initialUser = initialUser;
845 numberCalls++;
846 }
847 }
Felipe Leme8cb16852020-03-17 13:56:44 -0700848}