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