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.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  
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
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
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
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
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
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
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
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 }