Desugared library nio: fix some createDirectory

- createDirectory now raise the right exception
- Identify and document why Files#exists is confused
  with NOFOLLOW_LINKS (readAttributes)

Change-Id: I46dcf14beffc5452d287ff059f7a4468096f3901
diff --git a/src/library_desugar/java/desugar/sun/nio/fs/DesugarAndroidFileSystemProvider.java b/src/library_desugar/java/desugar/sun/nio/fs/DesugarAndroidFileSystemProvider.java
index 61af0ad..0f42b83 100644
--- a/src/library_desugar/java/desugar/sun/nio/fs/DesugarAndroidFileSystemProvider.java
+++ b/src/library_desugar/java/desugar/sun/nio/fs/DesugarAndroidFileSystemProvider.java
@@ -12,6 +12,7 @@
 import java.nio.file.CopyOption;
 import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
@@ -63,6 +64,14 @@
   }
 
   @Override
+  public void createDirectory(Path dir, FileAttribute<?>... attrs) throws IOException {
+    if (!Files.exists(dir.getParent())) {
+      throw new NoSuchFileException(dir.toString());
+    }
+    super.createDirectory(dir, attrs);
+  }
+
+  @Override
   public SeekableByteChannel newByteChannel(
       Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) throws IOException {
     if (path.toFile().isDirectory()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java
index 9df15b9..af5df8a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesCreateTest.java
@@ -9,6 +9,7 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
@@ -19,6 +20,7 @@
 import java.nio.file.Files;
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.attribute.FileAttribute;
 import java.nio.file.attribute.PosixFilePermission;
 import java.nio.file.attribute.PosixFilePermissions;
@@ -36,28 +38,32 @@
 
   private static final String EXPECTED_RESULT =
       StringUtils.lines(
-          "ind3f class java.nio.file.NoSuchFileException",
-          "ind4f class java.nio.file.NoSuchFileException",
-          "ind5f class java.nio.file.NoSuchFileException",
-          "ind6f class java.nio.file.NoSuchFileException",
+          "ind3f class java.nio.file.NoSuchFileException :: dir",
+          "ind4f class java.nio.file.NoSuchFileException :: dir",
+          "ind5f class java.nio.file.NoSuchFileException :: f.txt",
+          "ind6f class java.nio.file.NoSuchFileException :: f.txt",
           "true",
           "true",
-          "notExisting1class java.nio.file.NoSuchFileException",
+          "notExisting1 class java.nio.file.NoSuchFileException :: notExisting1.txt",
           "false",
-          "false");
+          "false",
+          "readAttributes class java.nio.file.NoSuchFileException :: f1.txt",
+          "readAttributes class java.nio.file.NoSuchFileException :: f1.txt");
   private static final String EXPECTED_RESULT_DESUGARING =
       StringUtils.lines(
-          "ind5f class java.io.FileNotFoundException",
-          "ind6f class java.io.FileNotFoundException",
+          "ind3f class java.nio.file.NoSuchFileException :: dir",
+          "ind4f class java.nio.file.NoSuchFileException :: dir",
+          "ind5f class java.io.FileNotFoundException :: f.txt: open failed: ENOENT (No such file or"
+              + " directory)",
+          "ind6f class java.io.FileNotFoundException :: f.txt: open failed: ENOENT (No such file or"
+              + " directory)",
           "true",
           "true",
-          "notExisting1class java.io.IOException",
+          "notExisting1 class java.io.IOException :: notExisting1.txt before deletion.",
           "false",
           "true",
-          "ind4f/dir",
-          "ind4f",
-          "ind3f/dir",
-          "ind3f");
+          "1970-01-01T00:00:00Z",
+          "1970-01-01T00:00:00Z");
   private static final String EXPECTED_FILES =
       StringUtils.lines(
           "ind2s/dir", "ind2s", "ind1s/dir", "ind1s", "f4.txt", "f3.txt", "dir2s", "dir1s");
