1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; 4 import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2; 5 import static android.os.Build.VERSION_CODES.LOLLIPOP; 6 import static android.os.Build.VERSION_CODES.N; 7 import static android.os.Build.VERSION_CODES.N_MR1; 8 import static org.assertj.core.api.Assertions.assertThat; 9 import static org.junit.Assert.fail; 10 import static org.robolectric.Shadows.shadowOf; 11 12 import android.Manifest.permission; 13 import android.content.Context; 14 import android.content.pm.PackageInfo; 15 import android.content.pm.PackageManager; 16 import android.os.Bundle; 17 import android.os.Parcel; 18 import android.os.Process; 19 import android.os.UserHandle; 20 import android.os.UserManager; 21 import org.junit.Before; 22 import org.junit.Test; 23 import org.junit.runner.RunWith; 24 import org.robolectric.RobolectricTestRunner; 25 import org.robolectric.RuntimeEnvironment; 26 import org.robolectric.annotation.Config; 27 import org.robolectric.shadows.ShadowUserManager.UserState; 28 29 @RunWith(RobolectricTestRunner.class) 30 public class ShadowUserManagerTest { 31 32 private UserManager userManager; 33 private Context context; 34 35 @Before 36 public void setUp() { 37 context = RuntimeEnvironment.application; 38 userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 39 } 40 41 @Test 42 @Config(minSdk = LOLLIPOP) 43 public void shouldGetUserProfiles() { 44 assertThat(userManager.getUserProfiles()).contains(Process.myUserHandle()); 45 46 UserHandle anotherProfile = newUserHandle(2); 47 shadowOf(userManager).addUserProfile(anotherProfile); 48 49 assertThat(userManager.getUserProfiles()).containsOnly(Process.myUserHandle(), anotherProfile); 50 } 51 52 @Test 53 @Config(minSdk = JELLY_BEAN_MR2) 54 public void testGetApplicationRestrictions() { 55 String packageName = context.getPackageName(); 56 assertThat(userManager.getApplicationRestrictions(packageName).size()).isZero(); 57 58 Bundle restrictions = new Bundle(); 59 restrictions.putCharSequence("test_key", "test_value"); 60 shadowOf(userManager).setApplicationRestrictions(packageName, restrictions); 61 62 assertThat(userManager.getApplicationRestrictions(packageName).getCharSequence("test_key")) 63 .isEqualTo("test_value"); 64 } 65 66 @Test 67 @Config(minSdk = N) 68 public void isUserUnlocked() { 69 assertThat(userManager.isUserUnlocked()).isTrue(); 70 shadowOf(userManager).setUserUnlocked(false); 71 assertThat(userManager.isUserUnlocked()).isFalse(); 72 } 73 74 @Test 75 @Config(minSdk = LOLLIPOP) 76 public void hasUserRestriction() { 77 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse(); 78 79 UserHandle userHandle = Process.myUserHandle(); 80 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true); 81 82 assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 83 } 84 85 @Test 86 @Config(minSdk = JELLY_BEAN_MR2) 87 public void getUserRestrictions() { 88 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 89 90 UserHandle userHandle = Process.myUserHandle(); 91 shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true); 92 93 Bundle restrictions = userManager.getUserRestrictions(); 94 assertThat(restrictions.size()).isEqualTo(1); 95 assertThat(restrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)).isTrue(); 96 97 shadowOf(userManager).setUserRestriction(newUserHandle(10), UserManager.DISALLOW_CAMERA, true); 98 99 assertThat(userManager.hasUserRestriction(UserManager.DISALLOW_CAMERA)).isFalse(); 100 } 101 102 @Test 103 @Config(minSdk = JELLY_BEAN_MR2) 104 public void clearUserRestrictions() { 105 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 106 shadowOf(userManager) 107 .setUserRestriction(Process.myUserHandle(), UserManager.ENSURE_VERIFY_APPS, true); 108 assertThat(userManager.getUserRestrictions().size()).isEqualTo(1); 109 110 shadowOf(userManager).clearUserRestrictions(Process.myUserHandle()); 111 assertThat(userManager.getUserRestrictions().size()).isEqualTo(0); 112 } 113 114 @Test 115 @Config(minSdk = LOLLIPOP) 116 public void isManagedProfile() { 117 assertThat(userManager.isManagedProfile()).isFalse(); 118 shadowOf(userManager).setManagedProfile(true); 119 assertThat(userManager.isManagedProfile()).isTrue(); 120 } 121 122 @Test 123 @Config(minSdk = LOLLIPOP) 124 public void enforcePermissionChecks() throws Exception { 125 shadowOf(userManager).enforcePermissionChecks(true); 126 127 try { 128 userManager.isManagedProfile(); 129 fail("Expected exception"); 130 } catch (SecurityException expected) {} 131 132 PackageInfo packageInfo = RuntimeEnvironment.application.getPackageManager() 133 .getPackageInfo(RuntimeEnvironment.application.getPackageName(), 134 PackageManager.GET_PERMISSIONS); 135 packageInfo.requestedPermissions = new String[] { permission.MANAGE_USERS }; 136 137 shadowOf(userManager).setManagedProfile(true); 138 139 assertThat(userManager.isManagedProfile()).isTrue(); 140 } 141 142 @Test 143 @Config(minSdk = JELLY_BEAN_MR1) 144 public void shouldGetSerialNumberForUser() { 145 long serialNumberInvalid = -1L; 146 147 UserHandle userHandle = newUserHandle(10); 148 assertThat(userManager.getSerialNumberForUser(userHandle)).isEqualTo(serialNumberInvalid); 149 150 shadowOf(userManager).addUserProfile(userHandle); 151 152 assertThat(userManager.getSerialNumberForUser(userHandle)).isNotEqualTo(serialNumberInvalid); 153 } 154 155 @Test 156 @Config(minSdk = N_MR1) 157 public void isDemoUser() { 158 // All methods are based on the current user, so no need to pass a UserHandle. 159 assertThat(userManager.isDemoUser()).isFalse(); 160 161 shadowOf(userManager).setIsDemoUser(true); 162 assertThat(userManager.isDemoUser()).isTrue(); 163 164 shadowOf(userManager).setIsDemoUser(false); 165 assertThat(userManager.isDemoUser()).isFalse(); 166 } 167 168 @Test 169 @Config(minSdk = N_MR1) 170 public void isAdminUser() { 171 // All methods are based on the current user, so no need to pass a UserHandle. 172 assertThat(userManager.isAdminUser()).isFalse(); 173 174 shadowOf(userManager).setIsAdminUser(true); 175 assertThat(userManager.isAdminUser()).isTrue(); 176 177 shadowOf(userManager).setIsAdminUser(false); 178 assertThat(userManager.isAdminUser()).isFalse(); 179 } 180 181 @Test 182 @Config(minSdk = JELLY_BEAN_MR1) 183 public void isUserRunning() { 184 UserHandle userHandle = newUserHandle(0); 185 186 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 187 188 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 189 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 190 191 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 192 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 193 194 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 195 assertThat(userManager.isUserRunning(userHandle)).isTrue(); 196 197 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 198 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 199 200 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 201 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 202 203 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 204 assertThat(userManager.isUserRunning(userHandle)).isFalse(); 205 } 206 207 @Test 208 @Config(minSdk = JELLY_BEAN_MR1) 209 public void isUserRunningOrStopping() { 210 UserHandle userHandle = newUserHandle(0); 211 212 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 213 214 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKED); 215 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 216 217 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_LOCKED); 218 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 219 220 shadowOf(userManager).setUserState(userHandle, UserState.STATE_RUNNING_UNLOCKING); 221 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 222 223 shadowOf(userManager).setUserState(userHandle, UserState.STATE_STOPPING); 224 assertThat(userManager.isUserRunningOrStopping(userHandle)).isTrue(); 225 226 shadowOf(userManager).setUserState(userHandle, UserState.STATE_BOOTING); 227 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 228 229 shadowOf(userManager).setUserState(userHandle, UserState.STATE_SHUTDOWN); 230 assertThat(userManager.isUserRunningOrStopping(userHandle)).isFalse(); 231 } 232 233 // Create user handle from parcel since UserHandle.of() was only added in later APIs. 234 private static UserHandle newUserHandle(int uid) { 235 Parcel userParcel = Parcel.obtain(); 236 userParcel.writeInt(uid); 237 userParcel.setDataPosition(0); 238 return new UserHandle(userParcel); 239 } 240 } 241