182029aedff5c6ec11619a558bf7424718ef22403jovanak/* 282029aedff5c6ec11619a558bf7424718ef22403jovanak * Copyright (C) 2018 The Android Open Source Project 382029aedff5c6ec11619a558bf7424718ef22403jovanak * 482029aedff5c6ec11619a558bf7424718ef22403jovanak * Licensed under the Apache License, Version 2.0 (the "License"); 582029aedff5c6ec11619a558bf7424718ef22403jovanak * you may not use this file except in compliance with the License. 682029aedff5c6ec11619a558bf7424718ef22403jovanak * You may obtain a copy of the License at 782029aedff5c6ec11619a558bf7424718ef22403jovanak * 882029aedff5c6ec11619a558bf7424718ef22403jovanak * http://www.apache.org/licenses/LICENSE-2.0 982029aedff5c6ec11619a558bf7424718ef22403jovanak * 1082029aedff5c6ec11619a558bf7424718ef22403jovanak * Unless required by applicable law or agreed to in writing, software 1182029aedff5c6ec11619a558bf7424718ef22403jovanak * distributed under the License is distributed on an "AS IS" BASIS, 1282029aedff5c6ec11619a558bf7424718ef22403jovanak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382029aedff5c6ec11619a558bf7424718ef22403jovanak * See the License for the specific language governing permissions and 1482029aedff5c6ec11619a558bf7424718ef22403jovanak * limitations under the License. 1582029aedff5c6ec11619a558bf7424718ef22403jovanak */ 1682029aedff5c6ec11619a558bf7424718ef22403jovanak 1782029aedff5c6ec11619a558bf7424718ef22403jovanakpackage com.android.settingslib.users; 1882029aedff5c6ec11619a558bf7424718ef22403jovanak 1982029aedff5c6ec11619a558bf7424718ef22403jovanakimport static com.google.common.truth.Truth.assertThat; 2082029aedff5c6ec11619a558bf7424718ef22403jovanak 2182029aedff5c6ec11619a558bf7424718ef22403jovanakimport static org.mockito.Mockito.verify; 2282029aedff5c6ec11619a558bf7424718ef22403jovanakimport static org.mockito.Mockito.when; 2382029aedff5c6ec11619a558bf7424718ef22403jovanak 2482029aedff5c6ec11619a558bf7424718ef22403jovanakimport android.app.ActivityManager; 2582029aedff5c6ec11619a558bf7424718ef22403jovanak 2682029aedff5c6ec11619a558bf7424718ef22403jovanakimport android.content.Context; 2782029aedff5c6ec11619a558bf7424718ef22403jovanakimport android.content.pm.UserInfo; 2882029aedff5c6ec11619a558bf7424718ef22403jovanakimport android.os.UserHandle; 2982029aedff5c6ec11619a558bf7424718ef22403jovanakimport android.os.UserManager; 3082029aedff5c6ec11619a558bf7424718ef22403jovanak 3182029aedff5c6ec11619a558bf7424718ef22403jovanakimport com.android.settingslib.testutils.shadow.ShadowActivityManager; 3282029aedff5c6ec11619a558bf7424718ef22403jovanakimport com.android.settingslib.SettingsLibRobolectricTestRunner; 3382029aedff5c6ec11619a558bf7424718ef22403jovanak 3482029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.junit.After; 3582029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.junit.Before; 3682029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.junit.Test; 3782029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.junit.runner.RunWith; 3882029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.mockito.Mock; 3982029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.mockito.MockitoAnnotations; 4082029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.robolectric.RuntimeEnvironment; 4182029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.robolectric.annotation.Config; 4282029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.robolectric.annotation.Implementation; 4382029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.robolectric.annotation.Implements; 4482029aedff5c6ec11619a558bf7424718ef22403jovanakimport org.robolectric.annotation.Resetter; 4582029aedff5c6ec11619a558bf7424718ef22403jovanak 4682029aedff5c6ec11619a558bf7424718ef22403jovanakimport java.util.ArrayList; 4782029aedff5c6ec11619a558bf7424718ef22403jovanakimport java.util.List; 4882029aedff5c6ec11619a558bf7424718ef22403jovanak 4982029aedff5c6ec11619a558bf7424718ef22403jovanak@RunWith(SettingsLibRobolectricTestRunner.class) 5082029aedff5c6ec11619a558bf7424718ef22403jovanak@Config(shadows = { ShadowActivityManager.class, UserManagerHelperRoboTest.ShadowUserHandle.class}) 5182029aedff5c6ec11619a558bf7424718ef22403jovanakpublic class UserManagerHelperRoboTest { 5282029aedff5c6ec11619a558bf7424718ef22403jovanak @Mock 5382029aedff5c6ec11619a558bf7424718ef22403jovanak private Context mContext; 5482029aedff5c6ec11619a558bf7424718ef22403jovanak @Mock 5582029aedff5c6ec11619a558bf7424718ef22403jovanak private UserManager mUserManager; 5682029aedff5c6ec11619a558bf7424718ef22403jovanak 5782029aedff5c6ec11619a558bf7424718ef22403jovanak private UserManagerHelper mHelper; 5882029aedff5c6ec11619a558bf7424718ef22403jovanak 5982029aedff5c6ec11619a558bf7424718ef22403jovanak @Before 6082029aedff5c6ec11619a558bf7424718ef22403jovanak public void setUpMocksAndUserManagerHelper() { 6182029aedff5c6ec11619a558bf7424718ef22403jovanak MockitoAnnotations.initMocks(this); 6282029aedff5c6ec11619a558bf7424718ef22403jovanak when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); 6382029aedff5c6ec11619a558bf7424718ef22403jovanak when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn( 6482029aedff5c6ec11619a558bf7424718ef22403jovanak RuntimeEnvironment.application.getSystemService(ActivityManager.class)); 6582029aedff5c6ec11619a558bf7424718ef22403jovanak mHelper = new UserManagerHelper(mContext); 6682029aedff5c6ec11619a558bf7424718ef22403jovanak } 6782029aedff5c6ec11619a558bf7424718ef22403jovanak 6882029aedff5c6ec11619a558bf7424718ef22403jovanak @After 6982029aedff5c6ec11619a558bf7424718ef22403jovanak public void tearDown() { 7082029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.getShadow().reset(); 7182029aedff5c6ec11619a558bf7424718ef22403jovanak } 7282029aedff5c6ec11619a558bf7424718ef22403jovanak 7382029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 7482029aedff5c6ec11619a558bf7424718ef22403jovanak public void getForegroundUserId() { 7582029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(15); 7682029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getForegroundUserId()).isEqualTo(15); 7782029aedff5c6ec11619a558bf7424718ef22403jovanak } 7882029aedff5c6ec11619a558bf7424718ef22403jovanak 7982029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 8082029aedff5c6ec11619a558bf7424718ef22403jovanak public void getForegroundUserInfo() { 8182029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(17); 8282029aedff5c6ec11619a558bf7424718ef22403jovanak when(mUserManager.getUserInfo(ShadowActivityManager.getCurrentUser())) 8382029aedff5c6ec11619a558bf7424718ef22403jovanak .thenReturn(createUserInfoForId(ShadowActivityManager.getCurrentUser())); 8482029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getForegroundUserInfo().id).isEqualTo(17); 8582029aedff5c6ec11619a558bf7424718ef22403jovanak } 8682029aedff5c6ec11619a558bf7424718ef22403jovanak 8782029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 8882029aedff5c6ec11619a558bf7424718ef22403jovanak public void getCurrentProcessUserId() { 8982029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(11); 9082029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getCurrentProcessUserId()).isEqualTo(11); 9182029aedff5c6ec11619a558bf7424718ef22403jovanak } 9282029aedff5c6ec11619a558bf7424718ef22403jovanak 9382029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 9482029aedff5c6ec11619a558bf7424718ef22403jovanak public void getCurrentProcessUserInfo() { 9582029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(12); 9682029aedff5c6ec11619a558bf7424718ef22403jovanak when(mUserManager.getUserInfo(UserHandle.myUserId())) 9782029aedff5c6ec11619a558bf7424718ef22403jovanak .thenReturn(createUserInfoForId(UserHandle.myUserId())); 9882029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getCurrentProcessUserInfo().id).isEqualTo(12); 9982029aedff5c6ec11619a558bf7424718ef22403jovanak } 10082029aedff5c6ec11619a558bf7424718ef22403jovanak 10182029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 10282029aedff5c6ec11619a558bf7424718ef22403jovanak public void getAllUsersExcludesCurrentProcessUser() { 10382029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(12); 10482029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo currentProcessUser = createUserInfoForId(12); 10582029aedff5c6ec11619a558bf7424718ef22403jovanak 10682029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser1 = createUserInfoForId(13); 10782029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser2 = createUserInfoForId(11); 10882029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser3 = createUserInfoForId(14); 10982029aedff5c6ec11619a558bf7424718ef22403jovanak 11082029aedff5c6ec11619a558bf7424718ef22403jovanak List<UserInfo> testUsers = new ArrayList<>(); 11182029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser1); 11282029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser2); 11382029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(currentProcessUser); 11482029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser3); 11582029aedff5c6ec11619a558bf7424718ef22403jovanak 11682029aedff5c6ec11619a558bf7424718ef22403jovanak when(mUserManager.getUsers(true)).thenReturn(testUsers); 11782029aedff5c6ec11619a558bf7424718ef22403jovanak 11882029aedff5c6ec11619a558bf7424718ef22403jovanak // Should return 3 users that don't have currentProcessUser id. 11982029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()).hasSize(3); 12082029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()) 12182029aedff5c6ec11619a558bf7424718ef22403jovanak .containsExactly(otherUser1, otherUser2, otherUser3); 12282029aedff5c6ec11619a558bf7424718ef22403jovanak } 12382029aedff5c6ec11619a558bf7424718ef22403jovanak 12482029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 12582029aedff5c6ec11619a558bf7424718ef22403jovanak public void getAllUsersExcludesForegroundUser() { 12682029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(17); 12782029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo foregroundUser = createUserInfoForId(17); 12882029aedff5c6ec11619a558bf7424718ef22403jovanak 12982029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser1 = createUserInfoForId(11); 13082029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser2 = createUserInfoForId(18); 13182029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo otherUser3 = createUserInfoForId(16); 13282029aedff5c6ec11619a558bf7424718ef22403jovanak 13382029aedff5c6ec11619a558bf7424718ef22403jovanak List<UserInfo> testUsers = new ArrayList<>(); 13482029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser1); 13582029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser2); 13682029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(foregroundUser); 13782029aedff5c6ec11619a558bf7424718ef22403jovanak testUsers.add(otherUser3); 13882029aedff5c6ec11619a558bf7424718ef22403jovanak 13982029aedff5c6ec11619a558bf7424718ef22403jovanak when(mUserManager.getUsers(true)).thenReturn(testUsers); 14082029aedff5c6ec11619a558bf7424718ef22403jovanak 14182029aedff5c6ec11619a558bf7424718ef22403jovanak // Should return 3 users that don't have foregroundUser id. 14282029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getAllUsersExcludesForegroundUser()).hasSize(3); 14382029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.getAllUsersExcludesForegroundUser()) 14482029aedff5c6ec11619a558bf7424718ef22403jovanak .containsExactly(otherUser1, otherUser2, otherUser3); 14582029aedff5c6ec11619a558bf7424718ef22403jovanak } 14682029aedff5c6ec11619a558bf7424718ef22403jovanak 14782029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 14882029aedff5c6ec11619a558bf7424718ef22403jovanak public void userIsForegroundUser() { 14982029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(10); 15082029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsForegroundUser(createUserInfoForId(10))).isTrue(); 15182029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isFalse(); 15282029aedff5c6ec11619a558bf7424718ef22403jovanak 15382029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(11); 15482029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isTrue(); 15582029aedff5c6ec11619a558bf7424718ef22403jovanak } 15682029aedff5c6ec11619a558bf7424718ef22403jovanak 15782029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 15882029aedff5c6ec11619a558bf7424718ef22403jovanak public void userIsRunningCurrentProcess() { 15982029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(10); 16082029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(10))).isTrue(); 16182029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isFalse(); 16282029aedff5c6ec11619a558bf7424718ef22403jovanak 16382029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(11); 16482029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isTrue(); 16582029aedff5c6ec11619a558bf7424718ef22403jovanak } 16682029aedff5c6ec11619a558bf7424718ef22403jovanak 16782029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 16882029aedff5c6ec11619a558bf7424718ef22403jovanak public void removingCurrentProcessUserSwitchesToSystemUser() { 16982029aedff5c6ec11619a558bf7424718ef22403jovanak // Set currentProcess user to be user 10. 17082029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowUserHandle.setUid(10); 17182029aedff5c6ec11619a558bf7424718ef22403jovanak 17282029aedff5c6ec11619a558bf7424718ef22403jovanak // Removing a currentProcess user, calls "switch" to system user 17382029aedff5c6ec11619a558bf7424718ef22403jovanak mHelper.removeUser(createUserInfoForId(10)); 17482029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue(); 17582029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(0); 17682029aedff5c6ec11619a558bf7424718ef22403jovanak 17782029aedff5c6ec11619a558bf7424718ef22403jovanak verify(mUserManager).removeUser(10); 17882029aedff5c6ec11619a558bf7424718ef22403jovanak } 17982029aedff5c6ec11619a558bf7424718ef22403jovanak 18082029aedff5c6ec11619a558bf7424718ef22403jovanak @Test 18182029aedff5c6ec11619a558bf7424718ef22403jovanak public void switchToUser() { 18282029aedff5c6ec11619a558bf7424718ef22403jovanak ShadowActivityManager.setCurrentUser(20); 18382029aedff5c6ec11619a558bf7424718ef22403jovanak 18482029aedff5c6ec11619a558bf7424718ef22403jovanak // Switching to foreground user doesn't do anything. 18582029aedff5c6ec11619a558bf7424718ef22403jovanak mHelper.switchToUser(createUserInfoForId(20)); 18682029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isFalse(); 18782029aedff5c6ec11619a558bf7424718ef22403jovanak 1886639c4dfa1a80191b34e70ca4b603ff5aab032f5jovanak // Switching to non-foreground user, simply calls switchUser. 18982029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo userToSwitchTo = new UserInfo(22, "Test User", 0); 19082029aedff5c6ec11619a558bf7424718ef22403jovanak mHelper.switchToUser(userToSwitchTo); 19182029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue(); 19282029aedff5c6ec11619a558bf7424718ef22403jovanak assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(22); 19382029aedff5c6ec11619a558bf7424718ef22403jovanak } 19482029aedff5c6ec11619a558bf7424718ef22403jovanak 19582029aedff5c6ec11619a558bf7424718ef22403jovanak private UserInfo createUserInfoForId(int id) { 19682029aedff5c6ec11619a558bf7424718ef22403jovanak UserInfo userInfo = new UserInfo(); 19782029aedff5c6ec11619a558bf7424718ef22403jovanak userInfo.id = id; 19882029aedff5c6ec11619a558bf7424718ef22403jovanak return userInfo; 19982029aedff5c6ec11619a558bf7424718ef22403jovanak } 20082029aedff5c6ec11619a558bf7424718ef22403jovanak 20182029aedff5c6ec11619a558bf7424718ef22403jovanak @Implements(UserHandle.class) 20282029aedff5c6ec11619a558bf7424718ef22403jovanak public static class ShadowUserHandle { 20382029aedff5c6ec11619a558bf7424718ef22403jovanak private static int sUid = 0; // SYSTEM by default 20482029aedff5c6ec11619a558bf7424718ef22403jovanak 20582029aedff5c6ec11619a558bf7424718ef22403jovanak public static void setUid(int uid) { 20682029aedff5c6ec11619a558bf7424718ef22403jovanak sUid = uid; 20782029aedff5c6ec11619a558bf7424718ef22403jovanak } 20882029aedff5c6ec11619a558bf7424718ef22403jovanak 20982029aedff5c6ec11619a558bf7424718ef22403jovanak @Implementation 21082029aedff5c6ec11619a558bf7424718ef22403jovanak public static int myUserId() { 21182029aedff5c6ec11619a558bf7424718ef22403jovanak return sUid; 21282029aedff5c6ec11619a558bf7424718ef22403jovanak } 21382029aedff5c6ec11619a558bf7424718ef22403jovanak 21482029aedff5c6ec11619a558bf7424718ef22403jovanak @Resetter 21582029aedff5c6ec11619a558bf7424718ef22403jovanak public static void reset() { 21682029aedff5c6ec11619a558bf7424718ef22403jovanak sUid = 0; 21782029aedff5c6ec11619a558bf7424718ef22403jovanak } 21882029aedff5c6ec11619a558bf7424718ef22403jovanak } 21982029aedff5c6ec11619a558bf7424718ef22403jovanak} 220