Home | History | Annotate | Download | only in users
      1 /*
      2  * Copyright (C) 2018 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  */
     16 
     17 package com.android.settingslib.users;
     18 
     19 import static com.google.common.truth.Truth.assertThat;
     20 
     21 import static org.mockito.Mockito.never;
     22 import static org.mockito.Mockito.verify;
     23 import static org.mockito.Mockito.when;
     24 
     25 import android.app.ActivityManager;
     26 import android.content.BroadcastReceiver;
     27 import android.content.Context;
     28 import android.content.Intent;
     29 import android.content.IntentFilter;
     30 import android.content.pm.UserInfo;
     31 import android.graphics.Bitmap;
     32 import android.graphics.drawable.Drawable;
     33 import android.os.Handler;
     34 import android.os.UserHandle;
     35 import android.os.UserManager;
     36 import android.support.test.InstrumentationRegistry;
     37 import android.support.test.runner.AndroidJUnit4;
     38 
     39 import org.junit.Before;
     40 import org.junit.Test;
     41 import org.junit.runner.RunWith;
     42 import org.mockito.ArgumentCaptor;
     43 import org.mockito.Mock;
     44 import org.mockito.MockitoAnnotations;
     45 
     46 import java.util.ArrayList;
     47 import java.util.List;
     48 
     49 @RunWith(AndroidJUnit4.class)
     50 public class UserManagerHelperTest {
     51     @Mock
     52     private Context mContext;
     53     @Mock
     54     private UserManager mUserManager;
     55     @Mock
     56     private ActivityManager mActivityManager;
     57     @Mock
     58     private UserManagerHelper.OnUsersUpdateListener mTestListener;
     59 
     60     private UserManagerHelper mHelper;
     61     private UserInfo mCurrentProcessUser;
     62     private UserInfo mSystemUser;
     63 
     64     @Before
     65     public void setUp() throws Exception {
     66         MockitoAnnotations.initMocks(this);
     67         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
     68         when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager);
     69         when(mContext.getResources())
     70                 .thenReturn(InstrumentationRegistry.getTargetContext().getResources());
     71         mHelper = new UserManagerHelper(mContext);
     72 
     73         mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
     74         mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
     75         when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentProcessUser);
     76     }
     77 
     78     @Test
     79     public void userIsSystemUser() {
     80         UserInfo testInfo = new UserInfo();
     81 
     82         testInfo.id = UserHandle.USER_SYSTEM;
     83         assertThat(mHelper.userIsSystemUser(testInfo)).isTrue();
     84 
     85         testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
     86         assertThat(mHelper.userIsSystemUser(testInfo)).isFalse();
     87     }
     88 
     89     @Test
     90     public void getAllUsersExcludesSystemUser() {
     91         UserInfo otherUser1 = createUserInfoForId(10);
     92         UserInfo otherUser2 = createUserInfoForId(11);
     93         UserInfo otherUser3 = createUserInfoForId(12);
     94 
     95         List<UserInfo> testUsers = new ArrayList<>();
     96         testUsers.add(otherUser1);
     97         testUsers.add(otherUser2);
     98         testUsers.add(mSystemUser);
     99         testUsers.add(otherUser3);
    100 
    101         when(mUserManager.getUsers(true)).thenReturn(testUsers);
    102 
    103         // Should return 3 users that don't have SYSTEM USER id.
    104         assertThat(mHelper.getAllUsersExcludesSystemUser()).hasSize(3);
    105         assertThat(mHelper.getAllUsersExcludesSystemUser())
    106                 .containsExactly(otherUser1, otherUser2, otherUser3);
    107     }
    108 
    109     @Test
    110     public void getAllUsersExceptUser() {
    111         UserInfo user1 = createUserInfoForId(10);
    112         UserInfo user2 = createUserInfoForId(10);
    113         UserInfo user3 = createUserInfoForId(12);
    114 
    115         List<UserInfo> testUsers = new ArrayList<>();
    116         testUsers.add(user1);
    117         testUsers.add(user2);
    118         testUsers.add(user3);
    119 
    120         when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
    121 
    122         // Should return all 3 users.
    123         assertThat(mHelper.getAllUsersExceptUser(9).size()).isEqualTo(3);
    124 
    125         // Should return only user 12.
    126         assertThat(mHelper.getAllUsersExceptUser(10).size()).isEqualTo(1);
    127         assertThat(mHelper.getAllUsersExceptUser(10)).contains(user3);
    128 
    129         when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
    130 
    131         // Should drop user 12.
    132         assertThat(mHelper.getAllUsersExceptUser(12).size()).isEqualTo(2);
    133         assertThat(mHelper.getAllUsersExceptUser(12)).contains(user1);
    134         assertThat(mHelper.getAllUsersExceptUser(12)).contains(user2);
    135     }
    136 
    137     @Test
    138     public void getAllUsers() {
    139         int currentUser = UserHandle.myUserId();
    140 
    141         UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
    142         UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
    143         UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
    144 
    145         List<UserInfo> testUsers = new ArrayList<>();
    146         testUsers.add(otherUser1);
    147         testUsers.add(otherUser2);
    148         testUsers.add(mCurrentProcessUser);
    149         testUsers.add(otherUser3);
    150 
    151         when(mUserManager.getUsers(true)).thenReturn(testUsers);
    152 
    153         assertThat(mHelper.getAllUsers().size()).isEqualTo(4);
    154         assertThat(mHelper.getAllUsers())
    155                 .containsExactly(mCurrentProcessUser, otherUser1, otherUser2, otherUser3);
    156     }
    157 
    158     @Test
    159     public void userCanBeRemoved() {
    160         UserInfo testInfo = new UserInfo();
    161 
    162         // System user cannot be removed.
    163         testInfo.id = UserHandle.USER_SYSTEM;
    164         assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse();
    165 
    166         testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
    167         assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue();
    168     }
    169 
    170     @Test
    171     public void currentProcessCanAddUsers() {
    172         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
    173         assertThat(mHelper.currentProcessCanAddUsers()).isTrue();
    174 
    175         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
    176         assertThat(mHelper.currentProcessCanAddUsers()).isFalse();
    177     }
    178 
    179     @Test
    180     public void currentProcessCanRemoveUsers() {
    181         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
    182         assertThat(mHelper.currentProcessCanRemoveUsers()).isTrue();
    183 
    184         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
    185         assertThat(mHelper.currentProcessCanRemoveUsers()).isFalse();
    186     }
    187 
    188     @Test
    189     public void currentProcessCanSwitchUsers() {
    190         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
    191         assertThat(mHelper.currentProcessCanSwitchUsers()).isTrue();
    192 
    193         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
    194         assertThat(mHelper.currentProcessCanSwitchUsers()).isFalse();
    195     }
    196 
    197     @Test
    198     public void currentProcessRunningAsGuestCannotModifyAccounts() {
    199         assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
    200 
    201         when(mUserManager.isGuestUser()).thenReturn(true);
    202         assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
    203     }
    204 
    205     @Test
    206     public void currentProcessRunningAsDemoUserCannotModifyAccounts() {
    207         assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
    208 
    209         when(mUserManager.isDemoUser()).thenReturn(true);
    210         assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
    211     }
    212 
    213     @Test
    214     public void currentProcessWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
    215         assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
    216 
    217         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
    218                 .thenReturn(true);
    219         assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
    220     }
    221 
    222     @Test
    223     public void createNewUser() {
    224         // Verify createUser on UserManager gets called.
    225         mHelper.createNewUser("Test User");
    226         verify(mUserManager).createUser("Test User", 0);
    227 
    228         when(mUserManager.createUser("Test User", 0)).thenReturn(null);
    229         assertThat(mHelper.createNewUser("Test User")).isNull();
    230 
    231         UserInfo newUser = new UserInfo();
    232         newUser.name = "Test User";
    233         when(mUserManager.createUser("Test User", 0)).thenReturn(newUser);
    234         assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser);
    235     }
    236 
    237     @Test
    238     public void removeUser() {
    239         // Cannot remove system user.
    240         assertThat(mHelper.removeUser(mSystemUser)).isFalse();
    241 
    242         // Removing non-current, non-system user, simply calls removeUser.
    243         UserInfo userToRemove = createUserInfoForId(mCurrentProcessUser.id + 2);
    244 
    245         mHelper.removeUser(userToRemove);
    246         verify(mUserManager).removeUser(mCurrentProcessUser.id + 2);
    247     }
    248 
    249     @Test
    250     public void startNewGuestSession() {
    251         mHelper.startNewGuestSession("Test Guest");
    252         verify(mUserManager).createGuest(mContext, "Test Guest");
    253 
    254         UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST);
    255         when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
    256         mHelper.startNewGuestSession("Test Guest");
    257         verify(mActivityManager).switchUser(21);
    258     }
    259 
    260     @Test
    261     public void getUserIcon() {
    262         mHelper.getUserIcon(mCurrentProcessUser);
    263         verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
    264     }
    265 
    266     @Test
    267     public void scaleUserIcon() {
    268         Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    269         Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
    270         assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
    271         assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
    272     }
    273 
    274     @Test
    275     public void setUserName() {
    276         UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
    277         mHelper.setUserName(testInfo, "New Test Name");
    278         verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, "New Test Name");
    279     }
    280 
    281     @Test
    282     public void registerUserChangeReceiver() {
    283         mHelper.registerOnUsersUpdateListener(mTestListener);
    284 
    285         ArgumentCaptor<BroadcastReceiver> receiverCaptor =
    286                 ArgumentCaptor.forClass(BroadcastReceiver.class);
    287         ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
    288         ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
    289         ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
    290         ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
    291 
    292         verify(mContext).registerReceiverAsUser(
    293                 receiverCaptor.capture(),
    294                 handleCaptor.capture(),
    295                 filterCaptor.capture(),
    296                 permissionCaptor.capture(),
    297                 handlerCaptor.capture());
    298 
    299         // Verify we're listening to Intents from ALL users.
    300         assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
    301 
    302         // Verify the presence of each intent in the filter.
    303         // Verify the exact number of filters. Every time a new intent is added, this test should
    304         // get updated.
    305         assertThat(filterCaptor.getValue().countActions()).isEqualTo(6);
    306         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
    307         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
    308         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
    309         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue();
    310         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue();
    311         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue();
    312 
    313 
    314         // Verify that calling the receiver calls the listener.
    315         receiverCaptor.getValue().onReceive(mContext, new Intent());
    316         verify(mTestListener).onUsersUpdate();
    317 
    318         assertThat(permissionCaptor.getValue()).isNull();
    319         assertThat(handlerCaptor.getValue()).isNull();
    320 
    321 
    322         // Unregister the receiver.
    323         mHelper.unregisterOnUsersUpdateListener();
    324         verify(mContext).unregisterReceiver(receiverCaptor.getValue());
    325     }
    326 
    327     private UserInfo createUserInfoForId(int id) {
    328         UserInfo userInfo = new UserInfo();
    329         userInfo.id = id;
    330         return userInfo;
    331     }
    332 }
    333