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.filefilter;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertNotNull;
21  
22  import java.io.File;
23  import java.io.IOException;
24  import java.nio.file.FileVisitResult;
25  import java.nio.file.Files;
26  import java.nio.file.Path;
27  import java.nio.file.attribute.BasicFileAttributes;
28  
29  import org.apache.commons.io.IOCase;
30  import org.junit.jupiter.api.io.TempDir;
31  
32  /**
33   * Tests {@link FileFilterUtils} and friends.
34   */
35  public class AbstractFilterTest {
36  
37      /**
38       * The subversion directory name.
39       */
40      static final String SVN_DIR_NAME = ".svn";
41  
42      static final boolean WINDOWS = File.separatorChar == '\\';
43  
44      @TempDir
45      public File temporaryFolder;
46  
47      void assertFiltering(final IOFileFilter filter, final File file, final boolean expected) throws IOException {
48          // Note. This only tests the (File, String) version if the parent of
49          // the File passed in is not null
50          assertEquals(expected, filter.accept(file), "Filter(File) " + filter.getClass().getName() + " not " + expected + " for " + file);
51  
52          if (file != null && file.getParentFile() != null) {
53              assertEquals(expected, filter.accept(file.getParentFile(), file.getName()),
54                      "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for " + file);
55              final Path path = file.toPath();
56              assertEquals(expected, filter.accept(path, null) != FileVisitResult.TERMINATE, filter::toString);
57              if (Files.isRegularFile(path)) {
58                  assertEquals(expected, filter.accept(path, Files.readAttributes(path, BasicFileAttributes.class)) != FileVisitResult.TERMINATE,
59                          filter::toString);
60              }
61              assertEquals(expected, filter.matches(path), filter::toString);
62          } else if (file == null) {
63              assertEquals(expected, filter.accept(null), "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
64              assertEquals(expected, filter.matches(null), "Filter(File, String) " + filter.getClass().getName() + " not " + expected + " for null");
65          }
66          assertNotNull(filter.toString());
67      }
68  
69      void assertFiltering(final IOFileFilter filter, final Path path, final boolean expected) {
70          // Note. This only tests the (Path, Path) version if the parent of
71          // the File passed in is not null
72          final FileVisitResult expectedFileVisitResult = AbstractFileFilter.toDefaultFileVisitResult(expected);
73          assertEquals(expectedFileVisitResult, filter.accept(path, null),
74                  "Filter(Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
75  
76          if (path != null && path.getParent() != null) {
77              assertEquals(expectedFileVisitResult, filter.accept(path, null),
78                      "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
79              assertEquals(expectedFileVisitResult != FileVisitResult.TERMINATE, filter.matches(path),
80                      "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for " + path);
81          } else if (path == null) {
82              assertEquals(expectedFileVisitResult, filter.accept(path, null),
83                      "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for null");
84              assertEquals(expectedFileVisitResult != FileVisitResult.TERMINATE, filter.matches(path),
85                      "Filter(Path, Path) " + filter.getClass().getName() + " not " + expectedFileVisitResult + " for null");
86          }
87          assertNotNull(filter.toString());
88      }
89  
90      void assertFooBarFileFiltering(IOFileFilter filter) throws IOException {
91          assertFiltering(filter, new File("foo"), true);
92          assertFiltering(filter, new File("foo"), true);
93          assertFiltering(filter, new File("bar"), true);
94          assertFiltering(filter, new File("fred"), false);
95          assertFiltering(filter, new File("foo").toPath(), true);
96          assertFiltering(filter, new File("foo").toPath(), true);
97          assertFiltering(filter, new File("bar").toPath(), true);
98          assertFiltering(filter, new File("fred").toPath(), false);
99  
100         filter = new NameFileFilter(new String[] { "foo", "bar" }, IOCase.SENSITIVE);
101         assertFiltering(filter, new File("foo"), true);
102         assertFiltering(filter, new File("bar"), true);
103         assertFiltering(filter, new File("FOO"), false);
104         assertFiltering(filter, new File("BAR"), false);
105         assertFiltering(filter, new File("foo").toPath(), true);
106         assertFiltering(filter, new File("bar").toPath(), true);
107         assertFiltering(filter, new File("FOO").toPath(), false);
108         assertFiltering(filter, new File("BAR").toPath(), false);
109 
110         filter = new NameFileFilter(new String[] { "foo", "bar" }, IOCase.INSENSITIVE);
111         assertFiltering(filter, new File("foo"), true);
112         assertFiltering(filter, new File("bar"), true);
113         assertFiltering(filter, new File("FOO"), true);
114         assertFiltering(filter, new File("BAR"), true);
115         assertFiltering(filter, new File("foo").toPath(), true);
116         assertFiltering(filter, new File("bar").toPath(), true);
117         assertFiltering(filter, new File("FOO").toPath(), true);
118         assertFiltering(filter, new File("BAR").toPath(), true);
119 
120         filter = new NameFileFilter(new String[] { "foo", "bar" }, IOCase.SYSTEM);
121         assertFiltering(filter, new File("foo"), true);
122         assertFiltering(filter, new File("bar"), true);
123         assertFiltering(filter, new File("FOO"), WINDOWS);
124         assertFiltering(filter, new File("BAR"), WINDOWS);
125         assertFiltering(filter, new File("foo").toPath(), true);
126         assertFiltering(filter, new File("bar").toPath(), true);
127         assertFiltering(filter, new File("FOO").toPath(), WINDOWS);
128         assertFiltering(filter, new File("BAR").toPath(), WINDOWS);
129 
130         filter = new NameFileFilter(new String[] { "foo", "bar" }, null);
131         assertFiltering(filter, new File("foo"), true);
132         assertFiltering(filter, new File("bar"), true);
133         assertFiltering(filter, new File("FOO"), false);
134         assertFiltering(filter, new File("BAR"), false);
135         assertFiltering(filter, new File("foo").toPath(), true);
136         assertFiltering(filter, new File("bar").toPath(), true);
137         assertFiltering(filter, new File("FOO").toPath(), false);
138         assertFiltering(filter, new File("BAR").toPath(), false);
139 
140         // repeat for a List
141         final java.util.ArrayList<String> list = new java.util.ArrayList<>();
142         list.add("foo");
143         list.add("bar");
144         filter = new NameFileFilter(list);
145         assertFiltering(filter, new File("foo"), true);
146         assertFiltering(filter, new File("bar"), true);
147         assertFiltering(filter, new File("fred"), false);
148         assertFiltering(filter, new File("foo").toPath(), true);
149         assertFiltering(filter, new File("bar").toPath(), true);
150         assertFiltering(filter, new File("fred").toPath(), false);
151 
152         filter = new NameFileFilter("foo");
153         assertFiltering(filter, new File("foo"), true);
154         assertFiltering(filter, new File("FOO"), false); // case-sensitive
155         assertFiltering(filter, new File("barfoo"), false);
156         assertFiltering(filter, new File("foobar"), false);
157         assertFiltering(filter, new File("fred"), false);
158         assertFiltering(filter, new File("foo").toPath(), true);
159         assertFiltering(filter, new File("FOO").toPath(), false); // case-sensitive
160         assertFiltering(filter, new File("barfoo").toPath(), false);
161         assertFiltering(filter, new File("foobar").toPath(), false);
162         assertFiltering(filter, new File("fred").toPath(), false);
163 
164         // FileFilterUtils.nameFileFilter(String, IOCase) tests
165         filter = FileFilterUtils.nameFileFilter("foo", IOCase.INSENSITIVE);
166         assertFiltering(filter, new File("foo"), true);
167         assertFiltering(filter, new File("FOO"), true); // case-insensitive
168         assertFiltering(filter, new File("barfoo"), false);
169         assertFiltering(filter, new File("foobar"), false);
170         assertFiltering(filter, new File("fred"), false);
171         assertFiltering(filter, new File("foo").toPath(), true);
172         assertFiltering(filter, new File("FOO").toPath(), true); // case-insensitive
173         assertFiltering(filter, new File("barfoo").toPath(), false);
174         assertFiltering(filter, new File("foobar").toPath(), false);
175         assertFiltering(filter, new File("fred").toPath(), false);
176     }
177 
178     boolean equalsLastModified(final File left, final File right) throws IOException {
179         return Files.getLastModifiedTime(left.toPath()).equals(Files.getLastModifiedTime(right.toPath()));
180     }
181 
182 }