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 * Used to test FileFilterUtils. 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 assertFiltering(final IOFileFilter filter, final File file, final boolean expected)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 assertFiltering(final IOFileFilter filter, final Path path, final boolean expected)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 assertFooBarFileFiltering(IOFileFilter filter)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 equalsLastModified(final File left, final File right)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 } 183