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