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));
+ }
+ }
+}