Extend Managed Profile permissions tests

Add tests for DevicePolicyManager.setPermissionPolicy and add a test
app that actually verifies that the permission was granted successfully.

Bug: 22192363
Change-Id: Ia7c86f5b348eba49f87e73e934fbeafdcbf620ff
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index c189c12..2ba8227 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -87,6 +87,7 @@
     CtsManagedProfileApp \
     CtsMonkeyApp \
     CtsMonkeyApp2 \
+    CtsPermissionApp \
     CtsSimpleApp \
     CtsSimplePreMApp \
     CtsSomeAccessibilityServices \
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PermissionsTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PermissionsTest.java
index 1cc2ee2..a4cf39d 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PermissionsTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PermissionsTest.java
@@ -16,24 +16,48 @@
 package com.android.cts.managedprofile;
 
 import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.os.UserManager;
+import android.util.Log;
 
-import com.android.cts.managedprofile.BaseManagedProfileTest;
-
-import org.junit.Ignore;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Test Runtime Permissions APIs in DevicePolicyManager.
  */
 public class PermissionsTest extends BaseManagedProfileTest {
+    private static final String TAG = "PermissionsTest";
 
-    private static final String SIMPLE_APP_PACKAGE_NAME = "com.android.cts.launcherapps.simpleapp";
+    private static final String PERMISSION_APP_PACKAGE_NAME
+            = "com.android.cts.permission.permissionapp";
     private static final String SIMPLE_PRE_M_APP_PACKAGE_NAME =
             "com.android.cts.launcherapps.simplepremapp";
     private static final String PERMISSION_NAME = "android.permission.READ_CONTACTS";
 
+    private static final String PERMISSIONS_ACTIVITY_NAME
+            = PERMISSION_APP_PACKAGE_NAME + ".PermissionActivity";
+    private static final String ACTION_CHECK_HAS_PERMISSION
+            = "com.android.cts.permission.action.CHECK_HAS_PERMISSION";
+    private static final String ACTION_REQUEST_PERMISSION
+            = "com.android.cts.permission.action.REQUEST_PERMISSION";
+    private static final String ACTION_PERMISSION_RESULT
+            = "com.android.cts.permission.action.PERMISSION_RESULT";
+    private static final String EXTRA_PERMISSION
+            = "com.android.cts.permission.extra.PERMISSION";
+    private static final String EXTRA_GRANT_STATE
+            = "com.android.cts.permission.extra.GRANT_STATE";
+    private static final int PERMISSION_ERROR = -2;
+
+    private PermissionBroadcastReceiver mReceiver;
+    private PackageManager mPackageManager;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -42,86 +66,152 @@
         assertTrue(mDevicePolicyManager.isAdminActive(ADMIN_RECEIVER_COMPONENT));
         assertTrue(mDevicePolicyManager.isProfileOwnerApp(
                 ADMIN_RECEIVER_COMPONENT.getPackageName()));
+        mReceiver = new PermissionBroadcastReceiver();
+        mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PERMISSION_RESULT));
+        mPackageManager = mContext.getPackageManager();
     }
 
-    public void testPermissionGrantState() {
-        PackageManager pm = mContext.getPackageManager();
-        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
-        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME),
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_APP_PACKAGE_NAME),
-                PackageManager.PERMISSION_DENIED);
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
+        super.tearDown();
+    }
 
-        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
-        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME),
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+    public void testPermissionGrantState() throws Exception {
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertPermissionGrantState(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
         // Should stay denied
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_APP_PACKAGE_NAME),
-                PackageManager.PERMISSION_DENIED);
+        assertPermissionGrantState(PackageManager.PERMISSION_DENIED);
 
-        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
-        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME),
-                DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_APP_PACKAGE_NAME),
-                PackageManager.PERMISSION_GRANTED);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertPermissionGrantState(PackageManager.PERMISSION_GRANTED);
 
