UserManagerTest.java revision 72d9c026561bb681392d1a56d98faf1667a0cc48
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.os.Bundle;
25import android.os.UserHandle;
26import android.os.UserManager;
27import android.test.AndroidTestCase;
28
29import java.util.ArrayList;
30import java.util.List;
31
32/** Test {@link UserManager} functionality. */
33public class UserManagerTest extends AndroidTestCase {
34
35    private UserManager mUserManager = null;
36    private final Object mUserLock = new Object();
37    private List<Integer> usersToRemove;
38
39    @Override
40    public void setUp() throws Exception {
41        super.setUp();
42        mUserManager = UserManager.get(getContext());
43        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
44        getContext().registerReceiver(new BroadcastReceiver() {
45            @Override
46            public void onReceive(Context context, Intent intent) {
47                synchronized (mUserLock) {
48                    mUserLock.notifyAll();
49                }
50            }
51        }, filter);
52
53        removeExistingUsers();
54        usersToRemove = new ArrayList<>();
55    }
56
57    @Override
58    protected void tearDown() throws Exception {
59        for (Integer userId : usersToRemove) {
60            removeUser(userId);
61        }
62        super.tearDown();
63    }
64
65    private void removeExistingUsers() {
66        List<UserInfo> list = mUserManager.getUsers();
67        for (UserInfo user : list) {
68            // Keep system and primary user.
69            // We do not have to keep primary user, but in split system user mode, we need it
70            // until http://b/22976637 is fixed.  Right now in split system user mode, you need to
71            // switch to primary user and run tests under primary user.
72            if (user.id != UserHandle.USER_SYSTEM && !user.isPrimary()) {
73                removeUser(user.id);
74            }
75        }
76    }
77
78    public void testHasSystemUser() throws Exception {
79        assertTrue(findUser(UserHandle.USER_SYSTEM));
80    }
81
82    public void testAddUser() throws Exception {
83        UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
84        assertTrue(userInfo != null);
85
86        List<UserInfo> list = mUserManager.getUsers();
87        boolean found = false;
88        for (UserInfo user : list) {
89            if (user.id == userInfo.id && user.name.equals("Guest 1")
90                    && user.isGuest()
91                    && !user.isAdmin()
92                    && !user.isPrimary()) {
93                found = true;
94                Bundle restrictions = mUserManager.getUserRestrictions(user.getUserHandle());
95                assertFalse("New user should have DISALLOW_CONFIG_WIFI =false by default",
96                        restrictions.getBoolean(UserManager.DISALLOW_CONFIG_WIFI));
97            }
98        }
99        assertTrue(found);
100    }
101
102    public void testAdd2Users() throws Exception {
103        UserInfo user1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
104        UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN);
105
106        assertTrue(user1 != null);
107        assertTrue(user2 != null);
108
109        assertTrue(findUser(0));
110        assertTrue(findUser(user1.id));
111        assertTrue(findUser(user2.id));
112    }
113
114    public void testRemoveUser() throws Exception {
115        UserInfo userInfo = createUser("Guest 1", UserInfo.FLAG_GUEST);
116        removeUser(userInfo.id);
117
118        assertFalse(findUser(userInfo.id));
119    }
120
121    public void testAddGuest() throws Exception {
122        UserInfo userInfo1 = createUser("Guest 1", UserInfo.FLAG_GUEST);
123        UserInfo userInfo2 = createUser("Guest 2", UserInfo.FLAG_GUEST);
124        assertNotNull(userInfo1);
125        assertNull(userInfo2);
126    }
127
128    // Make sure only one managed profile can be created
129    public void testAddManagedProfile() throws Exception {
130        final int primaryUserId = mUserManager.getPrimaryUser().id;
131        UserInfo userInfo1 = createProfileForUser("Managed 1",
132                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
133        UserInfo userInfo2 = createProfileForUser("Managed 2",
134                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
135        assertNotNull(userInfo1);
136        assertNull(userInfo2);
137        // Verify that current user is not a managed profile
138        assertFalse(mUserManager.isManagedProfile());
139    }
140
141    public void testGetUserCreationTime() throws Exception {
142        final int primaryUserId = mUserManager.getPrimaryUser().id;
143        UserInfo profile = createProfileForUser("Managed 1",
144                UserInfo.FLAG_MANAGED_PROFILE, primaryUserId);
145        assertNotNull(profile);
146        assertTrue("creationTime must be set when the profile is created",
147                profile.creationTime > 0);
148        assertEquals(profile.creationTime, mUserManager.getUserCreationTime(
149                new UserHandle(profile.id)));
150
151        long ownerCreationTime = mUserManager.getUserInfo(primaryUserId).creationTime;
152        assertEquals(ownerCreationTime, mUserManager.getUserCreationTime(
153                new UserHandle(primaryUserId)));
154
155        try {
156            int noSuchUserId = 100500;
157            mUserManager.getUserCreationTime(new UserHandle(noSuchUserId));
158            fail("SecurityException should be thrown for nonexistent user");
159        } catch (Exception e) {
160            assertTrue("SecurityException should be thrown for nonexistent user, but was: " + e,
161                    e instanceof SecurityException);
162        }
163
164        UserInfo user = createUser("User 1", 0);
165        try {
166            mUserManager.getUserCreationTime(new UserHandle(user.id));
167            fail("SecurityException should be thrown for other user");
168        } catch (Exception e) {
169            assertTrue("SecurityException should be thrown for other user, but was: " + e,
170                    e instanceof SecurityException);
171        }
172    }
173
174
175    private boolean findUser(int id) {
176        List<UserInfo> list = mUserManager.getUsers();
177
178        for (UserInfo user : list) {
179            if (user.id == id) {
180                return true;
181            }
182        }
183        return false;
184    }
185
186    public void testSerialNumber() {
187        UserInfo user1 = createUser("User 1", 0);
188        int serialNumber1 = user1.serialNumber;
189        assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id));
190        assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1));
191        UserInfo user2 = createUser("User 2", 0);
192        int serialNumber2 = user2.serialNumber;
193        assertFalse(serialNumber1 == serialNumber2);
194        assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id));
195        assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2));
196    }
197
198    public void testMaxUsers() {
199        int N = UserManager.getMaxSupportedUsers();
200        int count = mUserManager.getUsers().size();
201        // Create as many users as permitted and make sure creation passes
202        while (count < N) {
203            UserInfo ui = createUser("User " + count, 0);
204            assertNotNull(ui);
205            count++;
206        }
207        // Try to create one more user and make sure it fails
208        UserInfo extra = createUser("One more", 0);
209        assertNull(extra);
210    }
211
212    public void testRestrictions() {
213        UserInfo testUser = createUser("User 1", 0);
214        Bundle restrictions = new Bundle();
215        restrictions.putBoolean(UserManager.DISALLOW_INSTALL_APPS, true);
216        restrictions.putBoolean(UserManager.DISALLOW_CONFIG_WIFI, false);
217        mUserManager.setUserRestrictions(restrictions, new UserHandle(testUser.id));
218        Bundle stored = mUserManager.getUserRestrictions(new UserHandle(testUser.id));
219        assertEquals(stored.getBoolean(UserManager.DISALLOW_CONFIG_WIFI), false);
220        assertEquals(stored.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS), false);
221        assertEquals(stored.getBoolean(UserManager.DISALLOW_INSTALL_APPS), true);
222    }
223
224    private void removeUser(int userId) {
225        synchronized (mUserLock) {
226            mUserManager.removeUser(userId);
227            while (mUserManager.getUserInfo(userId) != null) {
228                try {
229                    mUserLock.wait(500);
230                } catch (InterruptedException ie) {
231                }
232            }
233        }
234    }
235
236    private UserInfo createUser(String name, int flags) {
237        UserInfo user = mUserManager.createUser(name, flags);
238        if (user != null) {
239            usersToRemove.add(user.id);
240        }
241        return user;
242    }
243
244    private UserInfo createProfileForUser(String name, int flags, int userHandle) {
245        UserInfo profile = mUserManager.createProfileForUser(name, flags, userHandle);
246        if (profile != null) {
247            usersToRemove.add(profile.id);
248        }
249        return profile;
250    }
251
252}
253