Home | History | Annotate | Download | only in deviceowner
      1 /*
      2  * Copyright (C) 2016 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 
     17 package com.android.cts.deviceowner;
     18 
     19 import android.app.ActivityManager;
     20 import android.app.Service;
     21 import android.app.admin.DeviceAdminReceiver;
     22 import android.app.admin.DevicePolicyManager;
     23 import android.content.BroadcastReceiver;
     24 import android.content.ComponentName;
     25 import android.content.Context;
     26 import android.content.Intent;
     27 import android.content.IntentFilter;
     28 import android.content.ServiceConnection;
     29 import android.content.pm.PackageManager;
     30 import android.os.IBinder;
     31 import android.os.PersistableBundle;
     32 import android.os.Process;
     33 import android.os.RemoteException;
     34 import android.os.UserHandle;
     35 import android.os.UserManager;
     36 import android.provider.Settings;
     37 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
     38 import android.util.Log;
     39 
     40 import java.lang.reflect.InvocationTargetException;
     41 import java.lang.reflect.Method;
     42 import java.util.Collections;
     43 import java.util.List;
     44 import java.util.Set;
     45 import java.util.concurrent.Semaphore;
     46 import java.util.concurrent.LinkedBlockingQueue;
     47 import java.util.concurrent.TimeUnit;
     48 import java.util.function.Predicate;
     49 import java.util.stream.Collectors;
     50 
     51 /**
     52  * Test {@link DevicePolicyManager#createAndManageUser}.
     53  */
     54 public class CreateAndManageUserTest extends BaseDeviceOwnerTest {
     55     private static final String TAG = "CreateAndManageUserTest";
     56 
     57     private static final String BROADCAST_EXTRA = "broadcastExtra";
     58     private static final String ACTION_EXTRA = "actionExtra";
     59     private static final String SERIAL_EXTRA = "serialExtra";
     60     private static final String PROFILE_OWNER_EXTRA = "profileOwnerExtra";
     61     private static final String SETUP_COMPLETE_EXTRA = "setupCompleteExtra";
     62     private static final int BROADCAST_TIMEOUT = 15_000;
     63     private static final int USER_SWITCH_DELAY = 10_000;
     64 
     65     private static final String AFFILIATION_ID = "affiliation.id";
     66     private static final String EXTRA_AFFILIATION_ID = "affiliationIdExtra";
     67     private static final String EXTRA_METHOD_NAME = "methodName";
     68     private static final long ON_ENABLED_TIMEOUT_SECONDS = 120;
     69 
     70 
     71     private PackageManager mPackageManager;
     72     private ActivityManager mActivityManager;
     73     private volatile boolean mReceived;
     74     private volatile boolean mTestProfileOwnerWasUsed;
     75     private volatile boolean mSetupComplete;
     76 
     77     @Override
     78     protected void setUp() throws Exception {
     79         super.setUp();
     80         mPackageManager = mContext.getPackageManager();
     81         mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
     82     }
     83 
     84     @Override
     85     protected void tearDown() throws Exception {
     86         mDevicePolicyManager.clearUserRestriction(getWho(), UserManager.DISALLOW_ADD_USER);
     87         mDevicePolicyManager.clearUserRestriction(getWho(), UserManager.DISALLOW_REMOVE_USER);
     88         super.tearDown();
     89     }
     90 
     91     // This class is used by createAndManageUserTest as profile owner for the new user. When
     92     // enabled, it sends a broadcast to signal success.
     93     public static class TestProfileOwner extends DeviceAdminReceiver {
     94         @Override
     95         public void onEnabled(Context context, Intent intent) {
     96             if (intent.getBooleanExtra(BROADCAST_EXTRA, false)) {
     97                 Intent i = new Intent(intent.getStringExtra(ACTION_EXTRA));
     98                 UserManager userManager = (UserManager)
     99                         context.getSystemService(Context.USER_SERVICE);
    100                 long serial = intent.getLongExtra(SERIAL_EXTRA, 0);
    101                 UserHandle handle = userManager.getUserForSerialNumber(serial);
    102                 i.putExtra(PROFILE_OWNER_EXTRA, true);
    103                 // find value of user_setup_complete on new user, and send the result back
    104                 try {
    105                     boolean setupComplete = (Settings.Secure.getInt(context.getContentResolver(),
    106                             "user_setup_complete") == 1);
    107                     i.putExtra(SETUP_COMPLETE_EXTRA, setupComplete);
    108                 } catch (Settings.SettingNotFoundException e) {
    109                     fail("Did not find settings user_setup_complete");
    110                 }
    111 
    112                 context.sendBroadcastAsUser(i, handle);
    113             }
    114         }
    115 
    116         public static ComponentName getComponentName() {
    117             return new ComponentName(CreateAndManageUserTest.class.getPackage().getName(),
    118                     TestProfileOwner.class.getName());
    119         }
    120     }
    121 
    122     private void waitForBroadcastLocked() {
    123         // Wait for broadcast. Time is measured in a while loop because of spurious wakeups.
    124         final long initTime = System.currentTimeMillis();
    125         while (!mReceived) {
    126             try {
    127                 wait(BROADCAST_TIMEOUT - (System.currentTimeMillis() - initTime));
    128             } catch (InterruptedException e) {
    129                 fail("InterruptedException: " + e.getMessage());
    130             }
    131             if (!mReceived && System.currentTimeMillis() - initTime > BROADCAST_TIMEOUT) {
    132                 fail("Timeout while waiting for broadcast after createAndManageUser.");
    133             }
    134         }
    135     }
    136 
    137     // This test will create a user that will get passed a bundle that we specify. The bundle will
    138     // contain an action and a serial (for user handle) to broadcast to notify the test that the
    139     // configuration was triggered.
    140     private void createAndManageUserTest(final int flags) {
    141         // This test sets a profile owner on the user, which requires the managed_users feature.
    142         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    143             return;
    144         }
    145 
    146         final boolean expectedSetupComplete = (flags & DevicePolicyManager.SKIP_SETUP_WIZARD) != 0;
    147         UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
    148 
    149         UserHandle firstUser = Process.myUserHandle();
    150         final String testUserName = "TestUser_" + System.currentTimeMillis();
    151         String action = "com.android.cts.TEST_USER_ACTION";
    152         PersistableBundle bundle = new PersistableBundle();
    153         bundle.putBoolean(BROADCAST_EXTRA, true);
    154         bundle.putLong(SERIAL_EXTRA, userManager.getSerialNumberForUser(firstUser));
    155         bundle.putString(ACTION_EXTRA, action);
    156 
    157         mReceived = false;
    158         mTestProfileOwnerWasUsed = false;
    159         mSetupComplete = !expectedSetupComplete;
    160         BroadcastReceiver receiver = new BroadcastReceiver() {
    161             @Override
    162             public void onReceive(Context context, Intent intent) {
    163                 mReceived = true;
    164                 if (intent.getBooleanExtra(PROFILE_OWNER_EXTRA, false)) {
    165                     mTestProfileOwnerWasUsed = true;
    166                 }
    167                 mSetupComplete = intent.getBooleanExtra(SETUP_COMPLETE_EXTRA,
    168                         !expectedSetupComplete);
    169                 synchronized (CreateAndManageUserTest.this) {
    170                     CreateAndManageUserTest.this.notify();
    171                 }
    172             }
    173         };
    174 
    175         IntentFilter filter = new IntentFilter();
    176         filter.addAction(action);
    177         mContext.registerReceiver(receiver, filter);
    178 
    179         synchronized (this) {
    180             UserHandle userHandle = mDevicePolicyManager.createAndManageUser(getWho(), testUserName,
    181                     TestProfileOwner.getComponentName(), bundle, flags);
    182             assertNotNull(userHandle);
    183 
    184             mDevicePolicyManager.switchUser(getWho(), userHandle);
    185             try {
    186                 wait(USER_SWITCH_DELAY);
    187             } catch (InterruptedException e) {
    188                 fail("InterruptedException: " + e.getMessage());
    189             }
    190             mDevicePolicyManager.switchUser(getWho(), firstUser);
    191 
    192             waitForBroadcastLocked();
    193 
    194             assertTrue(mReceived);
    195             assertTrue(mTestProfileOwnerWasUsed);
    196             assertEquals(expectedSetupComplete, mSetupComplete);
    197 
    198             assertTrue(mDevicePolicyManager.removeUser(getWho(), userHandle));
    199 
    200             userHandle = null;
    201         }
    202 
    203         mContext.unregisterReceiver(receiver);
    204     }
    205 
    206     public void testCreateAndManageUser() throws Exception {
    207         String testUserName = "TestUser_" + System.currentTimeMillis();
    208 
    209         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    210                 getWho(),
    211                 testUserName,
    212                 getWho(),
    213                 null,
    214                 /* flags */ 0);
    215         Log.d(TAG, "User create: " + userHandle);
    216     }
    217 
    218     public void testCreateAndManageUser_LowStorage() throws Exception {
    219         String testUserName = "TestUser_" + System.currentTimeMillis();
    220 
    221         try {
    222             mDevicePolicyManager.createAndManageUser(
    223                     getWho(),
    224                     testUserName,
    225                     getWho(),
    226                     null,
    227                 /* flags */ 0);
    228             fail("createAndManageUser should throw UserOperationException");
    229         } catch (UserManager.UserOperationException e) {
    230             assertEquals(UserManager.USER_OPERATION_ERROR_LOW_STORAGE, e.getUserOperationResult());
    231         }
    232     }
    233 
    234     public void testCreateAndManageUser_MaxUsers() throws Exception {
    235         String testUserName = "TestUser_" + System.currentTimeMillis();
    236 
    237         try {
    238             mDevicePolicyManager.createAndManageUser(
    239                     getWho(),
    240                     testUserName,
    241                     getWho(),
    242                     null,
    243                 /* flags */ 0);
    244             fail("createAndManageUser should throw UserOperationException");
    245         } catch (UserManager.UserOperationException e) {
    246             assertEquals(UserManager.USER_OPERATION_ERROR_MAX_USERS, e.getUserOperationResult());
    247         }
    248     }
    249 
    250     public void testCreateAndManageUser_GetSecondaryUsers() throws Exception {
    251         String testUserName = "TestUser_" + System.currentTimeMillis();
    252 
    253         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    254                 getWho(),
    255                 testUserName,
    256                 getWho(),
    257                 null,
    258                 /* flags */ 0);
    259         Log.d(TAG, "User create: " + userHandle);
    260 
    261         List<UserHandle> secondaryUsers = mDevicePolicyManager.getSecondaryUsers(getWho());
    262         assertEquals(1, secondaryUsers.size());
    263         assertEquals(userHandle, secondaryUsers.get(0));
    264     }
    265 
    266     public void testCreateAndManageUser_SwitchUser() throws Exception {
    267         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    268                 getContext());
    269 
    270         String testUserName = "TestUser_" + System.currentTimeMillis();
    271 
    272         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    273                 getWho(),
    274                 testUserName,
    275                 getWho(),
    276                 null,
    277                 /* flags */ 0);
    278         Log.d(TAG, "User create: " + userHandle);
    279 
    280         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    281         localBroadcastManager.registerReceiver(broadcastReceiver,
    282                 new IntentFilter(BasicAdminReceiver.ACTION_USER_SWITCHED));
    283         try {
    284             assertTrue(mDevicePolicyManager.switchUser(getWho(), userHandle));
    285             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    286         } finally {
    287             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    288         }
    289     }
    290 
    291     public void testCreateAndManageUser_CannotStopCurrentUser() throws Exception {
    292         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    293                 getContext());
    294 
    295         String testUserName = "TestUser_" + System.currentTimeMillis();
    296 
    297         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    298                 getWho(),
    299                 testUserName,
    300                 getWho(),
    301                 null,
    302                 /* flags */ 0);
    303         Log.d(TAG, "User create: " + userHandle);
    304 
    305         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    306         localBroadcastManager.registerReceiver(broadcastReceiver,
    307                 new IntentFilter(BasicAdminReceiver.ACTION_USER_SWITCHED));
    308         try {
    309             assertTrue(mDevicePolicyManager.switchUser(getWho(), userHandle));
    310             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    311             assertEquals(UserManager.USER_OPERATION_ERROR_CURRENT_USER,
    312                     mDevicePolicyManager.stopUser(getWho(), userHandle));
    313         } finally {
    314             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    315         }
    316     }
    317 
    318     public void testCreateAndManageUser_StartInBackground() throws Exception {
    319         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    320                 getContext());
    321 
    322         String testUserName = "TestUser_" + System.currentTimeMillis();
    323 
    324         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    325                 getWho(),
    326                 testUserName,
    327                 getWho(),
    328                 null,
    329                 /* flags */ 0);
    330         Log.d(TAG, "User create: " + userHandle);
    331 
    332         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    333         localBroadcastManager.registerReceiver(broadcastReceiver,
    334                 new IntentFilter(BasicAdminReceiver.ACTION_USER_STARTED));
    335 
    336         try {
    337             // Start user in background and wait for onUserStarted
    338             assertEquals(UserManager.USER_OPERATION_SUCCESS,
    339                     mDevicePolicyManager.startUserInBackground(getWho(), userHandle));
    340             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    341         } finally {
    342             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    343         }
    344     }
    345 
    346     public void testCreateAndManageUser_StartInBackground_MaxRunningUsers() throws Exception {
    347         String testUserName = "TestUser_" + System.currentTimeMillis();
    348 
    349         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    350                 getWho(),
    351                 testUserName,
    352                 getWho(),
    353                 null,
    354                 /* flags */ 0);
    355         Log.d(TAG, "User create: " + userHandle);
    356 
    357         // Start user in background and should receive max running users error
    358         assertEquals(UserManager.USER_OPERATION_ERROR_MAX_RUNNING_USERS,
    359                 mDevicePolicyManager.startUserInBackground(getWho(), userHandle));
    360     }
    361 
    362     public void testCreateAndManageUser_StopUser() throws Exception {
    363         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    364                 getContext());
    365 
    366         String testUserName = "TestUser_" + System.currentTimeMillis();
    367 
    368         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    369                 getWho(),
    370                 testUserName,
    371                 getWho(),
    372                 null,
    373                 /* flags */ 0);
    374         Log.d(TAG, "User create: " + userHandle);
    375         assertEquals(UserManager.USER_OPERATION_SUCCESS,
    376                 mDevicePolicyManager.startUserInBackground(getWho(), userHandle));
    377 
    378         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    379         localBroadcastManager.registerReceiver(broadcastReceiver,
    380                 new IntentFilter(BasicAdminReceiver.ACTION_USER_STOPPED));
    381 
    382         try {
    383             assertEquals(UserManager.USER_OPERATION_SUCCESS,
    384                     mDevicePolicyManager.stopUser(getWho(), userHandle));
    385             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    386         } finally {
    387             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    388         }
    389     }
    390 
    391     public void testCreateAndManageUser_StopEphemeralUser_DisallowRemoveUser() throws Exception {
    392         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    393                 getContext());
    394 
    395         String testUserName = "TestUser_" + System.currentTimeMillis();
    396 
    397         // Set DISALLOW_REMOVE_USER restriction
    398         mDevicePolicyManager.addUserRestriction(getWho(), UserManager.DISALLOW_REMOVE_USER);
    399 
    400         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    401                 getWho(),
    402                 testUserName,
    403                 getWho(),
    404                 null,
    405                 DevicePolicyManager.MAKE_USER_EPHEMERAL);
    406         Log.d(TAG, "User create: " + userHandle);
    407         assertEquals(UserManager.USER_OPERATION_SUCCESS,
    408                 mDevicePolicyManager.startUserInBackground(getWho(), userHandle));
    409 
    410         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    411         localBroadcastManager.registerReceiver(broadcastReceiver,
    412                 new IntentFilter(BasicAdminReceiver.ACTION_USER_REMOVED));
    413 
    414         try {
    415             assertEquals(UserManager.USER_OPERATION_SUCCESS,
    416                     mDevicePolicyManager.stopUser(getWho(), userHandle));
    417             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    418         } finally {
    419             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    420             // Clear DISALLOW_REMOVE_USER restriction
    421             mDevicePolicyManager.clearUserRestriction(getWho(), UserManager.DISALLOW_REMOVE_USER);
    422         }
    423     }
    424 
    425     @SuppressWarnings("unused")
    426     private static void logoutUser(Context context, DevicePolicyManager devicePolicyManager,
    427             ComponentName componentName) {
    428         assertEquals("cannot logout user", UserManager.USER_OPERATION_SUCCESS,
    429                 devicePolicyManager.logoutUser(componentName));
    430     }
    431 
    432     public void testCreateAndManageUser_LogoutUser() throws Exception {
    433         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    434                 getContext());
    435 
    436         LocalBroadcastReceiver broadcastReceiver = new LocalBroadcastReceiver();
    437         localBroadcastManager.registerReceiver(broadcastReceiver,
    438                 new IntentFilter(BasicAdminReceiver.ACTION_USER_STOPPED));
    439 
    440         try {
    441             UserHandle userHandle = runCrossUserVerification(
    442                     /* createAndManageUserFlags */ 0, "logoutUser");
    443             assertEquals(userHandle, broadcastReceiver.waitForBroadcastReceived());
    444         } finally {
    445             localBroadcastManager.unregisterReceiver(broadcastReceiver);
    446         }
    447     }
    448 
    449     @SuppressWarnings("unused")
    450     private static void assertAffiliatedUser(Context context,
    451             DevicePolicyManager devicePolicyManager, ComponentName componentName) {
    452         assertTrue("not affiliated user", devicePolicyManager.isAffiliatedUser());
    453     }
    454 
    455     public void testCreateAndManageUser_Affiliated() throws Exception {
    456         runCrossUserVerification(/* createAndManageUserFlags */ 0, "assertAffiliatedUser");
    457         PrimaryUserService.assertCrossUserCallArrived();
    458     }
    459 
    460     @SuppressWarnings("unused")
    461     private static void assertEphemeralUser(Context context,
    462             DevicePolicyManager devicePolicyManager, ComponentName componentName) {
    463         assertTrue("not ephemeral user", devicePolicyManager.isEphemeralUser(componentName));
    464     }
    465 
    466     public void testCreateAndManageUser_Ephemeral() throws Exception {
    467         runCrossUserVerification(DevicePolicyManager.MAKE_USER_EPHEMERAL, "assertEphemeralUser");
    468         PrimaryUserService.assertCrossUserCallArrived();
    469     }
    470 
    471     @SuppressWarnings("unused")
    472     private static void assertAllSystemAppsInstalled(Context context,
    473             DevicePolicyManager devicePolicyManager, ComponentName componentName) {
    474         PackageManager packageManager = context.getPackageManager();
    475         // First get a set of installed package names
    476         Set<String> installedPackageNames = packageManager
    477                 .getInstalledApplications(/* flags */ 0)
    478                 .stream()
    479                 .map(applicationInfo -> applicationInfo.packageName)
    480                 .collect(Collectors.toSet());
    481         // Then filter all package names by those that are not installed
    482         Set<String> uninstalledPackageNames = packageManager
    483                 .getInstalledApplications(PackageManager.MATCH_UNINSTALLED_PACKAGES)
    484                 .stream()
    485                 .map(applicationInfo -> applicationInfo.packageName)
    486                 .filter(((Predicate<String>) installedPackageNames::contains).negate())
    487                 .collect(Collectors.toSet());
    488         // Assert that all apps are installed
    489         assertTrue("system apps not installed: " + uninstalledPackageNames,
    490                 uninstalledPackageNames.isEmpty());
    491     }
    492 
    493     public void testCreateAndManageUser_LeaveAllSystemApps() throws Exception {
    494         runCrossUserVerification(
    495                 DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED, "assertAllSystemAppsInstalled");
    496         PrimaryUserService.assertCrossUserCallArrived();
    497     }
    498 
    499     private UserHandle runCrossUserVerification(int createAndManageUserFlags, String methodName)
    500             throws Exception {
    501         String testUserName = "TestUser_" + System.currentTimeMillis();
    502 
    503         // Set affiliation id to allow communication.
    504         mDevicePolicyManager.setAffiliationIds(getWho(), Collections.singleton(AFFILIATION_ID));
    505 
    506         // Pack the affiliation id in a bundle so the secondary user can get it.
    507         PersistableBundle bundle = new PersistableBundle();
    508         bundle.putString(EXTRA_AFFILIATION_ID, AFFILIATION_ID);
    509         bundle.putString(EXTRA_METHOD_NAME, methodName);
    510 
    511         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(
    512                 getWho(),
    513                 testUserName,
    514                 SecondaryUserAdminReceiver.getComponentName(getContext()),
    515                 bundle,
    516                 createAndManageUserFlags);
    517         Log.d(TAG, "User create: " + userHandle);
    518         assertEquals(UserManager.USER_OPERATION_SUCCESS,
    519                 mDevicePolicyManager.startUserInBackground(getWho(), userHandle));
    520 
    521         return userHandle;
    522     }
    523 
    524     public void testCreateAndManageUser_SkipSetupWizard() {
    525         createAndManageUserTest(DevicePolicyManager.SKIP_SETUP_WIZARD);
    526     }
    527 
    528     public void testCreateAndManageUser_DontSkipSetupWizard() {
    529         if (!mActivityManager.isRunningInTestHarness()) {
    530             // In test harness, the setup wizard will be disabled by default, so this test is always
    531             // failing.
    532             createAndManageUserTest(0);
    533         }
    534     }
    535 
    536     // createAndManageUser should circumvent the DISALLOW_ADD_USER restriction
    537     public void testCreateAndManageUser_AddRestrictionSet() {
    538         mDevicePolicyManager.addUserRestriction(getWho(), UserManager.DISALLOW_ADD_USER);
    539 
    540         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(getWho(), "Test User",
    541                 getWho(), null, 0);
    542         assertNotNull(userHandle);
    543     }
    544 
    545     public void testCreateAndManageUser_RemoveRestrictionSet() {
    546         mDevicePolicyManager.addUserRestriction(getWho(), UserManager.DISALLOW_REMOVE_USER);
    547 
    548         UserHandle userHandle = mDevicePolicyManager.createAndManageUser(getWho(), "Test User",
    549                 getWho(), null, 0);
    550         assertNotNull(userHandle);
    551 
    552         boolean removed = mDevicePolicyManager.removeUser(getWho(), userHandle);
    553         // When the device owner itself has set the user restriction, it should still be allowed
    554         // to remove a user.
    555         assertTrue(removed);
    556     }
    557 
    558     public void testUserAddedOrRemovedBroadcasts() throws InterruptedException {
    559         LocalBroadcastReceiver receiver = new LocalBroadcastReceiver();
    560         LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(
    561                 getContext());
    562         localBroadcastManager.registerReceiver(receiver,
    563                 new IntentFilter(BasicAdminReceiver.ACTION_USER_ADDED));
    564         UserHandle userHandle;
    565         try {
    566             userHandle = mDevicePolicyManager.createAndManageUser(getWho(), "Test User", getWho(),
    567                     null, 0);
    568             assertNotNull(userHandle);
    569             assertEquals(userHandle, receiver.waitForBroadcastReceived());
    570         } finally {
    571             localBroadcastManager.unregisterReceiver(receiver);
    572         }
    573         localBroadcastManager.registerReceiver(receiver,
    574                 new IntentFilter(BasicAdminReceiver.ACTION_USER_REMOVED));
    575         try {
    576             assertTrue(mDevicePolicyManager.removeUser(getWho(), userHandle));
    577             assertEquals(userHandle, receiver.waitForBroadcastReceived());
    578         } finally {
    579             localBroadcastManager.unregisterReceiver(receiver);
    580         }
    581     }
    582 
    583     static class LocalBroadcastReceiver extends BroadcastReceiver {
    584         private LinkedBlockingQueue<UserHandle> mQueue = new LinkedBlockingQueue<UserHandle>(1);
    585 
    586         @Override
    587         public void onReceive(Context context, Intent intent) {
    588             UserHandle userHandle = intent.getParcelableExtra(BasicAdminReceiver.EXTRA_USER_HANDLE);
    589             Log.d(TAG, "broadcast receiver received " + intent + " with userHandle "
    590                     + userHandle);
    591             mQueue.offer(userHandle);
    592 
    593         }
    594 
    595         public UserHandle waitForBroadcastReceived() throws InterruptedException {
    596             return mQueue.poll(BROADCAST_TIMEOUT, TimeUnit.MILLISECONDS);
    597         }
    598     }
    599 
    600     public static final class PrimaryUserService extends Service {
    601         private static final Semaphore sSemaphore = new Semaphore(0);
    602         private static String sError = null;
    603 
    604         private final ICrossUserService.Stub mBinder = new ICrossUserService.Stub() {
    605             public void onEnabledCalled(String error) {
    606                 Log.d(TAG, "onEnabledCalled on primary user");
    607                 sError = error;
    608                 sSemaphore.release();
    609             }
    610         };
    611 
    612         @Override
    613         public IBinder onBind(Intent intent) {
    614             return mBinder;
    615         }
    616 
    617         static void assertCrossUserCallArrived() throws Exception {
    618             assertTrue(sSemaphore.tryAcquire(ON_ENABLED_TIMEOUT_SECONDS, TimeUnit.SECONDS));
    619             if (sError != null) {
    620                 throw new Exception(sError);
    621             }
    622         }
    623     }
    624 
    625     public static final class SecondaryUserAdminReceiver extends DeviceAdminReceiver {
    626         @Override
    627         public void onEnabled(Context context, Intent intent) {
    628             Log.d(TAG, "onEnabled called");
    629             DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
    630             ComponentName who = getComponentName(context);
    631 
    632             // Set affiliation ids
    633             dpm.setAffiliationIds(
    634                     who, Collections.singleton(intent.getStringExtra(EXTRA_AFFILIATION_ID)));
    635 
    636             String error = null;
    637             try {
    638                 Method method = CreateAndManageUserTest.class.getDeclaredMethod(
    639                         intent.getStringExtra(EXTRA_METHOD_NAME), Context.class,
    640                         DevicePolicyManager.class, ComponentName.class);
    641                 method.setAccessible(true);
    642                 method.invoke(null, context, dpm, who);
    643             } catch (NoSuchMethodException | IllegalAccessException e) {
    644                 error = e.toString();
    645             } catch (InvocationTargetException e) {
    646                 error = e.getCause().toString();
    647             }
    648 
    649             // Call all affiliated users
    650             final List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(who);
    651             assertEquals(1, targetUsers.size());
    652             pingTargetUser(context, dpm, targetUsers.get(0), error);
    653         }
    654 
    655         private void pingTargetUser(Context context, DevicePolicyManager dpm, UserHandle target,
    656                 String error) {
    657             Log.d(TAG, "Pinging target: " + target);
    658             final ServiceConnection serviceConnection = new ServiceConnection() {
    659                 @Override
    660                 public void onServiceConnected(ComponentName name, IBinder service) {
    661                     Log.d(TAG, "onServiceConnected is called in " + Thread.currentThread().getName());
    662                     ICrossUserService crossUserService = ICrossUserService
    663                             .Stub.asInterface(service);
    664                     try {
    665                         crossUserService.onEnabledCalled(error);
    666                     } catch (RemoteException re) {
    667                         Log.e(TAG, "Error when calling primary user", re);
    668                         // Do nothing, primary user will time out
    669                     }
    670                 }
    671 
    672                 @Override
    673                 public void onServiceDisconnected(ComponentName name) {
    674                     Log.d(TAG, "onServiceDisconnected is called");
    675                 }
    676             };
    677             final Intent serviceIntent = new Intent(context, PrimaryUserService.class);
    678             assertTrue(dpm.bindDeviceAdminServiceAsUser(
    679                     getComponentName(context),
    680                     serviceIntent,
    681                     serviceConnection,
    682                     Context.BIND_AUTO_CREATE,
    683                     target));
    684         }
    685 
    686         public static ComponentName getComponentName(Context context) {
    687             return new ComponentName(context, SecondaryUserAdminReceiver.class);
    688         }
    689     }
    690 }
    691