-        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
-        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_APP_PACKAGE_NAME, PERMISSION_NAME),
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
         // Should stay granted
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_APP_PACKAGE_NAME),
-                PackageManager.PERMISSION_GRANTED);
+        assertPermissionGrantState(PackageManager.PERMISSION_GRANTED);
 
-        mDevicePolicyManager.setPermissionPolicy(ADMIN_RECEIVER_COMPONENT,
-                DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
-        assertEquals(mDevicePolicyManager.getPermissionPolicy(ADMIN_RECEIVER_COMPONENT),
-                DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
-
-        mDevicePolicyManager.setPermissionPolicy(ADMIN_RECEIVER_COMPONENT,
-                DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
-        assertEquals(mDevicePolicyManager.getPermissionPolicy(ADMIN_RECEIVER_COMPONENT),
-                DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
-
-        mDevicePolicyManager.setPermissionPolicy(ADMIN_RECEIVER_COMPONENT,
-                DevicePolicyManager.PERMISSION_POLICY_PROMPT);
-        assertEquals(mDevicePolicyManager.getPermissionPolicy(ADMIN_RECEIVER_COMPONENT),
-                DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
     }
 
-    public void testPermissionGrantStatePreMApp() {
+    public void testPermissionPolicy() throws Exception {
+        // reset permission to denied and unlocked
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        // reset permission to denied and unlocked
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+    }
+
+    public void testPermissionMixedPolicies() throws Exception {
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_DENIED);
+
+        assertSetPermissionGrantState(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+
+        assertSetPermissionPolicy(DevicePolicyManager.PERMISSION_POLICY_PROMPT);
+        assertPermissionRequest(PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void testPermissionGrantStatePreMApp() throws Exception {
         // These tests are to make sure that pre-M apps are not granted runtime permissions
         // by a profile owner
-        PackageManager pm = mContext.getPackageManager();
+        assertSetPermissionGrantStatePreMApp(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
+        assertSetPermissionGrantStatePreMApp(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+    }
+
+    private void assertPermissionRequest(int expected) throws Exception {
+        Intent launchIntent = new Intent();
+        launchIntent.setComponent(new ComponentName(PERMISSION_APP_PACKAGE_NAME,
+                PERMISSIONS_ACTIVITY_NAME));
+        launchIntent.putExtra(EXTRA_PERMISSION, PERMISSION_NAME);
+        launchIntent.setAction(ACTION_REQUEST_PERMISSION);
+        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(launchIntent);
+        assertEquals(expected, mReceiver.waitForBroadcast());
+        assertEquals(expected, mPackageManager.checkPermission(PERMISSION_NAME,
+                PERMISSION_APP_PACKAGE_NAME));
+    }
+
+    private void assertPermissionGrantState(int expected) throws Exception {
+        assertEquals(expected, mPackageManager.checkPermission(PERMISSION_NAME,
+                PERMISSION_APP_PACKAGE_NAME));
+        Intent launchIntent = new Intent();
+        launchIntent.setComponent(new ComponentName(PERMISSION_APP_PACKAGE_NAME,
+                PERMISSIONS_ACTIVITY_NAME));
+        launchIntent.putExtra(EXTRA_PERMISSION, PERMISSION_NAME);
+        launchIntent.setAction(ACTION_CHECK_HAS_PERMISSION);
+        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(launchIntent);
+        assertEquals(expected, mReceiver.waitForBroadcast());
+    }
+
+    private void assertSetPermissionPolicy(int value) throws Exception {
+        mDevicePolicyManager.setPermissionPolicy(ADMIN_RECEIVER_COMPONENT,
+                value);
+        assertEquals(mDevicePolicyManager.getPermissionPolicy(ADMIN_RECEIVER_COMPONENT),
+                value);
+    }
+
+    private void assertSetPermissionGrantState(int value) throws Exception {
+        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME,
+                value);
+        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
+                PERMISSION_APP_PACKAGE_NAME, PERMISSION_NAME),
+                value);
+    }
+
+    private void assertSetPermissionGrantStatePreMApp(int value) throws Exception {
         assertFalse(mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
                 SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED));
+                value));
         assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
                 SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME),
                 DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
         // Install time permissions should always be granted
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_PRE_M_APP_PACKAGE_NAME),
+        assertEquals(mPackageManager.checkPermission(PERMISSION_NAME,
+                SIMPLE_PRE_M_APP_PACKAGE_NAME),
                 PackageManager.PERMISSION_GRANTED);
+    }
 
-        mDevicePolicyManager.setPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME,
-                DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
-        assertEquals(mDevicePolicyManager.getPermissionGrantState(ADMIN_RECEIVER_COMPONENT,
-                SIMPLE_PRE_M_APP_PACKAGE_NAME, PERMISSION_NAME),
-                DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
-        // Install time permissions should always be granted
-        assertEquals(pm.checkPermission(PERMISSION_NAME, SIMPLE_PRE_M_APP_PACKAGE_NAME),
-                PackageManager.PERMISSION_GRANTED);
+    private class PermissionBroadcastReceiver extends BroadcastReceiver {
+        private BlockingQueue<Integer> mQueue = new ArrayBlockingQueue<Integer> (1);
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Integer result = new Integer(intent.getIntExtra(EXTRA_GRANT_STATE, PERMISSION_ERROR));
+            Log.d(TAG, "Grant state received " + result);
+            assertTrue(mQueue.add(result));
+        }
+
+        public int waitForBroadcast() throws Exception {
+            Integer result = mQueue.poll(30, TimeUnit.SECONDS);
+            mQueue.clear();
+            assertNotNull(result);
+            Log.d(TAG, "Grant state retrieved " + result.intValue());
+            return result.intValue();
+        }
     }
 }
