Home | History | Annotate | Download | only in shadows
      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