Test Files visit methods

- Fix Path#compareTo(Object)

Change-Id: Icf99ffb5a56d9fea111971991dd86e6017190d91
diff --git a/src/library_desugar/java/java/nio/file/PathApiFlips.java b/src/library_desugar/java/java/nio/file/PathApiFlips.java
index 7314b7f..8747fae 100644
--- a/src/library_desugar/java/java/nio/file/PathApiFlips.java
+++ b/src/library_desugar/java/java/nio/file/PathApiFlips.java
@@ -104,11 +104,6 @@
     public void remove() {
       iterator.remove();
     }
-
-    @Override
-    public void forEachRemaining(Consumer<? super T> action) {
-      iterator.forEachRemaining(path -> action.accept(convertPath(path)));
-    }
   }
 
   public static class DirectoryStreamPathWrapper<T> implements DirectoryStream<T> {
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index dff0eac..52c5568 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -233,6 +233,7 @@
         "java.util.Map java.nio.file.spi.FileSystemProvider#readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption[])" : [-1, "java.util.Map java.nio.file.FileApiFlips#flipMapWithMaybeFileTimeValues(java.util.Map)"],
         "java.lang.Iterable java.nio.file.FileSystem#getRootDirectories()": [-1, "java.lang.Iterable java.nio.file.PathApiFlips#flipIterablePath(java.lang.Iterable)"],
         "java.util.Iterator java.nio.file.Path#iterator()": [-1, "java.util.Iterator java.nio.file.PathApiFlips#flipIteratorPath(java.util.Iterator)"],
+        "int java.nio.file.Path#compareTo(java.lang.Object)": [0, "java.lang.Object java.nio.file.PathApiFlips#convertPath(java.lang.Object)"],
         "java.nio.file.DirectoryStream java.nio.file.spi.FileSystemProvider#newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream$Filter)": [-1, "java.nio.file.DirectoryStream java.nio.file.PathApiFlips#flipDirectoryStreamPath(java.nio.file.DirectoryStream)", 1, "java.nio.file.DirectoryStream$Filter java.nio.file.PathApiFlips#flipDirectoryStreamFilterPath(java.nio.file.DirectoryStream$Filter)"],
         "void java.nio.file.spi.FileSystemProvider#setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption[])": [2, "java.lang.Object java.nio.file.FileApiFlips#flipMaybeFileTime(java.lang.Object)"],
         "java.nio.channels.FileChannel java.nio.channels.FileChannel#open(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[])" : [1, "java.util.Set java.nio.file.FileApiFlips#flipOpenOptionSet(java.util.Set)"]
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 39d85b1..9df15b9 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
@@ -121,11 +121,7 @@
     return (libraryDesugaringSpecification.usesPlatformFileSystem(parameters)
             ? EXPECTED_RESULT
             : EXPECTED_RESULT_DESUGARING)
-        // We cannot print on such devices due to conversions errors.
-        + ((libraryDesugaringSpecification.usesPlatformFileSystem(parameters)
-                && libraryDesugaringSpecification.hasNioFileDesugaring(parameters))
-            ? ""
-            : EXPECTED_FILES);
+        + EXPECTED_FILES;
   }
 
   public static class TestClass {
@@ -178,22 +174,16 @@
       Files.createFile(root.resolve("f3.txt"));
       Files.createFile(root.resolve("f4.txt"), getFileAttribute());
 
-      // Clear the temp directory.
-      // We need to fix Files#walk on high Api levels.
-      try {
-        Files.walk(root)
-            .sorted(Comparator.reverseOrder())
-            .map(
-                f -> {
-                  if (f != root) {
-                    System.out.println(f.subpath(2, f.getNameCount()));
-                  }
-                  return f.toFile();
-                })
-            .forEach(File::delete);
-      } catch (Throwable t) {
-
-      }
+      Files.walk(root)
+          .sorted(Comparator.reverseOrder())
+          .map(
+              f -> {
+                if (f != root) {
+                  System.out.println(f.subpath(2, f.getNameCount()));
+                }
+                return f.toFile();
+              })
+          .forEach(File::delete);
     }
 
     public static FileAttribute<Set<PosixFilePermission>> getFileAttribute() {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
index 5222f94..63e4f02 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
@@ -69,6 +69,7 @@
           "tmp",
           "/",
           "true",
+          "tmpFile",
           "This",
           "is",
           "fun!",
@@ -236,7 +237,9 @@
       Iterable<Path> rootDirectories = tmpFile.getFileSystem().getRootDirectories();
       System.out.println(rootDirectories.iterator().next());
       DirectoryStream<Path> paths = Files.newDirectoryStream(tmpDict);
-      System.out.println(paths.iterator().hasNext());
+      Iterator<Path> theIterator = paths.iterator();
+      System.out.println(theIterator.hasNext());
+      System.out.println(theIterator.next().getFileName());
     }
 
     private static void fspMethodsWithGeneric(Path path) throws IOException {
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
new file mode 100644
index 0000000..65e54de
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesVisitTest.java
@@ -0,0 +1,169 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
+
+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;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class FilesVisitTest extends DesugaredLibraryTestBase {
+
+  private static final String EXPECTED_RESULT =
+      StringUtils.lines(
+          "Find f1",
+          "[f1.txt]",
+          "[f1.txt]",
+          "[f1.txt]",
+          "Find f4",
+          "[]",
+          "[f4.txt]",
+          "[f4.txt]",
+          "List",
+          "[f1.txt, f2.txt, f3.txt, innerDir]",
+          "Walk 1",
+          "[f1.txt, f2.txt, f3.txt, innerDir, root]",
+          "[f1.txt, f2.txt, f3.txt, innerDir, root]",
+          "Walk 7",
+          "[f1.txt, f2.txt, f3.txt, f4.txt, innerDir, root]",
+          "[f1.txt, f2.txt, f3.txt, f4.txt, innerDir, root]");
+
+  private final TestParameters parameters;
+  private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+  private final CompilationSpecification compilationSpecification;
+
+  @Parameters(name = "{0}, spec: {1}, {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        // Skip Android 4.4.4 due to missing libjavacrypto.
+        getTestParameters()
+            .withCfRuntime(CfVm.JDK11)
+            .withDexRuntime(Version.V4_0_4)
+            .withDexRuntimesStartingFromIncluding(Version.V5_1_1)
+            .withAllApiLevels()
+            .build(),
+        ImmutableList.of(JDK11_PATH),
+        DEFAULT_SPECIFICATIONS);
+  }
+
+  public FilesVisitTest(
+      TestParameters parameters,
+      LibraryDesugaringSpecification libraryDesugaringSpecification,
+      CompilationSpecification compilationSpecification) {
+    this.parameters = parameters;
+    this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+    this.compilationSpecification = compilationSpecification;
+  }
+
+  @Test
+  public void test() throws Throwable {
+    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));
+      testForJvm()
+          .addInnerClasses(getClass())
+          .run(parameters.getRuntime(), TestClass.class)
+          .assertSuccessWithOutput(EXPECTED_RESULT);
+      return;
+    }
+    testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .compile()
+        .withArt6Plus64BitsLib()
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  public static class TestClass {
+
+    private static Path root;
+
+    public static void main(String[] args) throws IOException {
+      createDirStructure();
+      findTest();
+      listTest();
+      walkTest();
+    }
+
+    /** Creates the following structure root | f1 | f2 | f3 | innerDir | f4 */
+    private static void createDirStructure() throws IOException {
+      root = Files.createTempDirectory("rootTemp");
+      Files.createFile(root.resolve("f1.txt"));
+      Files.createFile(root.resolve("f2.txt"));
+      Files.createFile(root.resolve("f3.txt"));
+      Path innerDir = Files.createDirectory(root.resolve("innerDir"));
+      Files.createFile(root.resolve(innerDir.resolve("f4.txt")));
+    }
+
+    private static void meaningfulPrint(Stream<Path> paths) {
+      System.out.println(
+          paths
+              .map(f -> f == root ? Paths.get("root") : f)
+              .map(Path::getFileName)
+              .sorted()
+              .collect(Collectors.toList()));
+    }
+
+    private static void findTest() throws IOException {
+      System.out.println("Find f1");
+      meaningfulPrint(Files.find(root, 1, (p, a) -> p.getFileName().toString().contains("f1")));
+      meaningfulPrint(Files.find(root, 7, (p, a) -> p.getFileName().toString().contains("f1")));
+      meaningfulPrint(
+          Files.find(
+              root,
+              7,
+              (p, a) -> p.getFileName().toString().contains("f1"),
+              FileVisitOption.FOLLOW_LINKS));
+
+      System.out.println("Find f4");
+      meaningfulPrint(Files.find(root, 1, (p, a) -> p.getFileName().toString().contains("f4")));
+      meaningfulPrint(Files.find(root, 7, (p, a) -> p.getFileName().toString().contains("f4")));
+      meaningfulPrint(
+          Files.find(
+              root,
+              7,
+              (p, a) -> p.getFileName().toString().contains("f4"),
+              FileVisitOption.FOLLOW_LINKS));
+    }
+
+    private static void listTest() throws IOException {
+      System.out.println("List");
+      meaningfulPrint(Files.list(root));
+    }
+
+    private static void walkTest() throws IOException {
+      System.out.println("Walk 1");
+      meaningfulPrint(Files.walk(root, 1));
+      meaningfulPrint(Files.walk(root, 1, FileVisitOption.FOLLOW_LINKS));
+      System.out.println("Walk 7");
+      meaningfulPrint(Files.walk(root, 7));
+      meaningfulPrint(Files.walk(root, 7, FileVisitOption.FOLLOW_LINKS));
+    }
+  }
+}