Refactor and improve LegacyFileAccessTest

Make LegacyFileAccessTest use utilities from TestUtils to reference
default directories.
Don't use File variable to reference more than one file in a case.
Ensure default top-level directories are created before running the
test.

Test: atest FuseDaemonHostTest:LegacyAccessHostTest
Test: un@Ignore ignored test case and make sure we get the same errors
Bug: 10873947

Change-Id: I25925f9bb05074249a2fde6561c0ef47eaf50eb8
diff --git a/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/LegacyAccessHostTest.java b/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/LegacyAccessHostTest.java
index 9ebdfe8..856b040 100644
--- a/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/LegacyAccessHostTest.java
+++ b/tests/jni/FuseDaemonTest/host/src/com/android/tests/fused/host/LegacyAccessHostTest.java
@@ -37,6 +37,8 @@
 
     public static final String SHELL_FILE = "/sdcard/LegacyAccessHostTest_shell";
 
+    private boolean isExternalStorageSetup = false;
+
     private String executeShellCommand(String cmd) throws Exception {
         return getDevice().executeShellCommand(cmd);
     }
@@ -90,8 +92,16 @@
         }
     }
 
+    private void setupExternalStorage() throws Exception {
+        if (!isExternalStorageSetup) {
+            runDeviceTest("setupExternalStorage");
+            isExternalStorageSetup = true;
+        }
+    }
+
     @Before
     public void setup() throws Exception {
+        setupExternalStorage();
         // Granting WRITE automatically grants READ as well, so we grant them both explicitly by
         // default in order to avoid confusion. Test cases that don't want any of those permissions
         // have to revoke the unwanted permissions.
diff --git a/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java b/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
index b28f7fc..650eba7 100644
--- a/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
+++ b/tests/jni/FuseDaemonTest/legacy/src/com/android/tests/fused/legacy/LegacyFileAccessTest.java
@@ -18,6 +18,7 @@
 
 import static com.android.tests.fused.lib.TestUtils.BYTES_DATA1;
 import static com.android.tests.fused.lib.TestUtils.BYTES_DATA2;
+import static com.android.tests.fused.lib.TestUtils.EXTERNAL_STORAGE_DIR;
 import static com.android.tests.fused.lib.TestUtils.STR_DATA1;
 import static com.android.tests.fused.lib.TestUtils.STR_DATA2;
 import static com.android.tests.fused.lib.TestUtils.assertCanRenameFile;
@@ -32,6 +33,7 @@
 import static com.android.tests.fused.lib.TestUtils.installApp;
 import static com.android.tests.fused.lib.TestUtils.listAs;
 import static com.android.tests.fused.lib.TestUtils.pollForExternalStorageState;
+import static com.android.tests.fused.lib.TestUtils.setupDefaultDirectories;
 import static com.android.tests.fused.lib.TestUtils.uninstallApp;
 
 import static com.android.tests.fused.lib.TestUtils.pollForPermission;
@@ -49,7 +51,6 @@
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Environment;
 import android.provider.MediaStore;
 import android.system.ErrnoException;
 import android.system.Os;
@@ -61,6 +62,7 @@
 
 import com.android.cts.install.lib.TestApp;
 import com.android.tests.fused.lib.ReaddirTestHelper;
+import com.android.tests.fused.lib.TestUtils;
 
 import com.google.common.io.Files;
 
@@ -97,6 +99,15 @@
     private static final TestApp TEST_APP_A  = new TestApp("TestAppA",
             "com.android.tests.fused.testapp.A", 1, false, "TestAppA.apk");
 
+
+    /**
+     * This method needs to be called once before running the whole test.
+     */
+    @Test
+    public void setupExternalStorage() {
+        setupDefaultDirectories();
+    }
+
     @Before
     public void setUp() throws Exception {
         pollForExternalStorageState();
@@ -111,23 +122,19 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ false);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
         // Can create file under root dir
-        File file = new File(Environment.getExternalStorageDirectory(), "LegacyFileAccessTest.txt");
-        assertCanCreateFile(file);
+        assertCanCreateFile(new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest.txt"));
 
         // Can create music file under DCIM
-        file = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM + "/LegacyFileAccessTest.mp3");
-        assertCanCreateFile(file);
+        assertCanCreateFile(new File(TestUtils.DCIM_DIR, "LegacyFileAccessTest.mp3"));
 
         // Can create random file under external files dir
-        file = new File(InstrumentationRegistry.getContext().getExternalFilesDir(null),
-                "LegacyFileAccessTest");
-        assertCanCreateFile(file);
+        assertCanCreateFile(new File(
+                InstrumentationRegistry.getContext().getExternalFilesDir(null),
+                "LegacyFileAccessTest"));
 
         // However, even legacy apps can't create files under other app's directories
-        final File otherAppDir = new File(Environment.getExternalStorageDirectory(),
-                "Android/data/com.android.shell");
-        file = new File(otherAppDir, "LegacyFileAccessTest.txt");
+        final File otherAppDir = new File(TestUtils.ANDROID_DATA_DIR, "com.android.shell");
+        final File file = new File(otherAppDir, "LegacyFileAccessTest.txt");
 
         // otherAppDir was already created by the host test
         try {
@@ -146,12 +153,10 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ false);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
         // Can create a top-level direcotry
-        final File topLevelDir = new File(Environment.getExternalStorageDirectory(),
-                "LegacyFileAccessTest");
+        final File topLevelDir = new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest");
         assertCanCreateDir(topLevelDir);
 
-        final File otherAppDir = new File(Environment.getExternalStorageDirectory(),
-                "Android/data/com.android.shell");
+        final File otherAppDir = new File(TestUtils.ANDROID_DATA_DIR, "com.android.shell");
 
         // However, even legacy apps can't create dirs under other app's directories
         final File subDir = new File(otherAppDir, "LegacyFileAccessTest");
@@ -159,8 +164,7 @@
         assertThat(subDir.mkdir()).isFalse();
 
         // Try to list a directory and fail because it requires READ permission
-        assertThat(new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MUSIC).list()).isNull();
+        assertThat(TestUtils.MUSIC_DIR.list()).isNull();
     }
 
     /**
@@ -171,65 +175,62 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ false);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
         // Can't create file under root dir
-        File file = new File(Environment.getExternalStorageDirectory(),
-                "LegacyFileAccessTest.txt");
+        final File newTxtFile = new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest.txt");
         try {
-            file.createNewFile();
-            fail("File creation expected to fail: " + file);
+            newTxtFile.createNewFile();
+            fail("File creation expected to fail: " + newTxtFile);
         } catch (IOException expected) {
         }
 
         // Can't create music file under /MUSIC
-        file = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MUSIC + "/LegacyFileAccessTest.mp3");
+        final File newMusicFile = new File(TestUtils.MUSIC_DIR, "LegacyFileAccessTest.mp3");
         try {
-            file.createNewFile();
-            fail("File creation expected to fail: " + file);
+            newMusicFile.createNewFile();
+            fail("File creation expected to fail: " + newMusicFile);
         } catch (IOException expected) {
         }
 
         // Can't create a top-level direcotry
-        final File topLevelDir = new File(Environment.getExternalStorageDirectory(),
-                "LegacyFileAccessTest");
+        final File topLevelDir = new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest");
         assertThat(topLevelDir.mkdir()).isFalse();
 
         // Can't read existing file
-        file = new File(Environment.getExternalStorageDirectory(), "LegacyAccessHostTest_shell");
+        final File existingFile = new File(EXTERNAL_STORAGE_DIR, "LegacyAccessHostTest_shell");
         try {
-            Os.open(file.getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
-            fail("Opening file for read expected to fail: " + file);
+            Os.open(existingFile.getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
+            fail("Opening file for read expected to fail: " + existingFile);
         } catch (ErrnoException expected) {
         }
 
         // Can't delete file
-        assertThat(new File(Environment.getExternalStorageDirectory(),
-                "LegacyAccessHostTest_shell").delete()).isFalse();
+        assertThat(existingFile.delete()).isFalse();
 
         // try to list a directory and fail
-        assertThat(new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MUSIC).list()).isNull();
-        assertThat(Environment.getExternalStorageDirectory().list()).isNull();
+        assertThat(TestUtils.MUSIC_DIR.list()).isNull();
+        assertThat(EXTERNAL_STORAGE_DIR.list()).isNull();
 
         // However, even without permissions, we can access our own external dir
-        file = new File(InstrumentationRegistry.getContext().getExternalFilesDir(null),
+        final File fileInDataDir = new File(
+                InstrumentationRegistry.getContext().getExternalFilesDir(null),
                 "LegacyFileAccessTest");
         try {
-            assertThat(file.createNewFile()).isTrue();
-            assertThat(Arrays.asList(file.getParentFile().list()))
+            assertThat(fileInDataDir.createNewFile()).isTrue();
+            assertThat(Arrays.asList(fileInDataDir.getParentFile().list()))
                     .containsExactly("LegacyFileAccessTest");
         } finally {
-            file.delete();
+            fileInDataDir.delete();
         }
 
         // we can access our own external media directory without permissions.
-        file = new File(InstrumentationRegistry.getContext().getExternalMediaDirs()[0],
+        final File fileInMediaDir = new File(
+                InstrumentationRegistry.getContext().getExternalMediaDirs()[0],
                 "LegacyFileAccessTest");
         try {
-            assertThat(file.createNewFile()).isTrue();
-            assertThat(Arrays.asList(file.getParentFile().list()))
+            assertThat(fileInMediaDir.createNewFile()).isTrue();
+            assertThat(Arrays.asList(fileInMediaDir.getParentFile().list()))
                     .containsExactly("LegacyFileAccessTest");
         } finally {
-            file.delete();
+            fileInMediaDir.delete();
         }
     }
 
@@ -239,41 +240,44 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
         // can list directory content
-        assertThat(new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MUSIC).list()).isNotNull();
+        assertThat(TestUtils.MUSIC_DIR.list()).isNotNull();
+
+        // try to write a file and fail
+        final File existingFile = new File(EXTERNAL_STORAGE_DIR,
+                "LegacyAccessHostTest_shell");
 
         // can open file for read
         FileDescriptor fd = null;
         try {
-            fd = Os.open(new File(Environment.getExternalStorageDirectory(),
-                    "LegacyAccessHostTest_shell").getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
+            fd = Os.open(existingFile.getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
         } finally {
             if (fd != null) {
                 Os.close(fd);
             }
         }
 
-        // try to write a file and fail
-        File file = new File(Environment.getExternalStorageDirectory(),
-                "LegacyAccessHostTest_shell");
         try {
-            Os.open(file.getPath(), OsConstants.O_WRONLY, /*mode*/ 0);
-            fail("Opening file for write expected to fail: " + file);
+            fd = Os.open(existingFile.getPath(), OsConstants.O_WRONLY, /*mode*/ 0);
+            Os.close(fd);
+            fail("Opening file for write expected to fail: " + existingFile);
         } catch (ErrnoException expected) {
         }
 
         // try to create file and fail, because it requires WRITE
