blob: 325ef3a68aa6d56d8b2dbb0090d0a00432304f9d [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
116 public void testUserCanBeRemoved() {
117 UserInfo testInfo = new UserInfo();
118
119 // System user cannot be removed.
120 testInfo.id = UserHandle.USER_SYSTEM;
121 assertThat(mHelper.userCanBeRemoved(testInfo)).isFalse();
122
123 testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
124 assertThat(mHelper.userCanBeRemoved(testInfo)).isTrue();
125 }
126
127 @Test
128 public void testUserIsCurrentUser() {
129 UserInfo testInfo = new UserInfo();
130
131 // System user cannot be removed.
132 testInfo.id = UserHandle.myUserId();
133 assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue();
134
135 testInfo.id = UserHandle.myUserId() + 2;
136 assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse();
137 }
138
139 @Test
140 public void testCanAddUsers() {
141 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
142 assertThat(mHelper.canAddUsers()).isTrue();
143
144 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
145 assertThat(mHelper.canAddUsers()).isFalse();
146 }
147
148 @Test
149 public void testCanRemoveUsers() {
150 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
151 assertThat(mHelper.canRemoveUsers()).isTrue();
152
153 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
154 assertThat(mHelper.canRemoveUsers()).isFalse();
155 }
156
157 @Test
158 public void testCanSwitchUsers() {
159 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
160 assertThat(mHelper.canSwitchUsers()).isTrue();
161
162 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
163 assertThat(mHelper.canSwitchUsers()).isFalse();
164 }
165
166 @Test
167 public void testGuestCannotModifyAccounts() {
168 assertThat(mHelper.canModifyAccounts()).isTrue();
169
170 when(mUserManager.isGuestUser()).thenReturn(true);
171 assertThat(mHelper.canModifyAccounts()).isFalse();
172 }
173
174 @Test
175 public void testDemoUserCannotModifyAccounts() {
176 assertThat(mHelper.canModifyAccounts()).isTrue();
177
178 when(mUserManager.isDemoUser()).thenReturn(true);
179 assertThat(mHelper.canModifyAccounts()).isFalse();
180 }
181
182 @Test
183 public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
184 assertThat(mHelper.canModifyAccounts()).isTrue();
185
186 when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
187 .thenReturn(true);
188 assertThat(mHelper.canModifyAccounts()).isFalse();
189 }
190
191 @Test
192 public void testCreateNewUser() {
193 // Verify createUser on UserManager gets called.
194 mHelper.createNewUser("Test User");
195 verify(mUserManager).createUser("Test User", 0);
196
197 when(mUserManager.createUser("Test User", 0)).thenReturn(null);
198 assertThat(mHelper.createNewUser("Test User")).isNull();
199
200 UserInfo newUser = new UserInfo();
201 newUser.name = "Test User";
202 when(mUserManager.createUser("Test User", 0)).thenReturn(newUser);
203 assertThat(mHelper.createNewUser("Test User")).isEqualTo(newUser);
204 }
205
206 @Test
207 public void testRemoveUser() {
208 // Cannot remove system user.
209 assertThat(mHelper.removeUser(mSystemUser)).isFalse();
210
211 // Removing current user, calls "switch" to system user.
212 mHelper.removeUser(mCurrentUser);
213 verify(mActivityManager).switchUser(UserHandle.USER_SYSTEM);
214 verify(mUserManager).removeUser(mCurrentUser.id);
215
216 // Removing non-current, non-system user, simply calls removeUser.
217 UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
218 mHelper.removeUser(userToRemove);
219 verify(mUserManager).removeUser(mCurrentUser.id + 2);
220 }
221
222 @Test
223 public void testSwitchToUser() {
224 // Switching to current user doesn't do anything.
225 mHelper.switchToUser(mCurrentUser);
226 verify(mActivityManager, never()).switchUser(mCurrentUser.id);
227
228 // Switching to Guest calls createGuest.
229 UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST);
230 mHelper.switchToUser(guestInfo);
231 verify(mUserManager).createGuest(mContext, "Test Guest");
232
233 // Switching to non-current, non-guest user, simply calls switchUser.
234 UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0);
235 mHelper.switchToUser(userToSwitchTo);
236 verify(mActivityManager).switchUser(mCurrentUser.id + 5);
237 }
238
239 @Test
240 public void testSwitchToGuest() {
241 mHelper.switchToGuest("Test Guest");
242 verify(mUserManager).createGuest(mContext, "Test Guest");
243
244 UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST);
245 when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
246 mHelper.switchToGuest("Test Guest");
247 verify(mActivityManager).switchUser(mCurrentUser.id + 2);
248 }
249
250 @Test
251 public void testGetUserIcon() {
252 mHelper.getUserIcon(mCurrentUser);
253 verify(mUserManager).getUserIcon(mCurrentUser.id);
254 }
255
256 @Test
257 public void testScaleUserIcon() {
258 Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
259 Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
260 assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
261 assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
262 }
263
264 @Test
265 public void testSetUserName() {
266 UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3);
267 mHelper.setUserName(testInfo, "New Test Name");
268 verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name");
269 }
270
271 @Test
272 public void testRegisterUserChangeReceiver() {
273 mHelper.registerOnUsersUpdateListener(mTestListener);
274
275 ArgumentCaptor<BroadcastReceiver> receiverCaptor =
276 ArgumentCaptor.forClass(BroadcastReceiver.class);
277 ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
278 ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
279 ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
280 ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
281
282 verify(mContext).registerReceiverAsUser(
283 receiverCaptor.capture(),
284 handleCaptor.capture(),
285 filterCaptor.capture(),
286 permissionCaptor.capture(),
287 handlerCaptor.capture());
288
289 // Verify we're listening to Intents from ALL users.
290 assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
291
292 // Verify the presence of each intent in the filter.
293 // Verify the exact number of filters. Every time a new intent is added, this test should
294 // get updated.
295 assertThat(filterCaptor.getValue().countActions()).isEqualTo(3);
296 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
297 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
298 assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
299
300 // Verify that calling the receiver calls the listener.
301 receiverCaptor.getValue().onReceive(mContext, new Intent());
302 verify(mTestListener).onUsersUpdate();
303
304 assertThat(permissionCaptor.getValue()).isNull();
305 assertThat(handlerCaptor.getValue()).isNull();
306
307
308 // Unregister the receiver.
309 mHelper.unregisterOnUsersUpdateListener();
310 verify(mContext).unregisterReceiver(receiverCaptor.getValue());
311 }
312
313 private UserInfo createUserInfoForId(int id) {
314 UserInfo userInfo = new UserInfo();
315 userInfo.id = id;
316 return userInfo;
317 }
318}