summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tony Mak <tonymak@google.com> 2016-11-28 17:54:51 +0000
committer Tony Mak <tonymak@google.com> 2016-11-28 17:54:51 +0000
commit2f26b79eea905f88c872804be01431020e4efb2e (patch)
treeec934a22bab0c1c5f2d8f7140efda0d8a8bfd28f
parentd0835e45f7663cb6abef383b9d903429c824cd20 (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
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java3
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java77
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java39
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java8
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;