diff options
| author | 2016-11-28 17:54:51 +0000 | |
|---|---|---|
| committer | 2016-11-28 17:54:51 +0000 | |
| commit | 2f26b79eea905f88c872804be01431020e4efb2e (patch) | |
| tree | ec934a22bab0c1c5f2d8f7140efda0d8a8bfd28f | |
| parent | d0835e45f7663cb6abef383b9d903429c824cd20 (diff) | |
Unit test for getBindDeviceAdminTargetUsers
Was meant to write test for bindDeviceAdminServiceAsUser, but
it can't be done without having tests for
getBindDeviceAdminTargetUsers first as bindDeviceAdminService depends
on getBindDeviceAdminTargetUsers.
A bit shocked by we didn't have any managed profile tests in
DevicePolicyManagerTest. Added managed profile support in the CL.
Bug: 32764274
Test: runtest -x frameworks/base/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
Change-Id: If412e4f44c3ae998f69e17411f2503a97f80149f
4 files changed, 106 insertions, 21 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index c32ee3a042d6..37aacb86841e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -9608,8 +9608,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final long callingIdentity = mInjector.binderClearCallingIdentity(); try { String callingOwnerPackage = callingOwner.info.getComponent().getPackageName(); - for (int userId : mUserManager.getProfileIds( - callingUserId, /* enabledOnly= */ false)) { + for (int userId : mUserManager.getProfileIdsWithDisabled(callingUserId)) { if (userId == callingUserId) { continue; } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index cff5b416f03b..3d7b853e5755 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -22,15 +22,20 @@ import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManagerInternal; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Color; import android.net.IIpConnectivityMetrics; +import android.content.pm.UserInfo; import android.net.wifi.WifiInfo; import android.os.Build.VERSION_CODES; import android.os.Bundle; +import android.os.IBinder; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -2447,6 +2452,60 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals(-1, dpm.getLastNetworkLogRetrievalTime()); } + public void testGetBindDeviceAdminTargetUsers() throws Exception { + // Setup device owner. + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + + // Only device owner is setup, the result list should be empty. + List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1); + MoreAsserts.assertEmpty(targetUsers); + + // Setup a managed profile managed by the same admin. + final int MANAGED_PROFILE_USER_ID = 15; + final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456); + addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1); + + // Add a secondary user, it should never talk with. + final int ANOTHER_USER_ID = 36; + mContext.addUser(ANOTHER_USER_ID, 0); + + // Calling from device owner admin, the result list should just contain the managed + // profile user id. + targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1); + MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.of(MANAGED_PROFILE_USER_ID)); + + // Calling from managed profile admin, the result list should just contain the system + // user id. + mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; + targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1); + MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.SYSTEM); + } + + public void testGetBindDeviceAdminTargetUsers_differentPackage() throws Exception { + // Setup a device owner. + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + + // Set up a managed profile managed by different package. + final int MANAGED_PROFILE_USER_ID = 15; + final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456); + final ComponentName adminDifferentPackage = + new ComponentName("another.package", "whatever.class"); + addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2); + + // Calling from device owner admin, we should get zero bind device admin target users as + // their packages are different. + List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1); + MoreAsserts.assertEmpty(targetUsers); + + // Calling from managed profile admin, we should still get zero target users for the same + // reason. + mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; + targetUsers = dpm.getBindDeviceAdminTargetUsers(adminDifferentPackage); + MoreAsserts.assertEmpty(targetUsers); + } + private void setUserSetupCompleteForUser(boolean isUserSetupComplete, int userhandle) { when(mContext.settings.settingsSecureGetIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0, userhandle)).thenReturn(isUserSetupComplete ? 1 : 0); @@ -2458,4 +2517,22 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertEquals("isProvisioningAllowed(" + action + ") returning unexpected result", expected, dpm.isProvisioningAllowed(action)); } + + /** + * Setup a managed profile with the specified admin and its uid. + * @param admin ComponentName that's visible to the test code, which doesn't have to exist. + * @param adminUid uid of the admin package. + * @param copyFromAdmin package information for {@code admin} will be built based on this + * component's information. + */ + private void addManagedProfile( + ComponentName admin, int adminUid, ComponentName copyFromAdmin) throws Exception { + final int userId = UserHandle.getUserId(adminUid); + mContext.addUser(userId, UserInfo.FLAG_MANAGED_PROFILE, UserHandle.USER_SYSTEM); + mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS); + setUpPackageManagerForFakeAdmin(admin, adminUid, copyFromAdmin); + dpm.setActiveAdmin(admin, false, userId); + assertTrue(dpm.setProfileOwner(admin, null, userId)); + mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS); + } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index d74c6dc21c63..1247b2d7005b 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -16,8 +16,6 @@ package com.android.server.devicepolicy; -import com.android.internal.widget.LockPatternUtils; - import android.app.IActivityManager; import android.app.NotificationManager; import android.app.backup.IBackupManager; @@ -47,6 +45,8 @@ import android.test.mock.MockContentResolver; import android.test.mock.MockContext; import android.view.IWindowManager; +import com.android.internal.widget.LockPatternUtils; + import org.junit.Assert; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -324,16 +324,21 @@ public class DpmMockContext extends MockContext { contentResolver = new MockContentResolver(); // Add the system user - systemUserDataDir = addUser(UserHandle.USER_SYSTEM, UserInfo.FLAG_PRIMARY); + systemUserDataDir = + addUser(UserHandle.USER_SYSTEM, UserInfo.FLAG_PRIMARY, UserHandle.USER_SYSTEM); // System user is always running. setUserRunning(UserHandle.USER_SYSTEM, true); } public File addUser(int userId, int flags) { + return addUser(userId, flags, UserInfo.NO_PROFILE_GROUP_ID); + } + public File addUser(int userId, int flags, int profileGroupId) { // Set up (default) UserInfo for CALLER_USER_HANDLE. final UserInfo uh = new UserInfo(userId, "user" + userId, flags); + uh.profileGroupId = profileGroupId; when(userManager.getUserInfo(eq(userId))).thenReturn(uh); mUserInfos.add(uh); @@ -345,12 +350,7 @@ public class DpmMockContext extends MockContext { @Override public UserInfo answer(InvocationOnMock invocation) throws Throwable { final int userId = (int) invocation.getArguments()[0]; - for (UserInfo ui : mUserInfos) { - if (ui.id == userId) { - return ui; - } - } - return null; + return getUserInfo(userId); } } ); @@ -369,16 +369,13 @@ public class DpmMockContext extends MockContext { public int[] answer(InvocationOnMock invocation) throws Throwable { final int userId = (int) invocation.getArguments()[0]; List<UserInfo> profiles = getProfiles(userId); - int[] results = new int[profiles.size()]; - for (int i = 0; i < results.length; i++) { - results[i] = profiles.get(i).id; - } - return results; + return profiles.stream() + .mapToInt(profile -> profile.id) + .toArray(); } } ); - // Create a data directory. final File dir = new File(dataDir, "user" + userId); DpmTestUtils.clearDir(dir); @@ -387,6 +384,15 @@ public class DpmMockContext extends MockContext { return dir; } + private UserInfo getUserInfo(int userId) { + for (UserInfo ui : mUserInfos) { + if (ui.id == userId) { + return ui; + } + } + return null; + } + private List<UserInfo> getProfiles(int userId) { final ArrayList<UserInfo> ret = new ArrayList<UserInfo>(); UserInfo parent = null; @@ -401,9 +407,6 @@ public class DpmMockContext extends MockContext { } ret.add(parent); for (UserInfo ui : mUserInfos) { - if (ui.id == userId) { - continue; - } if (ui.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID && ui.profileGroupId == parent.profileGroupId) { ret.add(ui); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java index b4b74b3ec10a..db27f7230db9 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java @@ -101,6 +101,13 @@ public abstract class DpmTestBase extends AndroidTestCase { admin); } + protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, + ComponentName copyFromAdmin) + throws Exception { + setUpPackageManagerForFakeAdmin(admin, packageUid, + /* enabledSetting =*/ null, /* appTargetSdk = */ null, copyFromAdmin); + } + /** * Set up a component in the mock package manager to be an active admin. * @@ -118,7 +125,6 @@ public abstract class DpmTestBase extends AndroidTestCase { mRealTestContext.getPackageManager().getApplicationInfo( copyFromAdmin.getPackageName(), PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS)); - ai.enabledSetting = enabledSetting == null ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED : enabledSetting; |