diff --git a/hostsidetests/devicepolicy/app/PermissionApp/Android.mk b/hostsidetests/devicepolicy/app/PermissionApp/Android.mk
new file mode 100644
index 0000000..57950da
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/PermissionApp/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsPermissionApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/devicepolicy/app/PermissionApp/AndroidManifest.xml b/hostsidetests/devicepolicy/app/PermissionApp/AndroidManifest.xml
new file mode 100644
index 0000000..0a0df60
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/PermissionApp/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.permission.permissionapp">
+
+    <uses-sdk android:minSdkVersion="MNC"/>
+
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+
+    <application>
+        <activity android:name=".PermissionActivity" >
+            <intent-filter>
+                <action android:name="com.android.cts.permission.action.CHECK_HAS_PERMISSION" />
+                <action android:name="com.android.cts.permission.action.REQUEST_PERMISSION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/devicepolicy/app/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java b/hostsidetests/devicepolicy/app/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java
new file mode 100644
index 0000000..700aae1
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/PermissionApp/src/com/android/cts/permission/permissionapp/PermissionActivity.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.permission.permissionapp;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.lang.Override;
+
+/**
+ * A simple activity that requests permissions and returns the result.
+ */
+public class PermissionActivity extends Activity {
+    private static final String TAG = "PermissionActivity";
+
+    private static final String ACTION_CHECK_HAS_PERMISSION
+            = "com.android.cts.permission.action.CHECK_HAS_PERMISSION";
+    private static final String ACTION_REQUEST_PERMISSION
+            = "com.android.cts.permission.action.REQUEST_PERMISSION";
+    private static final String ACTION_PERMISSION_RESULT
+            = "com.android.cts.permission.action.PERMISSION_RESULT";
+    private static final String EXTRA_PERMISSION
+            = "com.android.cts.permission.extra.PERMISSION";
+    private static final String EXTRA_GRANT_STATE
+            = "com.android.cts.permission.extra.GRANT_STATE";
+    private static final int PERMISSION_ERROR = -2;
+    private static final int PERMISSIONS_REQUEST_CODE = 100;
+
+    private String mPermission;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        final Intent received = getIntent();
+        final String action = received.getAction();
+        mPermission = received.getStringExtra(EXTRA_PERMISSION);
+        if (ACTION_REQUEST_PERMISSION.equals(action)) {
+            requestPermissions(new String[] {mPermission}, PERMISSIONS_REQUEST_CODE);
+        } else if (ACTION_CHECK_HAS_PERMISSION.equals(action)) {
+            sendResultBroadcast(checkSelfPermission(mPermission));
+            finish();
+        } else {
+            Log.w(TAG, "Unknown intent received: " + received);
+            finish();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+            int[] grantResults) {
+        if (requestCode != PERMISSIONS_REQUEST_CODE ||
+                permissions.length != 1 ||
+                !permissions[0].equals(mPermission)) {
+            Log.d(TAG, "Received wrong permissions result");
+            sendResultBroadcast(PERMISSION_ERROR);
+        } else {
+            Log.d(TAG, "Received valid permission result: " + grantResults[0]);
+            sendResultBroadcast(grantResults[0]);
+        }
+        finish();
+    }
+
+    private void sendResultBroadcast(int result) {
+        Log.d(TAG, "Sending result broadcast: " + result);
+        Intent broadcast = new Intent(ACTION_PERMISSION_RESULT);
+        broadcast.putExtra(EXTRA_GRANT_STATE, result);
+        sendBroadcast(broadcast);
+    }
+}
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index 3f0805c..f53e41f 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -30,9 +30,12 @@
     private static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
     private static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
 
