Fix issue with copying stage file on secondary user
On stageFile(), the file fails to copy into /storage/emulated/10
directory. Using FileUtils.copy rather than dd shell command fixes this
issue when running the test on secondary user.
Bug: 134967238
Test: make and atest CtsProviderUiTestCases
Change-Id: I996eeacb1b8b5d387d59c443394da9001b23309f
diff --git a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
index 7746c98..fc7ed48 100644
--- a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
+++ b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
@@ -53,6 +53,7 @@
import android.os.SystemClock;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
+import android.os.UserManager;
import android.provider.MediaStore;
import android.providerui.cts.GetResultActivity.Result;
import android.support.test.uiautomator.By;
@@ -483,10 +484,12 @@
static File stageFile(int resId, File file) throws IOException {
// The caller may be trying to stage into a location only available to
// the shell user, so we need to perform the entire copy as the shell
- if (FileUtils.contains(Environment.getStorageDirectory(), file)) {
+ final Context context = InstrumentationRegistry.getTargetContext();
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager.isSystemUser() &&
+ FileUtils.contains(Environment.getStorageDirectory(), file)) {
executeShellCommand("mkdir -p " + file.getParent());
- final Context context = InstrumentationRegistry.getTargetContext();
try (AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId)) {
final File source = ParcelFileDescriptor.getFile(afd.getFileDescriptor());
final long skip = afd.getStartOffset();
@@ -504,7 +507,6 @@
if (!dir.exists()) {
throw new FileNotFoundException("Failed to create parent for " + file);
}
- final Context context = InstrumentationRegistry.getTargetContext();
try (InputStream source = context.getResources().openRawResource(resId);
OutputStream target = new FileOutputStream(file)) {
FileUtils.copy(source, target);
diff --git a/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java b/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
index 38ed09b..8e29a9a 100644
--- a/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
+++ b/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
@@ -29,6 +29,7 @@
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.MediaStore;
import android.provider.MediaStore.MediaColumns;
import android.provider.cts.MediaStoreUtils.PendingParams;
@@ -195,10 +196,11 @@
static File stageFile(int resId, File file) throws IOException {
// The caller may be trying to stage into a location only available to
// the shell user, so we need to perform the entire copy as the shell
- if (FileUtils.contains(Environment.getStorageDirectory(), file)) {
+ final Context context = InstrumentationRegistry.getTargetContext();
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager.isSystemUser() &&
+ FileUtils.contains(Environment.getStorageDirectory(), file)) {
executeShellCommand("mkdir -p " + file.getParent());
-
- final Context context = InstrumentationRegistry.getTargetContext();
try (AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId)) {
final File source = ParcelFileDescriptor.getFile(afd.getFileDescriptor());
final long skip = afd.getStartOffset();
@@ -216,7 +218,6 @@
if (!dir.exists()) {
throw new FileNotFoundException("Failed to create parent for " + file);
}
- final Context context = InstrumentationRegistry.getTargetContext();
try (InputStream source = context.getResources().openRawResource(resId);
OutputStream target = new FileOutputStream(file)) {
FileUtils.copy(source, target);