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