CTS test for runtime permission grants

Add a test to verify that when an app has <uses-permission> declarations
for multiple permissions within the same conceptual group, and then a runtime
request is issued (and accepted) naming just one of those permissions, the
other manifest-requested permission within the same group is also granted.

Bug 23525514

Change-Id: I3927979751e0650595268ee8a0de86212f5574ca
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java
index 64bd419..20a92aa 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/PermissionsHostTest.java
@@ -106,6 +106,11 @@
         runDeviceTests(PKG, ".UsePermissionTest", "testRuntimeGroupGrantSpecificity");
     }
 
+    public void testRuntimeGroupGrantExpansion() throws Exception {
+        assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK), false, false));
+        runDeviceTests(PKG, ".UsePermissionTest", "testRuntimeGroupGrantExpansion");
+    }
+
     public void testCompatDefault() throws Exception {
         assertNull(getDevice().installPackage(mCtsBuild.getTestApp(APK_COMPAT), false, false));
         runDeviceTests(PKG, ".UsePermissionCompatTest", "testCompatDefault");
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml
index f741afc..ece4ebe 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/AndroidManifest.xml
@@ -31,4 +31,8 @@
     <!-- Deliberately request WRITE_CONTACTS but *not* READ_CONTACTS -->
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
 
+    <!-- Request two different permissions within the same group -->
+    <uses-permission android:name="android.permission.SEND_SMS" />
+    <uses-permission android:name="android.permission.RECEIVE_SMS" />
+
 </manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java
index 1e6fe1f..8d3b976 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionApp/src/com/android/cts/usepermission/UsePermissionTest.java
@@ -156,4 +156,41 @@
         mActivity.finish();
     }
 
+    public void testRuntimeGroupGrantExpansion() throws Exception {
+        // Start out without permission
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.RECEIVE_SMS));
+        assertEquals(PackageManager.PERMISSION_DENIED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.SEND_SMS));
+
+        // Go through normal grant flow
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(),
+                MyActivity.class, null);
+        mDevice.waitForIdle();
+
+        // request only one permission from the 'SMS' permission group at runtime,
+        // but two from this group are <uses-permission> in the manifest
+        mActivity.requestPermissions(new String[] {
+                android.Manifest.permission.RECEIVE_SMS }, 44);
+        mDevice.waitForIdle();
+
+        new UiObject(new UiSelector()
+                .resourceId("com.android.packageinstaller:id/permission_allow_button")).click();
+        mDevice.waitForIdle();
+
+        MyActivity.Result result = mActivity.getResult();
+        assertEquals(44, result.requestCode);
+        assertEquals(android.Manifest.permission.RECEIVE_SMS, result.permissions[0]);
+        assertEquals(PackageManager.PERMISSION_GRANTED, result.grantResults[0]);
+
+        // We should now have been granted both of the permissions from this group
+        // that are mentioned in our manifest
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.RECEIVE_SMS));
+        assertEquals(PackageManager.PERMISSION_GRANTED, getInstrumentation().getContext()
+                .checkSelfPermission(android.Manifest.permission.SEND_SMS));
+
+        mActivity.finish();
+    }
 }