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.junit.jupiter.api.BeforeEach; 33 import org.junit.jupiter.api.Test; 34 import org.junit.jupiter.api.io.TempDir; 35 36 /** 37 * Test cases for FileUtils.listFiles() methods. 38 */ 39 public class FileUtilsListFilesTest { 40 41 @TempDir 42 public File temporaryFolder; 43 filesToFilenames(final Collection<File> files)44 private Collection<String> filesToFilenames(final Collection<File> files) { 45 return files.stream().map(File::getName).collect(Collectors.toList()); 46 } 47 filesToFilenames(final Iterator<File> files)48 private Collection<String> filesToFilenames(final Iterator<File> files) { 49 final Collection<String> fileNames = new ArrayList<>(); 50 files.forEachRemaining(f -> fileNames.add(f.getName())); 51 return fileNames; 52 } 53 54 @SuppressWarnings("ResultOfMethodCallIgnored") 55 @BeforeEach setUp()56 public void setUp() throws Exception { 57 File dir = temporaryFolder; 58 File file = new File(dir, "dummy-build.xml"); 59 FileUtils.touch(file); 60 file = new File(dir, "README"); 61 FileUtils.touch(file); 62 63 dir = new File(dir, "subdir1"); 64 dir.mkdirs(); 65 file = new File(dir, "dummy-build.xml"); 66 FileUtils.touch(file); 67 file = new File(dir, "dummy-readme.txt"); 68 FileUtils.touch(file); 69 70 dir = new File(dir, "subsubdir1"); 71 dir.mkdirs(); 72 file = new File(dir, "dummy-file.txt"); 73 FileUtils.touch(file); 74 file = new File(dir, "dummy-index.html"); 75 FileUtils.touch(file); 76 77 dir = dir.getParentFile(); 78 dir = new File(dir, "CVS"); 79 dir.mkdirs(); 80 file = new File(dir, "Entries"); 81 FileUtils.touch(file); 82 file = new File(dir, "Repository"); 83 FileUtils.touch(file); 84 } 85 86 @Test testIterateFilesByExtension()87 public void testIterateFilesByExtension() { 88 final String[] extensions = { "xml", "txt" }; 89 90 Iterator<File> files = FileUtils.iterateFiles(temporaryFolder, extensions, false); 91 Collection<String> filenames = filesToFilenames(files); 92 assertEquals(1, filenames.size()); 93 assertTrue(filenames.contains("dummy-build.xml")); 94 assertFalse(filenames.contains("README")); 95 assertFalse(filenames.contains("dummy-file.txt")); 96 97 files = FileUtils.iterateFiles(temporaryFolder, extensions, true); 98 filenames = filesToFilenames(files); 99 assertEquals(4, filenames.size()); 100 assertTrue(filenames.contains("dummy-file.txt")); 101 assertFalse(filenames.contains("dummy-index.html")); 102 103 files = FileUtils.iterateFiles(temporaryFolder, null, false); 104 filenames = filesToFilenames(files); 105 assertEquals(2, filenames.size()); 106 assertTrue(filenames.contains("dummy-build.xml")); 107 assertTrue(filenames.contains("README")); 108 assertFalse(filenames.contains("dummy-file.txt")); 109 } 110 111 @Test testListFiles()112 public void testListFiles() { 113 Collection<File> files; 114 Collection<String> filenames; 115 IOFileFilter fileFilter; 116 IOFileFilter dirFilter; 117 118 // First, find non-recursively 119 fileFilter = FileFilterUtils.trueFileFilter(); 120 files = FileUtils.listFiles(temporaryFolder, fileFilter, null); 121 filenames = filesToFilenames(files); 122 assertTrue(filenames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 123 assertFalse(filenames.contains("dummy-index.html"), "'dummy-index.html' shouldn't be found"); 124 assertFalse(filenames.contains("Entries"), "'Entries' shouldn't be found"); 125 126 // Second, find recursively 127 fileFilter = FileFilterUtils.trueFileFilter(); 128 dirFilter = FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter("CVS")); 129 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 130 filenames = filesToFilenames(files); 131 assertTrue(filenames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 132 assertTrue(filenames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 133 assertFalse(filenames.contains("Entries"), "'Entries' shouldn't be found"); 134 135 // Do the same as above but now with the filter coming from FileFilterUtils 136 fileFilter = FileFilterUtils.trueFileFilter(); 137 dirFilter = FileFilterUtils.makeCVSAware(null); 138 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 139 filenames = filesToFilenames(files); 140 assertTrue(filenames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 141 assertTrue(filenames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 142 assertFalse(filenames.contains("Entries"), "'Entries' shouldn't be found"); 143 144 // Again with the CVS filter but now with a non-null parameter 145 fileFilter = FileFilterUtils.trueFileFilter(); 146 dirFilter = FileFilterUtils.prefixFileFilter("sub"); 147 dirFilter = FileFilterUtils.makeCVSAware(dirFilter); 148 files = FileUtils.listFiles(temporaryFolder, fileFilter, dirFilter); 149 filenames = filesToFilenames(files); 150 assertTrue(filenames.contains("dummy-build.xml"), "'dummy-build.xml' is missing"); 151 assertTrue(filenames.contains("dummy-index.html"), "'dummy-index.html' is missing"); 152 assertFalse(filenames.contains("Entries"), "'Entries' shouldn't be found"); 153 154 assertThrows(NullPointerException.class, () -> FileUtils.listFiles(temporaryFolder, null, null)); 155 } 156 157 @Test testListFilesByExtension()158 public void testListFilesByExtension() { 159 final String[] extensions = {"xml", "txt"}; 160 161 Collection<File> files = FileUtils.listFiles(temporaryFolder, extensions, false); 162 assertEquals(1, files.size()); 163 Collection<String> filenames = filesToFilenames(files); 164 assertTrue(filenames.contains("dummy-build.xml")); 165 assertFalse(filenames.contains("README")); 166 assertFalse(filenames.contains("dummy-file.txt")); 167 168 files = FileUtils.listFiles(temporaryFolder, extensions, true); 169 filenames = filesToFilenames(files); 170 assertEquals(4, filenames.size()); 171 assertTrue(filenames.contains("dummy-file.txt")); 172 assertFalse(filenames.contains("dummy-index.html")); 173 174 files = FileUtils.listFiles(temporaryFolder, null, false); 175 assertEquals(2, files.size()); 176 filenames = filesToFilenames(files); 177 assertTrue(filenames.contains("dummy-build.xml")); 178 assertTrue(filenames.contains("README")); 179 assertFalse(filenames.contains("dummy-file.txt")); 180 } 181 182 183 } 184