Add core scoped storage host test.
Splitting this set of core test casess in a separate test rule in order to include it as
smoke test for MediaProvider (which has a time limit).
Bug: 161990628
Test: atest CtsScopedStorageCoreHostTest
Change-Id: I0bf0be68ab78079968d04d17a3aa7c4b3ecd04f3
diff --git a/hostsidetests/scopedstorage/Android.bp b/hostsidetests/scopedstorage/Android.bp
index 1a1a7f9..57e0005 100644
--- a/hostsidetests/scopedstorage/Android.bp
+++ b/hostsidetests/scopedstorage/Android.bp
@@ -72,6 +72,16 @@
}
java_test_host {
+ name: "CtsScopedStorageCoreHostTest",
+ srcs: [
+ "host/src/android/scopedstorage/cts/host/ScopedStorageCoreHostTest.java"
+ ],
+ libs: ["tradefed", "testng"],
+ test_suites: ["general-tests", "mts", "cts"],
+ test_config: "CoreTest.xml",
+}
+
+java_test_host {
name: "CtsScopedStorageHostTest",
srcs: ["host/src/**/*.java"],
libs: ["tradefed", "testng"],
diff --git a/hostsidetests/scopedstorage/CoreTest.xml b/hostsidetests/scopedstorage/CoreTest.xml
new file mode 100644
index 0000000..c251d10
--- /dev/null
+++ b/hostsidetests/scopedstorage/CoreTest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="External storage host test for legacy and scoped storage">
+ <option name="test-suite-tag" value="cts" />
+ <option name="config-descriptor:metadata" key="component" value="framework" />
+ <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+ <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+ <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="ScopedStorageTest.apk" />
+ <option name="test-file-name" value="LegacyStorageTest.apk" />
+ </target_preparer>
+ <test class="com.android.tradefed.testtype.HostTest" >
+ <option name="class" value="android.scopedstorage.cts.host.ScopedStorageCoreHostTest" />
+ </test>
+
+ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
+ <option name="mainline-module-package-name" value="com.google.android.mediaprovider" />
+ </object>
+</configuration>
diff --git a/hostsidetests/scopedstorage/PublicVolumeTest.xml b/hostsidetests/scopedstorage/PublicVolumeTest.xml
index 8bd3361..e70217f 100644
--- a/hostsidetests/scopedstorage/PublicVolumeTest.xml
+++ b/hostsidetests/scopedstorage/PublicVolumeTest.xml
@@ -22,6 +22,7 @@
</target_preparer>
<test class="com.android.tradefed.testtype.HostTest" >
<option name="class" value="android.scopedstorage.cts.host.PublicVolumeHostTest" />
+ <option name="class" value="android.scopedstorage.cts.host.PublicVolumeCoreHostTest" />
<option name="class" value="android.scopedstorage.cts.host.PublicVolumeLegacyHostTest" />
</test>
diff --git a/hostsidetests/scopedstorage/TEST_MAPPING b/hostsidetests/scopedstorage/TEST_MAPPING
index 3f87702..28ecb56 100644
--- a/hostsidetests/scopedstorage/TEST_MAPPING
+++ b/hostsidetests/scopedstorage/TEST_MAPPING
@@ -1,6 +1,9 @@
{
"presubmit": [
{
+ "name": "CtsScopedStorageCoreHostTest"
+ },
+ {
"name": "CtsScopedStorageHostTest"
},
{
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeCoreHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeCoreHostTest.java
new file mode 100644
index 0000000..e92217d
--- /dev/null
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeCoreHostTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 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 android.scopedstorage.cts.host;
+
+import static org.junit.Assert.assertTrue;
+
+import com.android.tradefed.device.ITestDevice;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+
+public class PublicVolumeCoreHostTest extends ScopedStorageCoreHostTest {
+ /* Used to clean up the virtual volume after the test */
+ private static ITestDevice sDevice = null;
+ private boolean mIsPublicVolumeSetup = false;
+ String executeShellCommand(String cmd) throws Exception {
+ return getDevice().executeShellCommand(cmd);
+ }
+
+ private void setupNewPublicVolume() throws Exception {
+ if (!mIsPublicVolumeSetup) {
+ assertTrue(runDeviceTests("android.scopedstorage.cts",
+ "android.scopedstorage.cts.PublicVolumeTestHelper", "setupNewPublicVolume"));
+ mIsPublicVolumeSetup = true;
+ }
+ }
+
+ private void setupDevice() {
+ if (sDevice == null) {
+ sDevice = getDevice();
+ }
+ }
+
+ /**
+ * Runs the given phase of PublicVolumeTest by calling into the device.
+ * Throws an exception if the test phase fails.
+ */
+ @Override
+ void runDeviceTest(String phase) throws Exception {
+ assertTrue(runDeviceTests("android.scopedstorage.cts",
+ "android.scopedstorage.cts.PublicVolumeTest", phase));
+ }
+
+ @Before
+ public void setup() throws Exception {
+ setupDevice();
+ setupNewPublicVolume();
+ super.setup();
+ }
+
+ @AfterClass
+ public static void deletePublicVolumes() throws Exception {
+ if (sDevice != null) {
+ sDevice.executeShellCommand("sm set-virtual-disk false");
+ }
+ }
+}
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageCoreHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageCoreHostTest.java
new file mode 100644
index 0000000..e693f2a
--- /dev/null
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageCoreHostTest.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2020 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 android.scopedstorage.cts.host;
+
+import static org.junit.Assert.assertTrue;
+
+import android.platform.test.annotations.AppModeFull;
+
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+import com.android.tradefed.testtype.junit4.DeviceTestRunOptions;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Runs the core ScopedStorageTest tests.
+ */
+@RunWith(DeviceJUnit4ClassRunner.class)
+@AppModeFull
+public class ScopedStorageCoreHostTest extends BaseHostJUnit4Test {
+ private boolean mIsExternalStorageSetup = false;
+
+ /**
+ * Runs the given phase of ScopedStorageTest by calling into the device.
+ * Throws an exception if the test phase fails.
+ */
+ void runDeviceTest(String phase) throws Exception {
+ assertTrue(runDeviceTests("android.scopedstorage.cts",
+ "android.scopedstorage.cts.ScopedStorageTest", phase));
+
+ }
+
+ String executeShellCommand(String cmd) throws Exception {
+ return getDevice().executeShellCommand(cmd);
+ }
+
+ private void setupExternalStorage() throws Exception {
+ if (!mIsExternalStorageSetup) {
+ runDeviceTest("setupExternalStorage");
+ mIsExternalStorageSetup = true;
+ }
+ }
+
+ @Before
+ public void setup() throws Exception {
+ setupExternalStorage();
+ executeShellCommand("mkdir /sdcard/Android/data/com.android.shell -m 2770");
+ executeShellCommand("mkdir /sdcard/Android/data/com.android.shell/files -m 2770");
+ }
+
+ @Before
+ public void revokeStoragePermissions() throws Exception {
+ revokePermissions("android.permission.WRITE_EXTERNAL_STORAGE",
+ "android.permission.READ_EXTERNAL_STORAGE");
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ executeShellCommand("rm -r /sdcard/Android/data/com.android.shell");
+ }
+
+ @Test
+ public void testTypePathConformity() throws Exception {
+ runDeviceTest("testTypePathConformity");
+ }
+
+ @Test
+ public void testCreateFileInAppExternalDir() throws Exception {
+ runDeviceTest("testCreateFileInAppExternalDir");
+ }
+
+ @Test
+ public void testCreateFileInOtherAppExternalDir() throws Exception {
+ runDeviceTest("testCreateFileInOtherAppExternalDir");
+ }
+
+ @Test
+ public void testContributeMediaFile() throws Exception {
+ runDeviceTest("testContributeMediaFile");
+ }
+
+ @Test
+ public void testCreateAndDeleteEmptyDir() throws Exception {
+ runDeviceTest("testCreateAndDeleteEmptyDir");
+ }
+
+ @Test
+ public void testOpendirRestrictions() throws Exception {
+ runDeviceTest("testOpendirRestrictions");
+ }
+
+ @Test
+ public void testLowLevelFileIO() throws Exception {
+ runDeviceTest("testLowLevelFileIO");
+ }
+
+ @Test
+ public void testListDirectoriesWithMediaFiles() throws Exception {
+ runDeviceTest("testListDirectoriesWithMediaFiles");
+ }
+
+ @Test
+ public void testListFilesFromExternalMediaDirectory() throws Exception {
+ runDeviceTest("testListFilesFromExternalMediaDirectory");
+ }
+
+ @Test
+ public void testMetaDataRedaction() throws Exception {
+ runDeviceTest("testMetaDataRedaction");
+ }
+
+ @Test
+ public void testVfsCacheConsistency() throws Exception {
+ runDeviceTest("testOpenFilePathFirstWriteContentResolver");
+ runDeviceTest("testOpenContentResolverFirstWriteContentResolver");
+ runDeviceTest("testOpenFilePathFirstWriteFilePath");
+ runDeviceTest("testOpenContentResolverFirstWriteFilePath");
+ runDeviceTest("testOpenContentResolverWriteOnly");
+ runDeviceTest("testOpenContentResolverDup");
+ runDeviceTest("testContentResolverDelete");
+ runDeviceTest("testContentResolverUpdate");
+ runDeviceTest("testOpenContentResolverClose");
+ }
+
+ @Test
+ public void testCaseInsensitivity() throws Exception {
+ runDeviceTest("testCreateLowerCaseDeleteUpperCase");
+ runDeviceTest("testCreateUpperCaseDeleteLowerCase");
+ runDeviceTest("testCreateMixedCaseDeleteDifferentMixedCase");
+ runDeviceTest("testAndroidDataObbDoesNotForgetMount");
+ runDeviceTest("testCacheConsistencyForCaseInsensitivity");
+ }
+
+ @Test
+ public void testRenameAndReplaceFile() throws Exception {
+ runDeviceTest("testRenameAndReplaceFile");
+ }
+
+ @Test
+ public void testRenameDirectory() throws Exception {
+ runDeviceTest("testRenameDirectory");
+ }
+
+ @Test
+ public void testSystemGalleryAppHasFullAccessToImages() throws Exception {
+ runDeviceTest("testSystemGalleryAppHasFullAccessToImages");
+ }
+
+ @Test
+ public void testSystemGalleryAppHasNoFullAccessToAudio() throws Exception {
+ runDeviceTest("testSystemGalleryAppHasNoFullAccessToAudio");
+ }
+
+ @Test
+ public void testSystemGalleryCanRenameImageAndVideoDirs() throws Exception {
+ runDeviceTest("testSystemGalleryCanRenameImageAndVideoDirs");
+ }
+
+ @Test
+ public void testManageExternalStorageCanCreateFilesAnywhere() throws Exception {
+ allowAppOps("android:manage_external_storage");
+ try {
+ runDeviceTest("testManageExternalStorageCanCreateFilesAnywhere");
+ } finally {
+ denyAppOps("android:manage_external_storage");
+ }
+ }
+
+ @Test
+ public void testManageExternalStorageReaddir() throws Exception {
+ allowAppOps("android:manage_external_storage");
+ try {
+ runDeviceTest("testManageExternalStorageReaddir");
+ } finally {
+ denyAppOps("android:manage_external_storage");
+ }
+ }
+
+ @Test
+ public void testHiddenFiles() throws Exception {
+ runDeviceTest("testCanCreateHiddenFile");
+ runDeviceTest("testCanRenameHiddenFile");
+ runDeviceTest("testHiddenDirectory");
+ }
+
+ @Test
+ public void testCreateCanRestoreDeletedRowId() throws Exception {
+ runDeviceTest("testCreateCanRestoreDeletedRowId");
+ }
+
+ @Test
+ public void testRenameCanRestoreDeletedRowId() throws Exception {
+ runDeviceTest("testRenameCanRestoreDeletedRowId");
+ }
+
+ @Test
+ public void testQueryOtherAppsFiles() throws Exception {
+ runDeviceTest("testQueryOtherAppsFiles");
+ }
+
+ @Test
+ public void testAccess_file() throws Exception {
+ grantPermissions("android.permission.READ_EXTERNAL_STORAGE");
+ try {
+ runDeviceTest("testAccess_file");
+ } finally {
+ revokePermissions("android.permission.READ_EXTERNAL_STORAGE");
+ }
+ }
+
+ @Test
+ public void testAccess_directory() throws Exception {
+ grantPermissions("android.permission.READ_EXTERNAL_STORAGE",
+ "android.permission.WRITE_EXTERNAL_STORAGE");
+ try {
+ runDeviceTest("testAccess_directory");
+ } finally {
+ revokePermissions("android.permission.READ_EXTERNAL_STORAGE",
+ "android.permission.WRITE_EXTERNAL_STORAGE");
+ }
+ }
+
+ private void grantPermissions(String... perms) throws Exception {
+ for (String perm : perms) {
+ executeShellCommand("pm grant android.scopedstorage.cts " + perm);
+ }
+ }
+
+ private void revokePermissions(String... perms) throws Exception {
+ for (String perm : perms) {
+ executeShellCommand("pm revoke android.scopedstorage.cts " + perm);
+ }
+ }
+
+ private void allowAppOps(String... ops) throws Exception {
+ for (String op : ops) {
+ executeShellCommand("cmd appops set --uid android.scopedstorage.cts " + op + " allow");
+ }
+ }
+
+ private void denyAppOps(String... ops) throws Exception {
+ for (String op : ops) {
+ executeShellCommand("cmd appops set --uid android.scopedstorage.cts " + op + " deny");
+ }
+ }
+}
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
index da902a9..83a0e11 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
@@ -91,36 +91,11 @@
}
@Test
- public void testTypePathConformity() throws Exception {
- runDeviceTest("testTypePathConformity");
- }
-
- @Test
- public void testCreateFileInAppExternalDir() throws Exception {
- runDeviceTest("testCreateFileInAppExternalDir");
- }
-
- @Test
- public void testCreateFileInOtherAppExternalDir() throws Exception {
- runDeviceTest("testCreateFileInOtherAppExternalDir");
- }
-
- @Test
public void testReadWriteFilesInOtherAppExternalDir() throws Exception {
runDeviceTest("testReadWriteFilesInOtherAppExternalDir");
}
@Test
- public void testContributeMediaFile() throws Exception {
- runDeviceTest("testContributeMediaFile");
- }
-
- @Test
- public void testCreateAndDeleteEmptyDir() throws Exception {
- runDeviceTest("testCreateAndDeleteEmptyDir");
- }
-
- @Test
public void testCantDeleteOtherAppsContents() throws Exception {
runDeviceTest("testCantDeleteOtherAppsContents");
}
@@ -130,20 +105,6 @@
runDeviceTest("testDeleteAlreadyUnlinkedFile");
}
- @Test
- public void testOpendirRestrictions() throws Exception {
- runDeviceTest("testOpendirRestrictions");
- }
-
- @Test
- public void testLowLevelFileIO() throws Exception {
- runDeviceTest("testLowLevelFileIO");
- }
-
- @Test
- public void testListDirectoriesWithMediaFiles() throws Exception {
- runDeviceTest("testListDirectoriesWithMediaFiles");
- }
@Test
public void testListDirectoriesWithNonMediaFiles() throws Exception {
@@ -156,43 +117,11 @@
}
@Test
- public void testListFilesFromExternalMediaDirectory() throws Exception {
- runDeviceTest("testListFilesFromExternalMediaDirectory");
- }
-
- @Test
public void testListUnsupportedFileType() throws Exception {
runDeviceTest("testListUnsupportedFileType");
}
@Test
- public void testMetaDataRedaction() throws Exception {
- runDeviceTest("testMetaDataRedaction");
- }
-
- @Test
- public void testVfsCacheConsistency() throws Exception {
- runDeviceTest("testOpenFilePathFirstWriteContentResolver");
- runDeviceTest("testOpenContentResolverFirstWriteContentResolver");
- runDeviceTest("testOpenFilePathFirstWriteFilePath");
- runDeviceTest("testOpenContentResolverFirstWriteFilePath");
- runDeviceTest("testOpenContentResolverWriteOnly");
- runDeviceTest("testOpenContentResolverDup");
- runDeviceTest("testContentResolverDelete");
- runDeviceTest("testContentResolverUpdate");
- runDeviceTest("testOpenContentResolverClose");
- }
-
- @Test
- public void testCaseInsensitivity() throws Exception {
- runDeviceTest("testCreateLowerCaseDeleteUpperCase");
- runDeviceTest("testCreateUpperCaseDeleteLowerCase");
- runDeviceTest("testCreateMixedCaseDeleteDifferentMixedCase");
- runDeviceTest("testAndroidDataObbDoesNotForgetMount");
- runDeviceTest("testCacheConsistencyForCaseInsensitivity");
- }
-
- @Test
public void testCallingIdentityCacheInvalidation() throws Exception {
// General IO access
runDeviceTest("testReadStorageInvalidation");
@@ -220,21 +149,11 @@
}
@Test
- public void testRenameAndReplaceFile() throws Exception {
- runDeviceTest("testRenameAndReplaceFile");
- }
-
- @Test
public void testRenameFileNotOwned() throws Exception {
runDeviceTest("testRenameFileNotOwned");
}
@Test
- public void testRenameDirectory() throws Exception {
- runDeviceTest("testRenameDirectory");
- }
-
- @Test
public void testRenameDirectoryNotOwned() throws Exception {
runDeviceTest("testRenameDirectoryNotOwned");
}
@@ -245,31 +164,6 @@
}
@Test
- public void testSystemGalleryAppHasFullAccessToImages() throws Exception {
- runDeviceTest("testSystemGalleryAppHasFullAccessToImages");
- }
-
- @Test
- public void testSystemGalleryAppHasNoFullAccessToAudio() throws Exception {
- runDeviceTest("testSystemGalleryAppHasNoFullAccessToAudio");
- }
-
- @Test
- public void testSystemGalleryCanRenameImagesAndVideos() throws Exception {
- runDeviceTest("testSystemGalleryCanRenameImagesAndVideos");
- }
-
- @Test
- public void testManageExternalStorageCanCreateFilesAnywhere() throws Exception {
- allowAppOps("android:manage_external_storage");
- try {
- runDeviceTest("testManageExternalStorageCanCreateFilesAnywhere");
- } finally {
- denyAppOps("android:manage_external_storage");
- }
- }
-
- @Test
public void testManageExternalStorageCanDeleteOtherAppsContents() throws Exception {
allowAppOps("android:manage_external_storage");
try {
@@ -280,16 +174,6 @@
}
@Test
- public void testManageExternalStorageReaddir() throws Exception {
- allowAppOps("android:manage_external_storage");
- try {
- runDeviceTest("testManageExternalStorageReaddir");
- } finally {
- denyAppOps("android:manage_external_storage");
- }
- }
-
- @Test
public void testManageExternalStorageCanRenameOtherAppsContents() throws Exception {
allowAppOps("android:manage_external_storage");
try {
@@ -315,21 +199,6 @@
}
@Test
- public void testCanCreateHiddenFile() throws Exception {
- runDeviceTest("testCanCreateHiddenFile");
- }
-
- @Test
- public void testCanRenameHiddenFile() throws Exception {
- runDeviceTest("testCanRenameHiddenFile");
- }
-
- @Test
- public void testHiddenDirectory() throws Exception {
- runDeviceTest("testHiddenDirectory");
- }
-
- @Test
public void testCanWriteToDCIMCameraWithNomedia() throws Exception {
runDeviceTest("testCanWriteToDCIMCameraWithNomedia");
}
@@ -380,26 +249,6 @@
}
@Test
- public void testQueryOtherAppsFiles() throws Exception {
- runDeviceTest("testQueryOtherAppsFiles");
- }
-
- @Test
- public void testSystemGalleryCanRenameImageAndVideoDirs() throws Exception {
- runDeviceTest("testSystemGalleryCanRenameImageAndVideoDirs");
- }
-
- @Test
- public void testCreateCanRestoreDeletedRowId() throws Exception {
- runDeviceTest("testCreateCanRestoreDeletedRowId");
- }
-
- @Test
- public void testRenameCanRestoreDeletedRowId() throws Exception {
- runDeviceTest("testRenameCanRestoreDeletedRowId");
- }
-
- @Test
public void testCantCreateOrRenameFileWithInvalidName() throws Exception {
runDeviceTest("testCantCreateOrRenameFileWithInvalidName");
}
@@ -430,28 +279,6 @@
}
@Test
- public void testAccess_file() throws Exception {
- grantPermissions("android.permission.READ_EXTERNAL_STORAGE");
- try {
- runDeviceTest("testAccess_file");
- } finally {
- revokePermissions("android.permission.READ_EXTERNAL_STORAGE");
- }
- }
-
- @Test
- public void testAccess_directory() throws Exception {
- grantPermissions("android.permission.READ_EXTERNAL_STORAGE",
- "android.permission.WRITE_EXTERNAL_STORAGE");
- try {
- runDeviceTest("testAccess_directory");
- } finally {
- revokePermissions("android.permission.READ_EXTERNAL_STORAGE",
- "android.permission.WRITE_EXTERNAL_STORAGE");
- }
- }
-
- @Test
public void testAndroidMedia() throws Exception {
grantPermissions("android.permission.READ_EXTERNAL_STORAGE");
try {