1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.io; 18 19 import static org.junit.jupiter.api.Assertions.assertEquals; 20 import static org.junit.jupiter.api.Assertions.assertFalse; 21 import static org.junit.jupiter.api.Assertions.assertThrows; 22 import static org.junit.jupiter.api.Assertions.assertTrue; 23 24 import java.io.File; 25 import java.util.ArrayList; 26 import java.util.Collection; 27 import java.util.Iterator; 28 import java.util.stream.Collectors; 29 30 import org.apache.commons.io.filefilter.FileFilterUtils; 31 import org.apache.commons.io.filefilter.IOFileFilter; 32 import org.apache.commons.lang3.function.Consumers; 33 import org.junit.jupiter.api.BeforeEach; 34 import org.junit.jupiter.api.Test; 35 import org.junit.jupiter.api.io.TempDir; 36 37 /** 38 * Tests FileUtils.listFiles() methods. 39 */ 40 public class FileUtilsListFilesTest { 41 42 @TempDir 43 public File temporaryFolder; 44 filesToFilenames(final Collection<File> files)45 private Collection<String> filesToFilenames(final Collection<File> files) { 46 return files.stream().map(File::getName).collect(Collectors.toList()); 47 } 48 49 /** 50 * Consumes and closes the underlying stream. 51 * 52 * @param files The iterator to consume. 53 * @return a new collection. 54 */ filesToFilenames(final Iterator<File> files)55 private Collection<String> filesToFilenames(final Iterator<File> files) { 56 final Collection<String> fileNames = new ArrayList<>(); 57 // Iterator.forEachRemaining() closes the underlying stream. 58 files.forEachRemaining(f -> fileNames.add(f.getName())); 59 return fileNames; 60 } 61 62 @SuppressWarnings("ResultOfMethodCallIgnored") 63 @BeforeEach setUp()64 public void setUp() throws Exception { 65 File dir = temporaryFolder; 66 File file = new File(dir, "dummy-build.xml"); 67 FileUtils.touch(file); 68 file = new File(dir, "README"); 69 FileUtils.touch(file); 70 71 dir = new File(dir, "subdir1"); 72 dir.mkdirs(); 73 file = new File(dir, "dummy-build.xml"); 74 FileUtils.touch(file); 75 file = new File(dir, "dummy-readme.txt"); 76 FileUtils.touch(file); 77 78 dir = new File(dir, "subsubdir1"); 79 dir.mkdirs(); 80 file = new File(dir, "dummy-file.txt"); 81 FileUtils.touch(file); 82 file = new File(dir, "dummy-index.html"); 83 FileUtils.touch(file); 84 85 dir = dir.getParentFile(); 86 dir = new File(dir, "CVS"); 87 dir.mkdirs(); 88 file = new File(dir, "Entries"); 89 FileUtils.touch(file); 90 file = new File(dir, "Repository"); 91 FileUtils.touch(file); 92 } 93 94 @Test testIterateFilesByExtension()95 public void testIterateFilesByExtension() { 96 final String[] extensions = { "xml", "txt" }; 97 98 Iterator<File> files = FileUtils.iterateFiles(temporaryFolder, extensions, false); 99 try { 100 final Collection<String> fileNames = filesToFilenames(files); 101 assertEquals(1, fileNames.size()); 102 assertTrue(fileNames.contains("dummy-build.xml")); 103 assertFalse(fileNames.contains("README")); 104 assertFalse(fileNames.contains("dummy-file.txt")); 105 } finally { 106 // Backstop in case filesToFilenames() failure. 107 files.forEachRemaining(Consumers.nop()); 108 } 109 110 try { 111 files = FileUtils.iterateFiles(temporaryFolder, extensions, true); 112 final Collection<String> fileNames = filesToFilenames(files); 113 assertEquals(4, fileNames.size()); 114 assertTrue(fileNames.contains("dummy-file.txt")); 115 assertFalse(fileNames.contains("dummy-index.html")); 116 } finally { 117 // Backstop in case filesToFilenames() failure. 118 files.forEachRemaining(Consumers.nop()); 119 } 120 121 files = FileUtils.iterateFiles(temporaryFolder, null, false); 122 try { 123 final Collection<String> fileNames = filesToFilenames(files); 124 assertEquals(2, fileNames.size()); 125 assertTrue(fileNames.contains("dummy-build.xml")); 126 assertTrue(fileNames.contains("README")); 127 assertFalse(fileNames.contains("dummy-file.txt")); 128 } finally { 129 // Backstop in case filesToFilenames() failure. 130 files.forEachRemaining(Consumers.nop()); 131 } 132 } 133 134 @Test testListFiles()135 public void testListFiles() { 136 Collection<File> files; 137 Collection<String> fileNames; 138 IOFileFilter fileFilter; 139 IOFileFilter dirFilter; 140 141 // First, find non-recursively 142 fileFilter = FileFilterUtils.trueFileFilter(); 143 files = FileUtils.listFiles(temporaryFolder, fileFilter, null); 144 fileNames = filesToFilenames(files); 145 assertTrue(fileNames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 146 assertFalse(fileNames.contains("dummy-index.html"), "'dummy-index.html' shouldn't be found"); 147 assertFalse(fileNames.contains("Entries"), "'Entries' shouldn't be found"); 148 149 // Second, find recursively 150 fileFilter = FileFilterUtils.trueFileFilter(); 151 dirFilter = FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("CVS")); 152 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 153 fileNames = filesToFilenames(files); 154 assertTrue(fileNames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 155 assertTrue(fileNames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 156 assertFalse(fileNames.contains("Entries"), "'Entries' shouldn't be found"); 157 158 // Do the same as above but now with the filter coming from FileFilterUtils 159 fileFilter = FileFilterUtils.trueFileFilter(); 160 dirFilter = FileFilterUtils.makeCVSAware(null); 161 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 162 fileNames = filesToFilenames(files); 163 assertTrue(fileNames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 164 assertTrue(fileNames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 165 assertFalse(fileNames.contains("Entries"), "'Entries' shouldn't be found"); 166 167 // Again with the CVS filter but now with a non-null parameter 168 fileFilter = FileFilterUtils.trueFileFilter(); 169 dirFilter = FileFilterUtils.prefixFileFilter("sub"); 170 dirFilter = FileFilterUtils.makeCVSAware(dirFilter); 171 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 172 fileNames = filesToFilenames(files); 173 assertTrue(fileNames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 174 assertTrue(fileNames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 175 assertFalse(fileNames.contains("Entries"), "'Entries' shouldn't be found"); 176 177 assertThrows(NullPointerException.class, () -> FileUtils.listFiles(temporaryFolder, null, null)); 178 } 179 180 @Test testListFilesByExtension()181 public void testListFilesByExtension() { 182 final String[] extensions = {"xml", "txt"}; 183 184 Collection<File> files = FileUtils.listFiles(temporaryFolder, extensions, false); 185 assertEquals(1, files.size()); 186 Collection<String> fileNames = filesToFilenames(files); 187 assertTrue(fileNames.contains("dummy-build.xml")); 188 assertFalse(fileNames.contains("README")); 189 assertFalse(fileNames.contains("dummy-file.txt")); 190 191 files = FileUtils.listFiles(temporaryFolder, extensions, true); 192 fileNames = filesToFilenames(files); 193 assertEquals(4, fileNames.size()); 194 assertTrue(fileNames.contains("dummy-file.txt")); 195 assertFalse(fileNames.contains("dummy-index.html")); 196 197 files = FileUtils.listFiles(temporaryFolder, null, false); 198 assertEquals(2, files.size()); 199 fileNames = filesToFilenames(files); 200 assertTrue(fileNames.contains("dummy-build.xml")); 201 assertTrue(fileNames.contains("README")); 202 assertFalse(fileNames.contains("dummy-file.txt")); 203 } 204 205 206 } 207