• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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