blob: 3f1fcbb2966b0211c8d0d8fa679343ceadad2f35 [file] [log] [blame]
jovanak10a5d7f2018-03-09 16:52:59 -08001/*
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
17package com.android.settingslib.users;
18
19import static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.Mockito.never;
22import static org.mockito.Mockito.verify;
23import static org.mockito.Mockito.when;
24
25import android.app.ActivityManager;
26import android.content.BroadcastReceiver;
27import android.content.Context;
28import android.content.Intent;
29import android.content.IntentFilter;
30import android.content.pm.UserInfo;
31import android.graphics.Bitmap;
32import android.graphics.drawable.Drawable;
33import android.os.Handler;
34import android.os.UserHandle;
35import android.os.UserManager;
36import android.support.test.InstrumentationRegistry;
37import android.support.test.runner.AndroidJUnit4;
38
39import org.junit.Before;
40import org.junit.Test;
41import org.junit.runner.RunWith;
42import org.mockito.ArgumentCaptor;
43import org.mockito.Mock;
44import org.mockito.MockitoAnnotations;
45
46import java.util.ArrayList;
47import java.util.List;
48
49@RunWith(AndroidJUnit4.class)
50public 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 mCurrentUser;
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 mCurrentUser = createUserInfoForId(UserHandle.myUserId());
74 mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
75 when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentUser);
76 }
77
78 @Test
79 public void testUserIsSystemUser() {
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 testGetAllUsersExcludesCurrentUser() {
91 int currentUser = UserHandle.myUserId();
92
93 UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
94 UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
95 UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
96
97 List<UserInfo> testUsers = new ArrayList<>();
98 testUsers.add(otherUser1);
99 testUsers.add(otherUser2);
100 testUsers.add(mCurrentUser);
101 testUsers.add(otherUser3);
102
103 when(mUserManager.getUsers(true)).thenReturn(testUsers);
104
105 // Should return 3 users that don't have currentUser id.
106 assertThat(mHelper.getAllUsersExcludesCurrentUser().size()).isEqualTo(3);
107 // Should not contain current user.
108 assertThat(mHelper.getAllUsersExcludesCurrentUser()).doesNotContain(mCurrentUser);
109 // Should contain non-current users.
110 assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser1);
111 assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser2);
112 assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser3);
113 }
114
115 @Test
jovanak12f105e2018-03-29 14:51:33 -0700116 public void testGetAllUsersExcludesSystemUser() {
117 UserInfo otherUser1 = createUserInfoForId(10);
118 UserInfo otherUser2 = createUserInfoForId(11);
119 UserInfo otherUser3 = createUserInfoForId(12);
120
121 List<UserInfo> testUsers = new ArrayList<>();
122 testUsers.add(otherUser1);
123 testUsers.add(otherUser2);
124 testUsers.add(mSystemUser);
125 testUsers.add(otherUser3);
126
127 when(mUserManager.getUsers(true)).thenReturn(testUsers);
128
129 // Should return 3 users that don't have SYSTEM USER id.
130 assertThat(mHelper.getAllUsersExcludesSystemUser().size()).isEqualTo(3);
131 // Should not contain system user.
132 assertThat(mHelper.getAllUsersExcludesSystemUser()).doesNotContain(mSystemUser);
133 // Should contain non-system users.
134 assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser1);
135 assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser2);
136 assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser3);
137 }
138
139 @Test
140 public void testGetAllUsers() {
141 int currentUser = UserHandle.myUserId();
142
143 UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
144 UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
145 UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
146
147 List<UserInfo> testUsers = new ArrayList<>();
148 testUsers.add(otherUser1);
149 testUsers.add(otherUser2);
150 testUsers.add(mCurrentUser);
151 testUsers.add(otherUser3);
152
153 when(mUserManager.getUsers(true)).thenReturn(testUsers);
154
155 // Should return 3 users that don't have currentUser id.
156 assertThat(mHelper.getAllUsers().size()).isEqualTo(4);
157 assertThat(mHelper.getAllUsers()).contains(mCurrentUser);
158 assertThat(mHelper.getAllUsers()).contains(otherUser1);
159 assertThat(mHelper.getAllUsers()).contains(otherUser2);
160 assertThat(mHelper.getAllUsers()).contains(otherUser3);
161 }
162
163 @Test
jovanak10a5d7f2018-03-09 16:52:59 -0800164 public void testUserCanBeRemoved() {
165 UserInfo testInfo = new UserInfo();
166
167 // System user cannot be removed.
168 testInfo.id = UserHandle.USER_SYSTEM;
169 assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse();
170
171 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
172 assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue();
173 }
174
175 @Test
176 public void testUserIsCurrentUser() {
177 UserInfo testInfo = new UserInfo();
178
179 // System user cannot be removed.
180 testInfo.id = UserHandle.myUserId();
181 assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue();
182
183 testInfo.id = UserHandle.myUserId() + 2;
184 assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse();
185 }
186
187 @Test
188 public void testCanAddUsers() {
189 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
190 assertThat(mHelper.canAddUsers()).isTrue();
191
192 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
193 assertThat(mHelper.canAddUsers()).isFalse();
194 }
195
196 @Test
197 public void testCanRemoveUsers() {
198 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
199 assertThat(mHelper.canRemoveUsers()).isTrue();
200
201 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
202 assertThat(mHelper.canRemoveUsers()).isFalse();
203 }
204
205 @Test
206 public void testCanSwitchUsers() {
207 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
208 assertThat(mHelper.canSwitchUsers()).isTrue();
209
210 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
211 assertThat(mHelper.canSwitchUsers()).isFalse();
212 }
213
214 @Test
215 public void testGuestCannotModifyAccounts() {
216 assertThat(mHelper.canModifyAccounts()).isTrue();
217
218 when(mUserManager.isGuestUser()).thenReturn(true);
219 assertThat(mHelper.canModifyAccounts()).isFalse();
220 }
221
222 @Test
223 public void testDemoUserCannotModifyAccounts() {
224 assertThat(mHelper.canModifyAccounts()).isTrue();
225
226 when(mUserManager.isDemoUser()).thenReturn(true);
227 assertThat(mHelper.canModifyAccounts()).isFalse();
228 }
229
230 @Test
231 public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
232 assertThat(mHelper.canModifyAccounts()).isTrue();
233
234 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
235 .thenReturn(true);
236 assertThat(mHelper.canModifyAccounts()).isFalse();
237 }
238
239 @Test
240 public void testCreateNewUser() {
241 // Verify createUser on UserManager gets called.
242 mHelper.createNewUser("Test User");
243 verify(mUserManager).createUser("Test User", 0);
244
245 when(mUserManager.createUser("Test User", 0)).thenReturn(null);
246 assertThat(mHelper.createNewUser("Test User")).isNull();
247
248 UserInfo newUser = new UserInfo();
249 newUser.name = "Test User";
250 when(mUserManager.createUser("Test User", 0)).thenReturn(newUser);
251 assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser);
252 }
253
254 @Test
255 public void testRemoveUser() {
256 // Cannot remove system user.
257 assertThat(mHelper.removeUser(mSystemUser)).isFalse();
258
jovanak10a5d7f2018-03-09 16:52:59 -0800259 // Removing non-current, non-system user, simply calls removeUser.
260 UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
261 mHelper.removeUser(userToRemove);
262 verify(mUserManager).removeUser(mCurrentUser.id + 2);
263 }
264
265 @Test
266 public void testSwitchToUser() {
267 // Switching to current user doesn't do anything.
268 mHelper.switchToUser(mCurrentUser);
269 verify(mActivityManager, never()).switchUser(mCurrentUser.id);
270
271 // Switching to Guest calls createGuest.
272 UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST);
273 mHelper.switchToUser(guestInfo);
274 verify(mUserManager).createGuest(mContext, "Test Guest");
275
276 // Switching to non-current, non-guest user, simply calls switchUser.
277 UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0);
278 mHelper.switchToUser(userToSwitchTo);
279 verify(mActivityManager).switchUser(mCurrentUser.id + 5);
280 }
281
282 @Test
283 public void testSwitchToGuest() {
284 mHelper.switchToGuest("Test Guest");
285 verify(mUserManager).createGuest(mContext, "Test Guest");
286
287 UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST);
288 when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
289 mHelper.switchToGuest("Test Guest");
290 verify(mActivityManager).switchUser(mCurrentUser.id + 2);
291 }
292
293 @Test
294 public void testGetUserIcon() {
295 mHelper.getUserIcon(mCurrentUser);
296 verify(mUserManager).getUserIcon(mCurrentUser.id);
297 }
298
299 @Test
300 public void testScaleUserIcon() {
301 Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
302 Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
303 assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
304 assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
305 }
306
307 @Test
308 public void testSetUserName() {
309 UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3);
310 mHelper.setUserName(testInfo, "New Test Name");
311 verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name");
312 }
313
314 @Test
315 public void testRegisterUserChangeReceiver() {
316 mHelper.registerOnUsersUpdateListener(mTestListener);
317
318 ArgumentCaptor<BroadcastReceiver> receiverCaptor =
319 ArgumentCaptor.forClass(BroadcastReceiver.class);
320 ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
321 ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
322 ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
323 ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
324
325 verify(mContext).registerReceiverAsUser(
326 receiverCaptor.capture(),
327 handleCaptor.capture(),
328 filterCaptor.capture(),
329 permissionCaptor.capture(),
330 handlerCaptor.capture());
331
332 // Verify we're listening to Intents from ALL users.
333 assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
334
335 // Verify the presence of each intent in the filter.
336 // Verify the exact number of filters. Every time a new intent is added, this test should
337 // get updated.
338 assertThat(filterCaptor.getValue().countActions()).isEqualTo(3);
339 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
340 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
341 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
342
343 // Verify that calling the receiver calls the listener.
344 receiverCaptor.getValue().onReceive(mContext, new Intent());
345 verify(mTestListener).onUsersUpdate();
346
347 assertThat(permissionCaptor.getValue()).isNull();
348 assertThat(handlerCaptor.getValue()).isNull();
349
350
351 // Unregister the receiver.
352 mHelper.unregisterOnUsersUpdateListener();
353 verify(mContext).unregisterReceiver(receiverCaptor.getValue());
354 }
355
356 private UserInfo createUserInfoForId(int id) {
357 UserInfo userInfo = new UserInfo();
358 userInfo.id = id;
359 return userInfo;
360 }
361}