-    private static final String SIMPLE_APP_APK = "CtsSimpleApp.apk";
+    private static final String SIMPLE_PRE_M_APP_PKG = "com.android.cts.launcherapps.simplepremapp";
     private static final String SIMPLE_PRE_M_APP_APK = "CtsSimplePreMApp.apk";
 
+    private static final String PERMISSIONS_APP_PKG = "com.android.cts.permission.permissionapp";
+    private static final String PERMISSIONS_APP_APK = "CtsPermissionApp.apk";
+
     private static final String INTENT_SENDER_PKG = "com.android.cts.intent.sender";
     private static final String INTENT_SENDER_APK = "CtsIntentSenderApp.apk";
 
@@ -48,6 +51,7 @@
     private static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
     private static final String FEATURE_CAMERA = "android.hardware.camera";
     private int mUserId;
+    private String mPackageVerifier;
 
     @Override
     protected void setUp() throws Exception {
@@ -60,6 +64,12 @@
         if (mHasFeature) {
             removeTestUsers();
             mUserId = createManagedProfile();
+
+            // disable the package verifier to avoid the dialog when installing an app
+            mPackageVerifier = getDevice().executeShellCommand(
+                    "settings get global package_verifier_enable");
+            getDevice().executeShellCommand("settings put global package_verifier_enable 0");
+
             installApp(MANAGED_PROFILE_APK);
             setProfileOwner(MANAGED_PROFILE_PKG + "/" + ADMIN_RECEIVER_TEST_CLASS, mUserId);
             startUser(mUserId);
@@ -74,6 +84,9 @@
             getDevice().uninstallPackage(INTENT_SENDER_PKG);
             getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
             getDevice().uninstallPackage(CERT_INSTALLER_PKG);
+            // reset the package verifier setting to its original value
+            getDevice().executeShellCommand("settings put global package_verifier_enable "
+                    + mPackageVerifier);
         }
         super.tearDown();
     }
@@ -465,11 +478,29 @@
         if (!mHasFeature) {
             return;
         }
-        installAppAsUser(SIMPLE_APP_APK, mUserId);
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
         assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PermissionsTest",
                 "testPermissionGrantState", mUserId));
     }
 
+    public void testPermissionPolicy() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PermissionsTest",
+                "testPermissionPolicy", mUserId));
+    }
+
+    public void testPermissionMixedPolicies() throws Exception {
+        if (!mHasFeature) {
+            return;
+        }
+        installAppAsUser(PERMISSIONS_APP_APK, mUserId);
+        assertTrue(runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".PermissionsTest",
+                "testPermissionMixedPolicies", mUserId));
+    }
+
     public void testPermissionGrantPreMApp() throws Exception {
         if (!mHasFeature) {
             return;