View Javadoc
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  
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       */
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
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
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
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
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 }