This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new a44f4133 [IO-811] Files.walk() direct and indirect callers fail to close the returned Stream<Path> a44f4133 is described below commit a44f4133c4f3e28a72c5a934c7feb929da2f8a54 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Sep 30 09:04:27 2023 -0400 [IO-811] Files.walk() direct and indirect callers fail to close the returned Stream<Path> - Internal Javadoc - Release resource in test --- src/main/java/org/apache/commons/io/FileUtils.java | 6 +++ .../apache/commons/io/FileUtilsListFilesTest.java | 49 +++++++++++++++------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/apache/commons/io/FileUtils.java b/src/main/java/org/apache/commons/io/FileUtils.java index 8a8adca7..542e9b6c 100644 --- a/src/main/java/org/apache/commons/io/FileUtils.java +++ b/src/main/java/org/apache/commons/io/FileUtils.java @@ -3045,6 +3045,12 @@ public class FileUtils { return files; } + /** + * Consumes all of the given stream and <em>closes</em> it because FileTreeWalker.next() calls {@code top.stream().close()}. + * + * @param stream The stream to consume. + * @return a new List. + */ private static List<File> toList(final Stream<File> stream) { return stream.collect(Collectors.toList()); } diff --git a/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java b/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java index 27a81c98..10897092 100644 --- a/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java +++ b/src/test/java/org/apache/commons/io/FileUtilsListFilesTest.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.lang3.function.Consumers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -47,6 +48,7 @@ public class FileUtilsListFilesTest { private Collection<String> filesToFilenames(final Iterator<File> files) { final Collection<String> fileNames = new ArrayList<>(); + // Iterator.forEachRemaining() closes the underlying stream. files.forEachRemaining(f -> fileNames.add(f.getName())); return fileNames; } @@ -88,24 +90,39 @@ public class FileUtilsListFilesTest { final String[] extensions = { "xml", "txt" }; Iterator<File> files = FileUtils.iterateFiles(temporaryFolder, extensions, false); - Collection<String> filenames = filesToFilenames(files); - assertEquals(1, filenames.size()); - assertTrue(filenames.contains("dummy-build.xml")); - assertFalse(filenames.contains("README")); - assertFalse(filenames.contains("dummy-file.txt")); - - files = FileUtils.iterateFiles(temporaryFolder, extensions, true); - filenames = filesToFilenames(files); - assertEquals(4, filenames.size()); - assertTrue(filenames.contains("dummy-file.txt")); - assertFalse(filenames.contains("dummy-index.html")); + try { + Collection<String> filenames = filesToFilenames(files); + assertEquals(1, filenames.size()); + assertTrue(filenames.contains("dummy-build.xml")); + assertFalse(filenames.contains("README")); + assertFalse(filenames.contains("dummy-file.txt")); + } finally { + // Backstop in case filesToFilenames() failure. + files.forEachRemaining(Consumers.nop()); + } + + try { + files = FileUtils.iterateFiles(temporaryFolder, extensions, true); + Collection<String> filenames = filesToFilenames(files); + assertEquals(4, filenames.size()); + assertTrue(filenames.contains("dummy-file.txt")); + assertFalse(filenames.contains("dummy-index.html")); + } finally { + // Backstop in case filesToFilenames() failure. + files.forEachRemaining(Consumers.nop()); + } files = FileUtils.iterateFiles(temporaryFolder, null, false); - filenames = filesToFilenames(files); - assertEquals(2, filenames.size()); - assertTrue(filenames.contains("dummy-build.xml")); - assertTrue(filenames.contains("README")); - assertFalse(filenames.contains("dummy-file.txt")); + try { + Collection<String> filenames = filesToFilenames(files); + assertEquals(2, filenames.size()); + assertTrue(filenames.contains("dummy-build.xml")); + assertTrue(filenames.contains("README")); + assertFalse(filenames.contains("dummy-file.txt")); + } finally { + // Backstop in case filesToFilenames() failure. + files.forEachRemaining(Consumers.nop()); + } } @Test