@@ -94,7 +100,7 @@
     if (parameters.isCfRuntime()) {
       // Reference runtime, we use Jdk 11 since this is Jdk 11 desugared library, not that Jdk 8
       // behaves differently on this test.
-      Assume.assumeTrue(parameters.isCfRuntime(CfVm.JDK11));
+      Assume.assumeTrue(parameters.isCfRuntime(CfVm.JDK11) && !ToolHelper.isWindows());
       testForJvm()
           .addInnerClasses(getClass())
           .run(parameters.getRuntime(), TestClass.class)
@@ -126,6 +132,12 @@
 
   public static class TestClass {
 
+    private static void printError(Throwable t, String prefix) {
+      String[] split =
+          t.getMessage() == null ? new String[] {"no-message"} : t.getMessage().split("/");
+      System.out.println(prefix + " " + t.getClass() + " :: " + split[split.length - 1]);
+    }
+
     public static void main(String[] args) throws Throwable {
       Path root = Files.createTempDirectory("tmp_test");
       Files.createDirectories(root.resolve("ind1s/dir"));
@@ -133,24 +145,24 @@
       try {
         Files.createDirectory(root.resolve("ind3f/dir"));
       } catch (Throwable t) {
-        System.out.println("ind3f " + t.getClass());
+        printError(t, "ind3f");
       }
       try {
         Files.createDirectory(root.resolve("ind4f/dir"), getFileAttribute());
       } catch (Throwable t) {
-        System.out.println("ind4f " + t.getClass());
+        printError(t, "ind4f");
       }
       Files.createDirectory(root.resolve("dir1s"));
       Files.createDirectory(root.resolve("dir2s"), getFileAttribute());
       try {
         Files.createFile(root.resolve("ind5f/f.txt"));
       } catch (Throwable t) {
-        System.out.println("ind5f " + t.getClass());
+        printError(t, "ind5f");
       }
       try {
         Files.createFile(root.resolve("ind6f/f.txt"), getFileAttribute());
       } catch (Throwable t) {
-        System.out.println("ind6f " + t.getClass());
+        printError(t, "ind6f");
       }
       Files.createFile(root.resolve("f1.txt"));
       Files.createFile(root.resolve("f2.txt"), getFileAttribute());
@@ -162,13 +174,28 @@
       try {
         Files.delete(root.resolve("notExisting1.txt"));
       } catch (Throwable t) {
-        System.out.println("notExisting1" + t.getClass());
+        printError(t, "notExisting1");
       }
       Files.deleteIfExists(root.resolve("f2.txt"));
       Files.deleteIfExists(root.resolve("notExisting2.txt"));
 
       System.out.println(Files.exists(root.resolve("f1.txt")));
       System.out.println(Files.exists(root.resolve("f1.txt"), LinkOption.NOFOLLOW_LINKS));
+      try {
+        System.out.println(
+            Files.readAttributes(root.resolve("f1.txt"), BasicFileAttributes.class)
+                .lastAccessTime());
+      } catch (Throwable t) {
+        printError(t, "readAttributes");
+      }
+      try {
+        System.out.println(
+            Files.readAttributes(
+                    root.resolve("f1.txt"), BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS)
+                .lastAccessTime());
+      } catch (Throwable t) {
+        printError(t, "readAttributes");
+      }
 
       // Recreate for the final print.
       Files.createFile(root.resolve("f3.txt"));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesVisitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesVisitTest.java
index 65e54de..4d7cccc 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesVisitTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesVisitTest.java
@@ -84,7 +84,7 @@
     if (parameters.isCfRuntime() && !ToolHelper.isWindows()) {
       // Reference runtime, we use Jdk 11 since this is Jdk 11 desugared library, not that Jdk 8
       // behaves differently on this test.
-      Assume.assumeTrue(parameters.isCfRuntime(CfVm.JDK11));
+      Assume.assumeTrue(parameters.isCfRuntime(CfVm.JDK11) && !ToolHelper.isWindows());
       testForJvm()
           .addInnerClasses(getClass())
           .run(parameters.getRuntime(), TestClass.class)