UserManagerTest.java revision e4cf73437a18c1444055f88a1fcc0d146ec23ac5
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2011 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * See the License for the specific language governing permissions and
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * limitations under the License.
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package com.android.server.pm;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.BroadcastReceiver;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Intent;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.IntentFilter;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.pm.UserInfo;
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import android.os.Bundle;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import android.os.Debug;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import android.os.Environment;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import android.os.UserManager;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import android.test.AndroidTestCase;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.ArrayList;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.List;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** Test {@link UserManager} functionality. */
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class UserManagerTest extends AndroidTestCase {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UserManager mUserManager = null;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Object mUserLock = new Object();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @Override
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void setUp() throws Exception {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        getContext().registerReceiver(new BroadcastReceiver() {
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            @Override
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            public void onReceive(Context context, Intent intent) {
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                synchronized (mUserLock) {
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    mUserLock.notifyAll();
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }, filter);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    public void testHasPrimary() throws Exception {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        assertTrue(findUser(0));
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void testAddUser() throws Exception {
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        UserInfo userInfo = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        assertTrue(userInfo != null);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        List<UserInfo> list = mUserManager.getUsers();
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        boolean found = false;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (UserInfo user : list) {
64            if (user.id == userInfo.id && user.name.equals("Guest 1")
65                    && user.isGuest()
66                    && !user.isAdmin()
67                    && !user.isPrimary()) {
68                found = true;
69            }
70        }
71        assertTrue(found);
72        removeUser(userInfo.id);
73    }
74
75    public void testAdd2Users() throws Exception {
76        UserInfo user1 = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST);
77        UserInfo user2 = mUserManager.createUser("User 2", UserInfo.FLAG_ADMIN);
78
79        assertTrue(user1 != null);
80        assertTrue(user2 != null);
81
82        assertTrue(findUser(0));
83        assertTrue(findUser(user1.id));
84        assertTrue(findUser(user2.id));
85        removeUser(user1.id);
86        removeUser(user2.id);
87    }
88
89    public void testRemoveUser() throws Exception {
90        UserInfo userInfo = mUserManager.createUser("Guest 1", UserInfo.FLAG_GUEST);
91        removeUser(userInfo.id);
92
93        assertFalse(findUser(userInfo.id));
94    }
95
96    private boolean findUser(int id) {
97        List<UserInfo> list = mUserManager.getUsers();
98
99        for (UserInfo user : list) {
100            if (user.id == id) {
101                return true;
102            }
103        }
104        return false;
105    }
106
107    public void testSerialNumber() {
108        UserInfo user1 = mUserManager.createUser("User 1", UserInfo.FLAG_RESTRICTED);
109        int serialNumber1 = user1.serialNumber;
110        assertEquals(serialNumber1, mUserManager.getUserSerialNumber(user1.id));
111        assertEquals(user1.id, mUserManager.getUserHandle(serialNumber1));
112        removeUser(user1.id);
113        UserInfo user2 = mUserManager.createUser("User 2", UserInfo.FLAG_RESTRICTED);
114        int serialNumber2 = user2.serialNumber;
115        assertFalse(serialNumber1 == serialNumber2);
116        assertEquals(serialNumber2, mUserManager.getUserSerialNumber(user2.id));
117        assertEquals(user2.id, mUserManager.getUserHandle(serialNumber2));
118        removeUser(user2.id);
119    }
120
121    public void testMaxUsers() {
122        int N = UserManager.getMaxSupportedUsers();
123        int count = mUserManager.getUsers().size();
124        List<UserInfo> created = new ArrayList<UserInfo>();
125        // Create as many users as permitted and make sure creation passes
126        while (count < N) {
127            UserInfo ui = mUserManager.createUser("User " + count, 0);
128            assertNotNull(ui);
129            created.add(ui);
130            count++;
131        }
132        // Try to create one more user and make sure it fails
133        UserInfo extra = null;
134        assertNull(extra = mUserManager.createUser("One more", 0));
135        if (extra != null) {
136            removeUser(extra.id);
137        }
138        while (!created.isEmpty()) {
139            UserInfo user = created.remove(0);
140            removeUser(user.id);
141        }
142    }
143
144    public void testRestrictions() {
145        List<UserInfo> users = mUserManager.getUsers();
146        if (users.size() > 1) {
147            Bundle restrictions = new Bundle();
148            restrictions.putBoolean(UserManager.ALLOW_INSTALL_APPS, false);
149            restrictions.putBoolean(UserManager.ALLOW_CONFIG_WIFI, true);
150            mUserManager.setUserRestrictions(restrictions, users.get(1).id);
151            Bundle stored = mUserManager.getUserRestrictions(users.get(1).id);
152            assertEquals(stored.getBoolean(UserManager.ALLOW_CONFIG_WIFI), true);
153            assertEquals(stored.getBoolean(UserManager.ALLOW_UNINSTALL_APPS), true);
154            assertEquals(stored.getBoolean(UserManager.ALLOW_INSTALL_APPS), false);
155        }
156    }
157
158    private void removeUser(int userId) {
159        synchronized (mUserLock) {
160            mUserManager.removeUser(userId);
161            while (mUserManager.getUserInfo(userId) != null) {
162                try {
163                    mUserLock.wait(1000);
164                } catch (InterruptedException ie) {
165                }
166            }
167        }
168    }
169
170}
171