UserManagerTest.java revision 133c627fa011ab139d5aed832f2b36fe28016e81
1/*
2 * Copyright (C) 2011 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.server.pm;
18
19import android.content.BroadcastReceiver;
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.content.pm.UserInfo;
24import android.app.ActivityManager;
25import android.os.Bundle;
26import android.os.UserHandle;
27import android.os.UserManager;
28import android.provider.Settings;
29import android.test.AndroidTestCase;
30import android.test.suitebuilder.annotation.LargeTest;
31import android.test.suitebuilder.annotation.MediumTest;
32import android.test.suitebuilder.annotation.SmallTest;
33
34import com.android.internal.util.ArrayUtils;
35
36import java.util.ArrayList;
37import java.util.Arrays;
38import java.util.List;
39
40/** Test {@link UserManager} functionality. */
41public class UserManagerTest extends AndroidTestCase {
42    // Taken from UserManagerService
43    private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // 30 years
44
45    private static final int REMOVE_CHECK_INTERVAL_MILLIS = 500; // 0.5 seconds
46    private static final int REMOVE_TIMEOUT_MILLIS = 60 * 1000; // 60 seconds
47    private static final int SWITCH_USER_TIMEOUT_MILLIS = 40 * 1000; // 40 seconds
48
49    private final Object mUserRemoveLock = new Object();
50    private final Object mUserSwitchLock = new Object();
51
52    private UserManager mUserManager = null;
53    private List<Integer> usersToRemove;
54
55    @Override
56    public void setUp() throws Exception {
57        super.setUp();
58        mUserManager = UserManager.get(getContext());
59
60        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
61        filter.addAction(Intent.ACTION_USER_SWITCHED);
62        getContext().registerReceiver(new BroadcastReceiver() {
63            @Override
64            public void onReceive(Context context, Intent intent) {
65                switch (intent.getAction()) {
66                    case Intent.ACTION_USER_REMOVED:
67                        synchronized (mUserRemoveLock) {
68                            mUserRemoveLock.notifyAll();
69                        }
70                        break;
71                    case Intent.ACTION_USER_SWITCHED:
72                        synchronized (mUserSwitchLock) {
73                            mUserSwitchLock.notifyAll();
74                        }
75                        break;
76                }
77            }
78        }, filter);
79
80        removeExistingUsers();
81        usersToRemove = new ArrayList<>();
82    }
83
84    @Override
85    protected void tearDown() throws Exception {
86        for (Integer userId : usersToRemove) {
87            removeUser(userId);
88        }
89        super.tearDown();
90    }
91
92    private void removeExistingUsers() {
93        List<UserInfo> list = mUserManager.getUsers();
94        for (UserInfo user : list) {
95            // Keep system and primary user.
96            // We do not have to keep primary user, but in split system user mode, we need it
97            // until http://b/22976637 is fixed.  Right now in split system user mode, you need to
98            // switch to primary user and run tests under primary user.
99            if (user.id != UserHandle.USER_SYSTEM && !user.isPrimary()) {
100                removeUser(user.id);
101            }
102        }
103    }
104
105    @SmallTest
106    public void testHasSystemUser() throws Exception {
107        assertTrue(findUser(UserHandle.USER_SYSTEM));
108    }
109
110    @MediumTest
111    public void testAddUser() throws Exception {
112        UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
113        assertTrue(userInfo != null);
114
115        List<UserInfo> list = mUserManager.getUsers();
116        boolean found = false;
117        for (UserInfo user : list) {
118            if (user.id == userInfo.id && user.name.equals("Guest 1")
119                    && user.isGuest()
120                    && !user.isAdmin()
121                    && !user.isPrimary()) {
122                found = true;
123                Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle());
124                assertTrue("Guest user should have DISALLOW_CONFIG_WIFI=true by default",
125                        restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI));
126            }
127        }
128        assertTrue(found);
129    }
130
131    @MediumTest
132    public void testAdd2Users() throws Exception {
133        UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
134        UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN);
135
136        assertTrue(user1 != null);
137        assertTrue(user2 != null);
138
139        assertTrue(findUser(0));
140        assertTrue(findUser(user1.id));
141        assertTrue(findUser(user2.id));
142    }
143
144    @MediumTest
145    public void testRemoveUser() throws Exception {
146        UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
147        removeUser(userInfo.id);
148
149        assertFalse(findUser(userInfo.id));
150    }
151
152    @MediumTest
153    public void testAddGuest() throws Exception {
154        UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
155        UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST);
156        assertNotNull(userInfo1);
157        assertNull(userInfo2);
158    }
159
160    @MediumTest
161    public void testGetProfileParent() throws Exception {
162        final int primaryUserId = mUserManager.getPrimaryUser().id;
163
164        UserInfo userInfo = createProfileForUser("Profile",
165                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
166        assertNotNull(userInfo);
167
168        UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
169        assertNotNull(parentProfileInfo);
170        assertEquals(parentProfileInfo.id, primaryUserId);
171    }
172
173    // Make sure only one managed profile can be created
174    @MediumTest
175    public void testAddManagedProfile() throws Exception {
176        final int primaryUserId = mUserManager.getPrimaryUser().id;
177        UserInfo userInfo1 = createProfileForUser("Managed 1",
178                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
179        UserInfo userInfo2 = createProfileForUser("Managed 2",
180                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
181
182        assertNotNull(userInfo1);
183        assertNull(userInfo2);
184        // Verify that current user is not a managed profile
185        assertFalse(mUserManager.isManagedProfile());
186    }
187
188    @MediumTest
189    public void testAddRestrictedProfile() throws Exception {
190        UserInfo userInfo = createRestrictedProfile("Profile");
191        assertNotNull(userInfo);
192
193        Bundle restrictions = mUserManager.getUserRestrictions(UserHandle.of(userInfo.id));
194        assertTrue("Restricted profile should have DISALLOW_MODIFY_ACCOUNTS restriction by default",
195                restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS));
196        assertTrue("Restricted profile should have DISALLOW_SHARE_LOCATION restriction by default",
197                restrictions.getBoolean(UserManager.DISALLOW_SHARE_LOCATION));
198
199        int locationMode = Settings.Secure.getIntForUser(getContext().getContentResolver(),
200                Settings.Secure.LOCATION_MODE,
201                Settings.Secure.LOCATION_MODE_HIGH_ACCURACY,
202                userInfo.id);
203        assertEquals("Restricted profile should have setting LOCATION_MODE set to "
204                + "LOCATION_MODE_OFF by default", locationMode, Settings.Secure.LOCATION_MODE_OFF);
205    }
206
207    @MediumTest
208    public void testGetUserCreationTime() throws Exception {
209        final int primaryUserId = mUserManager.getPrimaryUser().id;
210        final long startTime = System.currentTimeMillis();
211        UserInfo profile = createProfileForUser("Managed 1",
212                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
213        final long endTime = System.currentTimeMillis();
214        assertNotNull(profile);
215        if (System.currentTimeMillis() > EPOCH_PLUS_30_YEARS) {
216            assertTrue("creationTime must be set when the profile is created",
217                    profile.creationTime >= startTime && profile.creationTime <= endTime);
218        } else {
219            assertTrue("creationTime must be 0 if the time is not > EPOCH_PLUS_30_years",
220                    profile.creationTime == 0);
221        }
222        assertEquals(profile.creationTime, mUserManager.getUserCreationTime(
223                new UserHandle(profile.id)));
224
225        long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime;
226        assertEquals(ownerCreationTime, mUserManager.getUserCreationTime(
227                new UserHandle(primaryUserId)));
228    }
229
230    @SmallTest
231    public void testGetUserCreationTime_nonExistentUser() throws Exception {
232        try {
233            int noSuchUserId = 100500;
234            mUserManager.getUserCreationTime(new UserHandle(noSuchUserId));
235            fail("SecurityException should be thrown for nonexistent user");
236        } catch (Exception e) {
237            assertTrue("SecurityException should be thrown for nonexistent user, but was: " + e,
238                    e instanceof SecurityException);
239        }
240    }
241
242    @SmallTest
243    public void testGetUserCreationTime_otherUser() throws Exception {
244        UserInfo user = createUser("User 1", 0);
245        try {
246            mUserManager.getUserCreationTime(new UserHandle(user.id));
247            fail("SecurityException should be thrown for other user");
248        } catch (Exception e) {
249            assertTrue("SecurityException should be thrown for other user, but was: " + e,
250                    e instanceof SecurityException);
251        }
252    }
253
254    private boolean findUser(int id) {
255        List<UserInfo> list = mUserManager.getUsers();
256
257        for (UserInfo user : list) {
258            if (user.id == id) {
259                return true;
260            }
261        }
262        return false;
263    }
264
265    @MediumTest
266    public void testSerialNumber() {
267        UserInfo user1 = createUser("User 1", 0);
268        int serialNumber1 = user1.serialNumber;
269        assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id));
270        assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1));
271        UserInfo user2 = createUser("User 2", 0);
272        int serialNumber2 = user2.serialNumber;
273        assertFalse(serialNumber1 == serialNumber2);
274        assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id));
275        assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2));
276    }
277
278    @MediumTest
279    public void testGetSerialNumbersOfUsers() {
280        UserInfo user1 = createUser("User 1", 0);
281        UserInfo user2 = createUser("User 2", 0);
282        long[] serialNumbersOfUsers = mUserManager.getSerialNumbersOfUsers(false);
283        String errMsg = "Array " + Arrays.toString(serialNumbersOfUsers) + " should contain ";
284        assertTrue(errMsg + user1.serialNumber,
285                ArrayUtils.contains(serialNumbersOfUsers, user1.serialNumber));
286        assertTrue(errMsg + user2.serialNumber,
287                ArrayUtils.contains(serialNumbersOfUsers, user2.serialNumber));
288    }
289
290    @MediumTest
291    public void testMaxUsers() {
292        int N = UserManager.getMaxSupportedUsers();
293        int count = mUserManager.getUsers().size();
294        // Create as many users as permitted and make sure creation passes
295        while (count < N) {
296            UserInfo ui = createUser("User " + count, 0);
297            assertNotNull(ui);
298            count++;
299        }
300        // Try to create one more user and make sure it fails
301        UserInfo extra = createUser("One more", 0);
302        assertNull(extra);
303    }
304
305    @MediumTest
306    public void testGetUserCount() {
307        int count = mUserManager.getUsers().size();
308        UserInfo user1 = createUser("User 1", 0);
309        assertNotNull(user1);
310        UserInfo user2 = createUser("User 2", 0);
311        assertNotNull(user2);
312        assertEquals(count + 2, mUserManager.getUserCount());
313    }
314
315    @MediumTest
316    public void testRestrictions() {
317        UserInfo testUser = createUser("User 1", 0);
318
319        mUserManager.setUserRestriction(
320                UserManager.DISALLOW_INSTALL_APPS, true, new UserHandle(testUser.id));
321        mUserManager.setUserRestriction(
322                UserManager.DISALLOW_CONFIG_WIFI, false, new UserHandle(testUser.id));
323
324        Bundle stored = mUserManager.getUserRestrictions(new UserHandle(testUser.id));
325        // Note this will fail if DO already sets those restrictions.
326        assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false);
327        assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false);
328        assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true);
329    }
330
331    @MediumTest
332    public void testSetDefaultGuestRestrictions() {
333        final Bundle origGuestRestrictions = mUserManager.getDefaultGuestRestrictions();
334        Bundle restrictions = new Bundle();
335        restrictions.putBoolean(UserManager.DISALLOW_FUN, true);
336        mUserManager.setDefaultGuestRestrictions(restrictions);
337
338        try {
339            UserInfo guest = createUser("Guest", UserInfo.FLAG_GUEST);
340            assertNotNull(guest);
341            assertTrue(mUserManager.hasUserRestriction(UserManager.DISALLOW_FUN,
342                    guest.getUserHandle()));
343        } finally {
344            mUserManager.setDefaultGuestRestrictions(origGuestRestrictions);
345        }
346    }
347
348    @LargeTest
349    public void testSwitchUser() {
350        ActivityManager am = getContext().getSystemService(ActivityManager.class);
351        final int startUser = am.getCurrentUser();
352        UserInfo user = createUser("User", 0);
353        assertNotNull(user);
354        // Switch to the user just created.
355        switchUser(user.id);
356        // Switch back to the starting user.
357        switchUser(startUser);
358    }
359
360    private void switchUser(int userId) {
361        synchronized (mUserSwitchLock) {
362            ActivityManager am = getContext().getSystemService(ActivityManager.class);
363            am.switchUser(userId);
364            long time = System.currentTimeMillis();
365            try {
366                mUserSwitchLock.wait(SWITCH_USER_TIMEOUT_MILLIS);
367            } catch (InterruptedException ie) {
368                Thread.currentThread().interrupt();
369                return;
370            }
371            if (System.currentTimeMillis() - time > SWITCH_USER_TIMEOUT_MILLIS) {
372                fail("Timeout waiting for the user switch to u" + userId);
373            }
374        }
375    }
376
377    private void removeUser(int userId) {
378        synchronized (mUserRemoveLock) {
379            mUserManager.removeUser(userId);
380            long time = System.currentTimeMillis();
381            while (mUserManager.getUserInfo(userId) != null) {
382                try {
383                    mUserRemoveLock.wait(REMOVE_CHECK_INTERVAL_MILLIS);
384                } catch (InterruptedException ie) {
385                    Thread.currentThread().interrupt();
386                    return;
387                }
388                if (System.currentTimeMillis() - time > REMOVE_TIMEOUT_MILLIS) {
389                    fail("Timeout waiting for removeUser. userId = " + userId);
390                }
391            }
392        }
393    }
394
395    private UserInfo createUser(String name, int flags) {
396        UserInfo user = mUserManager.createUser(name, flags);
397        if (user != null) {
398            usersToRemove.add(user.id);
399        }
400        return user;
401    }
402
403    private UserInfo createProfileForUser(String name, int flags, int userHandle) {
404        UserInfo profile = mUserManager.createProfileForUser(name, flags, userHandle);
405        if (profile != null) {
406            usersToRemove.add(profile.id);
407        }
408        return profile;
409    }
410
411    private UserInfo createRestrictedProfile(String name) {
412        UserInfo profile = mUserManager.createRestrictedProfile(name);
413        if (profile != null) {
414            usersToRemove.add(profile.id);
415        }
416        return profile;
417    }
418}
419