-        file = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MUSIC + "/LegacyFileAccessTest.mp3");
+        final File newFile = new File(TestUtils.MUSIC_DIR, "LegacyFileAccessTest.mp3");
         try {
-            file.createNewFile();
-            fail("Creating file expected to fail: " + file);
+            newFile.createNewFile();
+            fail("Creating file expected to fail: " + newFile);
         } catch (IOException expected) {
         }
 
         // try to mkdir and fail, because it requires WRITE
-        assertThat(new File(Environment.getExternalStorageDirectory(), "/LegacyFileAccessTest")
-                .mkdir()).isFalse();
+        final File newDir = new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest");
+        try {
+            assertThat(newDir.mkdir()).isFalse();
+        } finally {
+            newDir.delete();
+        }
     }
 
     /**
@@ -285,7 +289,7 @@
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
 
         // can list a non-media file created by other package.
-        assertThat(Arrays.asList(Environment.getExternalStorageDirectory().list()))
+        assertThat(Arrays.asList(EXTERNAL_STORAGE_DIR.list()))
                 .contains("LegacyAccessHostTest_shell");
     }
 
@@ -299,16 +303,12 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File musicFile1 = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM + "/LegacyFileAccessTest.mp3");
-        final File musicFile2 = new File(Environment.getExternalStorageDirectory(),
-                "/LegacyFileAccessTest.mp3");
-        final File musicFile3 = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_MOVIES + "/LegacyFileAccessTest.mp3");
-        final File nonMediaDir1 = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM + "/LegacyFileAccessTest");
-        final File nonMediaDir2 = new File(Environment.getExternalStorageDirectory(),
-                "LegacyFileAccessTest");
+        final File musicFile1 = new File(TestUtils.DCIM_DIR, "LegacyFileAccessTest.mp3");
+        final File musicFile2 = new File(EXTERNAL_STORAGE_DIR,
+                "LegacyFileAccessTest.mp3");
+        final File musicFile3 = new File(TestUtils.MOVIES_DIR, "LegacyFileAccessTest.mp3");
+        final File nonMediaDir1 = new File(TestUtils.DCIM_DIR, "LegacyFileAccessTest");
+        final File nonMediaDir2 = new File(EXTERNAL_STORAGE_DIR, "LegacyFileAccessTest");
         final File pdfFile1 = new File(nonMediaDir1, "LegacyFileAccessTest.pdf");
         final File pdfFile2 = new File(nonMediaDir2, "LegacyFileAccessTest.pdf");
         try {
@@ -345,10 +345,9 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
 
-        final File shellFile1 = new File(Environment.getExternalStorageDirectory(),
+        final File shellFile1 = new File(EXTERNAL_STORAGE_DIR,
                 "LegacyAccessHostTest_shell");
-        final File shellFile2 = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DOWNLOADS + "/LegacyFileAccessTest_shell");
+        final File shellFile2 = new File(TestUtils.DOWNLOAD_DIR, "LegacyFileAccessTest_shell");
         final File mediaFile1 = new File(InstrumentationRegistry.getContext().
                 getExternalMediaDirs()[0], "LegacyFileAccessTest1");
         final File mediaFile2 = new File(InstrumentationRegistry.getContext().
@@ -378,10 +377,9 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ false);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
 
-        final File shellFile1 = new File(Environment.getExternalStorageDirectory(),
+        final File shellFile1 = new File(EXTERNAL_STORAGE_DIR,
                 "LegacyAccessHostTest_shell");
-        final File shellFile2 = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DOWNLOADS + "/LegacyFileAccessTest_shell");
+        final File shellFile2 = new File(TestUtils.DOWNLOAD_DIR, "LegacyFileAccessTest_shell");
         final File mediaFile1 = new File(InstrumentationRegistry.getContext().
                 getExternalMediaDirs()[0], "LegacyFileAccessTest1");
         final File mediaFile2 = new File(InstrumentationRegistry.getContext().
@@ -412,10 +410,8 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File EXTERNAL_STORAGE_DIR = Environment.getExternalStorageDirectory();
         final File videoFile = new File(EXTERNAL_STORAGE_DIR, VIDEO_FILE_NAME);
-        final File otherAppPdfFile = new File(EXTERNAL_STORAGE_DIR,
-                Environment.DIRECTORY_DOWNLOADS + "/" + NONMEDIA_FILE_NAME);
+        final File otherAppPdfFile = new File(TestUtils.DOWNLOAD_DIR, NONMEDIA_FILE_NAME);
 
         try {
             assertThat(videoFile.createNewFile()).isTrue();
@@ -452,7 +448,6 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File EXTERNAL_STORAGE_DIR = Environment.getExternalStorageDirectory();
         final File videoFile = new File(EXTERNAL_STORAGE_DIR, VIDEO_FILE_NAME);
         try {
             assertThat(videoFile.createNewFile()).isTrue();
@@ -484,10 +479,8 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File directoryDCIM = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM);
-        final File videoFile = new File(directoryDCIM, VIDEO_FILE_NAME);
-        final File renamedVideoFile = new File(directoryDCIM, "Renamed_" + VIDEO_FILE_NAME);
+        final File videoFile = new File(TestUtils.DCIM_DIR, VIDEO_FILE_NAME);
+        final File renamedVideoFile = new File(TestUtils.DCIM_DIR, "Renamed_" + VIDEO_FILE_NAME);
         final ContentResolver cr = getContentResolver();
 
         try {
@@ -520,10 +513,8 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File directoryDCIM = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM);
-        final File imageFile = new File(directoryDCIM, IMAGE_FILE_NAME);
-        final File temporaryImageFile = new File(directoryDCIM, IMAGE_FILE_NAME + "_.tmp");
+        final File imageFile = new File(TestUtils.DCIM_DIR, IMAGE_FILE_NAME);
+        final File temporaryImageFile = new File(TestUtils.DCIM_DIR, IMAGE_FILE_NAME + "_.tmp");
         final ContentResolver cr = getContentResolver();
 
         try {
@@ -566,11 +557,9 @@
         pollForPermission(Manifest.permission.READ_EXTERNAL_STORAGE, /*granted*/ true);
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ true);
 
-        final File directoryDCIM = new File(Environment.getExternalStorageDirectory(),
-                Environment.DIRECTORY_DCIM);
-        final File directoryNoMedia = new File(directoryDCIM, ".directoryNoMedia");
+        final File directoryNoMedia = new File(TestUtils.DCIM_DIR, ".directoryNoMedia");
         final File imageInNoMediaDir = new File(directoryNoMedia, IMAGE_FILE_NAME);
-        final File renamedImageInDCIM = new File(directoryDCIM, IMAGE_FILE_NAME);
+        final File renamedImageInDCIM = new File(TestUtils.DCIM_DIR, IMAGE_FILE_NAME);
         final File noMediaFile = new File(directoryNoMedia, ".nomedia");
         final ContentResolver cr = getContentResolver();