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.assertArrayEquals; 20 import static org.junit.jupiter.api.Assertions.assertEquals; 21 import static org.junit.jupiter.api.Assertions.assertFalse; 22 import static org.junit.jupiter.api.Assertions.assertTrue; 23 24 import java.io.File; 25 import java.util.Locale; 26 27 import org.junit.jupiter.api.Test; 28 29 /** 30 * Tests {@link FilenameUtils} {@code wildcardMatch()} methods. 31 */ 32 public class FilenameUtilsWildcardTest { 33 34 private static final boolean WINDOWS = File.separatorChar == '\\'; 35 36 // Testing: 37 // FilenameUtils.wildcardMatch(String,String) 38 assertMatch(final String text, final String wildcard, final boolean expected)39 private void assertMatch(final String text, final String wildcard, final boolean expected) { 40 assertEquals(expected, FilenameUtils.wildcardMatch(text, wildcard), text + " " + wildcard); 41 } 42 43 /** 44 * See https://issues.apache.org/jira/browse/IO-246 45 */ 46 @Test test_IO_246()47 public void test_IO_246() { 48 49 // Tests for "*?" 50 assertMatch("aaa", "aa*?", true); 51 // these ought to work as well, but "*?" does not work properly at present 52 // assertMatch("aaa", "a*?", true); 53 // assertMatch("aaa", "*?", true); 54 55 // Tests for "?*" 56 assertMatch("", "?*", false); 57 assertMatch("a", "a?*", false); 58 assertMatch("aa", "aa?*", false); 59 assertMatch("a", "?*", true); 60 assertMatch("aa", "?*", true); 61 assertMatch("aaa", "?*", true); 62 63 // Test ending on "?" 64 assertMatch("", "?", false); 65 assertMatch("a", "a?", false); 66 assertMatch("aa", "aa?", false); 67 assertMatch("aab", "aa?", true); 68 assertMatch("aaa", "*a", true); 69 } 70 71 @Test testLocaleIndependence()72 public void testLocaleIndependence() { 73 final Locale orig = Locale.getDefault(); 74 75 final Locale[] locales = Locale.getAvailableLocales(); 76 77 final String[][] data = { 78 { "I", "i"}, 79 { "i", "I"}, 80 { "i", "\u0130"}, 81 { "i", "\u0131"}, 82 { "\u03A3", "\u03C2"}, 83 { "\u03A3", "\u03C3"}, 84 { "\u03C2", "\u03C3"}, 85 }; 86 87 try { 88 for (int i = 0; i < data.length; i++) { 89 for (final Locale locale : locales) { 90 Locale.setDefault(locale); 91 assertTrue(data[i][0].equalsIgnoreCase(data[i][1]), "Test data corrupt: " + i); 92 final boolean match = FilenameUtils.wildcardMatch(data[i][0], data[i][1], IOCase.INSENSITIVE); 93 assertTrue(match, Locale.getDefault().toString() + ": " + i); 94 } 95 } 96 } finally { 97 Locale.setDefault(orig); 98 } 99 } 100 101 @Test testMatch()102 public void testMatch() { 103 assertFalse(FilenameUtils.wildcardMatch(null, "Foo")); 104 assertFalse(FilenameUtils.wildcardMatch("Foo", null)); 105 assertTrue(FilenameUtils.wildcardMatch(null, null)); 106 assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo")); 107 assertTrue(FilenameUtils.wildcardMatch("", "")); 108 assertTrue(FilenameUtils.wildcardMatch("", "*")); 109 assertFalse(FilenameUtils.wildcardMatch("", "?")); 110 assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo*")); 111 assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo?")); 112 assertTrue(FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*")); 113 assertTrue(FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s")); 114 assertFalse(FilenameUtils.wildcardMatch("Foo", "Bar")); 115 assertTrue(FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*")); 116 assertTrue(FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er")); 117 assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo")); 118 assertTrue(FilenameUtils.wildcardMatch("BarFoo", "*Foo")); 119 assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*")); 120 assertTrue(FilenameUtils.wildcardMatch("FooBar", "Foo*")); 121 assertFalse(FilenameUtils.wildcardMatch("FOO", "*Foo")); 122 assertFalse(FilenameUtils.wildcardMatch("BARFOO", "*Foo")); 123 assertFalse(FilenameUtils.wildcardMatch("FOO", "Foo*")); 124 assertFalse(FilenameUtils.wildcardMatch("FOOBAR", "Foo*")); 125 } 126 127 // A separate set of tests, added to this batch 128 @Test testMatch2()129 public void testMatch2() { 130 assertMatch("log.txt", "log.txt", true); 131 assertMatch("log.txt1", "log.txt", false); 132 133 assertMatch("log.txt", "log.txt*", true); 134 assertMatch("log.txt", "log.txt*1", false); 135 assertMatch("log.txt", "*log.txt*", true); 136 137 assertMatch("log.txt", "*.txt", true); 138 assertMatch("txt.log", "*.txt", false); 139 assertMatch("config.ini", "*.ini", true); 140 141 assertMatch("config.txt.bak", "con*.txt", false); 142 143 assertMatch("log.txt9", "*.txt?", true); 144 assertMatch("log.txt", "*.txt?", false); 145 146 assertMatch("progtestcase.java~5~", "*test*.java~*~", true); 147 assertMatch("progtestcase.java;5~", "*test*.java~*~", false); 148 assertMatch("progtestcase.java~5", "*test*.java~*~", false); 149 150 assertMatch("log.txt", "log.*", true); 151 152 assertMatch("log.txt", "log?*", true); 153 154 assertMatch("log.txt12", "log.txt??", true); 155 156 assertMatch("log.log", "log**log", true); 157 assertMatch("log.log", "log**", true); 158 assertMatch("log.log", "log.**", true); 159 assertMatch("log.log", "**.log", true); 160 assertMatch("log.log", "**log", true); 161 162 assertMatch("log.log", "log*log", true); 163 assertMatch("log.log", "log*", true); 164 assertMatch("log.log", "log.*", true); 165 assertMatch("log.log", "*.log", true); 166 assertMatch("log.log", "*log", true); 167 168 assertMatch("log.log", "*log?", false); 169 assertMatch("log.log", "*log?*", true); 170 assertMatch("log.log.abc", "*log?abc", true); 171 assertMatch("log.log.abc.log.abc", "*log?abc", true); 172 assertMatch("log.log.abc.log.abc.d", "*log?abc?d", true); 173 } 174 175 @Test testMatchCaseSpecified()176 public void testMatchCaseSpecified() { 177 assertFalse(FilenameUtils.wildcardMatch(null, "Foo", IOCase.SENSITIVE)); 178 assertFalse(FilenameUtils.wildcardMatch("Foo", null, IOCase.SENSITIVE)); 179 assertTrue(FilenameUtils.wildcardMatch(null, null, IOCase.SENSITIVE)); 180 assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo", IOCase.SENSITIVE)); 181 assertTrue(FilenameUtils.wildcardMatch("", "", IOCase.SENSITIVE)); 182 assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo*", IOCase.SENSITIVE)); 183 assertTrue(FilenameUtils.wildcardMatch("Foo", "Fo?", IOCase.SENSITIVE)); 184 assertTrue(FilenameUtils.wildcardMatch("Foo Bar and Catflap", "Fo*", IOCase.SENSITIVE)); 185 assertTrue(FilenameUtils.wildcardMatch("New Bookmarks", "N?w ?o?k??r?s", IOCase.SENSITIVE)); 186 assertFalse(FilenameUtils.wildcardMatch("Foo", "Bar", IOCase.SENSITIVE)); 187 assertTrue(FilenameUtils.wildcardMatch("Foo Bar Foo", "F*o Bar*", IOCase.SENSITIVE)); 188 assertTrue(FilenameUtils.wildcardMatch("Adobe Acrobat Installer", "Ad*er", IOCase.SENSITIVE)); 189 assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE)); 190 assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE)); 191 assertTrue(FilenameUtils.wildcardMatch("Foo", "*Foo", IOCase.SENSITIVE)); 192 assertTrue(FilenameUtils.wildcardMatch("BarFoo", "*Foo", IOCase.SENSITIVE)); 193 assertTrue(FilenameUtils.wildcardMatch("Foo", "Foo*", IOCase.SENSITIVE)); 194 assertTrue(FilenameUtils.wildcardMatch("FooBar", "Foo*", IOCase.SENSITIVE)); 195 196 assertFalse(FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SENSITIVE)); 197 assertFalse(FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SENSITIVE)); 198 assertFalse(FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SENSITIVE)); 199 assertFalse(FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SENSITIVE)); 200 assertTrue(FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.INSENSITIVE)); 201 assertTrue(FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.INSENSITIVE)); 202 assertTrue(FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.INSENSITIVE)); 203 assertTrue(FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.INSENSITIVE)); 204 assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "*Foo", IOCase.SYSTEM)); 205 assertEquals(WINDOWS, FilenameUtils.wildcardMatch("BARFOO", "*Foo", IOCase.SYSTEM)); 206 assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOO", "Foo*", IOCase.SYSTEM)); 207 assertEquals(WINDOWS, FilenameUtils.wildcardMatch("FOOBAR", "Foo*", IOCase.SYSTEM)); 208 } 209 210 @Test testMatchOnSystem()211 public void testMatchOnSystem() { 212 assertFalse(FilenameUtils.wildcardMatchOnSystem(null, "Foo")); 213 assertFalse(FilenameUtils.wildcardMatchOnSystem("Foo", null)); 214 assertTrue(FilenameUtils.wildcardMatchOnSystem(null, null)); 215 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Foo")); 216 assertTrue(FilenameUtils.wildcardMatchOnSystem("", "")); 217 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Fo*")); 218 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Fo?")); 219 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo Bar and Catflap", "Fo*")); 220 assertTrue(FilenameUtils.wildcardMatchOnSystem("New Bookmarks", "N?w ?o?k??r?s")); 221 assertFalse(FilenameUtils.wildcardMatchOnSystem("Foo", "Bar")); 222 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo Bar Foo", "F*o Bar*")); 223 assertTrue(FilenameUtils.wildcardMatchOnSystem("Adobe Acrobat Installer", "Ad*er")); 224 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "*Foo")); 225 assertTrue(FilenameUtils.wildcardMatchOnSystem("BarFoo", "*Foo")); 226 assertTrue(FilenameUtils.wildcardMatchOnSystem("Foo", "Foo*")); 227 assertTrue(FilenameUtils.wildcardMatchOnSystem("FooBar", "Foo*")); 228 assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "*Foo")); 229 assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("BARFOO", "*Foo")); 230 assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOO", "Foo*")); 231 assertEquals(WINDOWS, FilenameUtils.wildcardMatchOnSystem("FOOBAR", "Foo*")); 232 } 233 234 @Test testSplitOnTokens()235 public void testSplitOnTokens() { 236 assertArrayEquals(new String[] { "Ad", "*", "er" }, FilenameUtils.splitOnTokens("Ad*er")); 237 assertArrayEquals(new String[] { "Ad", "?", "er" }, FilenameUtils.splitOnTokens("Ad?er")); 238 assertArrayEquals(new String[] { "Test", "*", "?", "One" }, FilenameUtils.splitOnTokens("Test*?One")); 239 assertArrayEquals(new String[] { "Test", "?", "*", "One" }, FilenameUtils.splitOnTokens("Test?*One")); 240 assertArrayEquals(new String[] { "*" }, FilenameUtils.splitOnTokens("****")); 241 assertArrayEquals(new String[] { "*", "?", "?", "*" }, FilenameUtils.splitOnTokens("*??*")); 242 assertArrayEquals(new String[] { "*", "?", "*", "?", "*" }, FilenameUtils.splitOnTokens("*?**?*")); 243 assertArrayEquals(new String[] { "*", "?", "*", "?", "*" }, FilenameUtils.splitOnTokens("*?***?*")); 244 assertArrayEquals(new String[] { "h", "?", "?", "*" }, FilenameUtils.splitOnTokens("h??*")); 245 assertArrayEquals(new String[] { "" }, FilenameUtils.splitOnTokens("")); 246 } 247 248 } 249