From f10f3960e48708a8fc3816c24a3a56b98935beb9 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Wed, 16 Jul 2025 09:49:55 -0700 Subject: [PATCH 1/3] 8362429: AssertionError in File.listFiles(FileFilter | FilenameFilter) --- src/java.base/share/classes/java/io/File.java | 28 ++++++++++++++----- test/jdk/java/io/File/EmptyPath.java | 24 ++++++++++++++-- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/java.base/share/classes/java/io/File.java b/src/java.base/share/classes/java/io/File.java index 468d138657b90..a1fda8c27db18 100644 --- a/src/java.base/share/classes/java/io/File.java +++ b/src/java.base/share/classes/java/io/File.java @@ -1175,9 +1175,15 @@ public File[] listFiles(FilenameFilter filter) { String[] ss = normalizedList(); if (ss == null) return null; ArrayList files = new ArrayList<>(); - for (String s : ss) - if ((filter == null) || filter.accept(this, s)) - files.add(new File(s, this)); + if (path.isEmpty()) { + for (String s : ss) + if ((filter == null) || filter.accept(this, s)) + files.add(new File(s)); + } else { + for (String s : ss) + if ((filter == null) || filter.accept(this, s)) + files.add(new File(s, this)); + } return files.toArray(new File[files.size()]); } @@ -1208,10 +1214,18 @@ public File[] listFiles(FileFilter filter) { String[] ss = normalizedList(); if (ss == null) return null; ArrayList files = new ArrayList<>(); - for (String s : ss) { - File f = new File(s, this); - if ((filter == null) || filter.accept(f)) - files.add(f); + if (path.isEmpty()) { + for (String s : ss) { + File f = new File(s); + if ((filter == null) || filter.accept(f)) + files.add(f); + } + } else { + for (String s : ss) { + File f = new File(s, this); + if ((filter == null) || filter.accept(f)) + files.add(f); + } } return files.toArray(new File[files.size()]); } diff --git a/test/jdk/java/io/File/EmptyPath.java b/test/jdk/java/io/File/EmptyPath.java index d0c9beddc0825..bfe01ba1c4d3f 100644 --- a/test/jdk/java/io/File/EmptyPath.java +++ b/test/jdk/java/io/File/EmptyPath.java @@ -22,13 +22,15 @@ */ /* @test - * @bug 4842706 8024695 8361587 + * @bug 4842706 8024695 8361587 8362429 * @summary Test some file operations with empty path * @run junit EmptyPath */ import java.io.File; +import java.io.FileFilter; import java.io.FileInputStream; +import java.io.FilenameFilter; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; @@ -38,6 +40,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; @@ -221,11 +224,26 @@ public void list() throws IOException { @Test public void listFiles() throws IOException { - File child = new File(f.getAbsoluteFile(), "child"); + listFiles(x -> x.listFiles()); + } + + @Test + public void listFilesFileFilter() throws IOException { + listFiles(x -> x.listFiles((FileFilter)null)); + } + + @Test + public void listFilesFilenameFilter() throws IOException { + listFiles(x -> x.listFiles((FilenameFilter)null)); + } + + private void listFiles(Function func) throws IOException { + String childName = "child" + System.nanoTime(); + File child = new File(f.getAbsoluteFile(), childName); assertTrue(child.createNewFile()); child.deleteOnExit(); - File[] files = f.listFiles(); + File[] files = func.apply(f); for (File file : files) assertEquals(-1, f.toString().indexOf(File.separatorChar)); From 1c61743a245f3eb745195604d6de1e7b87ccc3c9 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Wed, 16 Jul 2025 10:42:28 -0700 Subject: [PATCH 2/3] 8362429: Add list(FilenameFilter) and toURL() --- test/jdk/java/io/File/EmptyPath.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/jdk/java/io/File/EmptyPath.java b/test/jdk/java/io/File/EmptyPath.java index bfe01ba1c4d3f..6cc62f9127ba9 100644 --- a/test/jdk/java/io/File/EmptyPath.java +++ b/test/jdk/java/io/File/EmptyPath.java @@ -33,6 +33,7 @@ import java.io.FilenameFilter; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.FileStore; import java.nio.file.Path; @@ -214,7 +215,15 @@ public void length() throws IOException { @Test public void list() throws IOException { - String[] files = f.list(); + list(f.list()); + } + + @Test + public void listFilenameFilter() throws IOException { + list(f.list((FilenameFilter)null)); + } + + private void list(String[] files) throws IOException { assertNotNull(files); Set ioSet = new HashSet(Arrays.asList(files)); Set nioSet = new HashSet(); @@ -366,4 +375,9 @@ public String toString() { public void toURI() { assertEquals(f.toPath().toUri(), f.toURI()); } + + @Test + public void toURL() throws MalformedURLException { + assertEquals(f.toPath().toUri().toURL(), f.toURL()); + } } From cfd494f895c5ec0036a167f23d98d51d69e9f5ab Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Wed, 16 Jul 2025 12:22:52 -0700 Subject: [PATCH 3/3] 8362429: Simplify listFile loops; add non-null filter tests --- src/java.base/share/classes/java/io/File.java | 42 ++++++------------- test/jdk/java/io/File/EmptyPath.java | 16 +++++++ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/java.base/share/classes/java/io/File.java b/src/java.base/share/classes/java/io/File.java index a1fda8c27db18..bb21636634488 100644 --- a/src/java.base/share/classes/java/io/File.java +++ b/src/java.base/share/classes/java/io/File.java @@ -1134,15 +1134,9 @@ public File[] listFiles() { if (ss == null) return null; int n = ss.length; File[] fs = new File[n]; - if (path.isEmpty()) { - for (int i = 0; i < n; i++) { - fs[i] = new File(ss[i]); - } - } else { - for (int i = 0; i < n; i++) { - fs[i] = new File(ss[i], this); - } - } + boolean isEmpty = path.isEmpty(); + for (int i = 0; i < n; i++) + fs[i] = isEmpty ? new File(ss[i]) : new File(ss[i], this); return fs; } @@ -1175,15 +1169,10 @@ public File[] listFiles(FilenameFilter filter) { String[] ss = normalizedList(); if (ss == null) return null; ArrayList files = new ArrayList<>(); - if (path.isEmpty()) { - for (String s : ss) - if ((filter == null) || filter.accept(this, s)) - files.add(new File(s)); - } else { - for (String s : ss) - if ((filter == null) || filter.accept(this, s)) - files.add(new File(s, this)); - } + boolean isEmpty = path.isEmpty(); + for (String s : ss) + if ((filter == null) || filter.accept(this, s)) + files.add(isEmpty ? new File(s) : new File(s, this)); return files.toArray(new File[files.size()]); } @@ -1214,18 +1203,11 @@ public File[] listFiles(FileFilter filter) { String[] ss = normalizedList(); if (ss == null) return null; ArrayList files = new ArrayList<>(); - if (path.isEmpty()) { - for (String s : ss) { - File f = new File(s); - if ((filter == null) || filter.accept(f)) - files.add(f); - } - } else { - for (String s : ss) { - File f = new File(s, this); - if ((filter == null) || filter.accept(f)) - files.add(f); - } + boolean isEmpty = path.isEmpty(); + for (String s : ss) { + File f = isEmpty ? new File(s) : new File(s, this); + if ((filter == null) || filter.accept(f)) + files.add(f); } return files.toArray(new File[files.size()]); } diff --git a/test/jdk/java/io/File/EmptyPath.java b/test/jdk/java/io/File/EmptyPath.java index 6cc62f9127ba9..55c4af96fe376 100644 --- a/test/jdk/java/io/File/EmptyPath.java +++ b/test/jdk/java/io/File/EmptyPath.java @@ -238,11 +238,27 @@ public void listFiles() throws IOException { @Test public void listFilesFileFilter() throws IOException { + FileFilter ff = new FileFilter() { + public boolean accept(File pathname) { return true; } + }; + listFiles(x -> x.listFiles(ff)); + } + + @Test + public void listFilesNullFileFilter() throws IOException { listFiles(x -> x.listFiles((FileFilter)null)); } @Test public void listFilesFilenameFilter() throws IOException { + FilenameFilter fnf = new FilenameFilter() { + public boolean accept(File dir, String name) { return true; } + }; + listFiles(x -> x.listFiles(fnf)); + } + + @Test + public void listFilesNullFilenameFilter() throws IOException { listFiles(x -> x.listFiles((FilenameFilter)null)); }