/* * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test * @bug 4313887 6866397 8073445 * @summary Unit test for java.nio.file.PathMatcher */ import java.nio.file.*; import java.util.regex.PatternSyntaxException; public class Basic { static int failures; static void match(String name, String pattern, boolean expectedToMatch) { System.out.format("%s -> %s", name, pattern); Path file = Paths.get(name); boolean matched = file.getFileSystem() .getPathMatcher("glob:" + pattern).matches(file); if (matched) System.out.print(" (matched)"); else System.out.print(" (no match)"); if (matched != expectedToMatch) { System.out.println(" ==> UNEXPECTED RESULT!"); failures++; } else { System.out.println(" OKAY"); } } static void assertMatch(String path, String pattern) { match(path, pattern, true); } static void assertNotMatch(String path, String pattern) { match(path, pattern, false); } static void assertBadPattern(String path, String pattern) { System.out.format("Compile bad pattern %s\t", pattern); try { FileSystems.getDefault().getPathMatcher("glob:" + pattern); System.out.println("Compiled ==> UNEXPECTED RESULT!"); failures++; } catch (PatternSyntaxException e) { System.out.println("Failed to compile ==> OKAY"); } } static void assertRegExMatch(String path, String pattern) { System.out.format("Test regex pattern: %s", pattern); Path file = Paths.get(path); boolean matched = file.getFileSystem() .getPathMatcher("regex:" + pattern).matches(file); if (matched) { System.out.println(" OKAY"); } else { System.out.println(" ==> UNEXPECTED RESULT!"); failures++; } } public static void main(String[] args) { // basic assertMatch("foo.html", "foo.html"); assertNotMatch("foo.html", "foo.htm"); assertNotMatch("foo.html", "bar.html"); // match zero or more characters assertMatch("foo.html", "f*"); assertMatch("foo.html", "*.html"); assertMatch("foo.html", "foo.html*"); assertMatch("foo.html", "*foo.html"); assertMatch("foo.html", "*foo.html*"); assertNotMatch("foo.html", "*.htm"); assertNotMatch("foo.html", "f.*"); // match one character assertMatch("foo.html", "?oo.html"); assertMatch("foo.html", "??o.html"); assertMatch("foo.html", "???.html"); assertMatch("foo.html", "???.htm?"); assertNotMatch("foo.html", "foo.???"); // group of subpatterns assertMatch("foo.html", "foo{.html,.class}"); assertMatch("foo.html", "foo.{class,html}"); assertNotMatch("foo.html", "foo{.htm,.class}"); // bracket expressions assertMatch("foo.html", "[f]oo.html"); assertMatch("foo.html", "[e-g]oo.html"); assertMatch("foo.html", "[abcde-g]oo.html"); assertMatch("foo.html", "[abcdefx-z]oo.html"); assertMatch("foo.html", "[!a]oo.html"); assertMatch("foo.html", "[!a-e]oo.html"); assertMatch("foo-bar", "foo[-a-z]bar"); // match dash assertMatch("foo.html", "foo[!-]html"); // match !dash // groups of subpattern with bracket expressions assertMatch("foo.html", "[f]oo.{[h]tml,class}"); assertMatch("foo.html", "foo.{[a-z]tml,class}"); assertMatch("foo.html", "foo.{[!a-e]tml,.class}"); // assume special characters are allowed in file names assertMatch("{foo}.html", "\\{foo*"); assertMatch("{foo}.html", "*\\}.html"); assertMatch("[foo].html", "\\[foo*"); assertMatch("[foo].html", "*\\].html"); // errors assertBadPattern("foo.html", "*[a--z]"); // bad range assertBadPattern("foo.html", "*[a--]"); // bad range assertBadPattern("foo.html", "*[a-z"); // missing ] assertBadPattern("foo.html", "*{class,java"); // missing } assertBadPattern("foo.html", "*.{class,{.java}}"); // nested group assertBadPattern("foo.html", "*.html\\"); // nothing to escape // platform specific if (System.getProperty("os.name").startsWith("Windows")) { assertMatch("C:\\foo", "C:\\\\f*"); assertMatch("C:\\FOO", "c:\\\\f*"); assertMatch("C:\\foo\\bar\\gus", "C:\\\\**\\\\gus"); assertMatch("C:\\foo\\bar\\gus", "C:\\\\**"); } else { assertMatch("/tmp/foo", "/tmp/*"); assertMatch("/tmp/foo/bar", "/tmp/**"); // some special characters not allowed on Windows assertMatch("myfile?", "myfile\\?"); assertMatch("one\\two", "one\\\\two"); assertMatch("one*two", "one\\*two"); } // regex syntax assertRegExMatch("foo.html", ".*\\.html"); if (System.getProperty("os.name").startsWith("Windows")) { assertRegExMatch("foo012", "foo\\d+"); assertRegExMatch("fo o", "fo\\so"); assertRegExMatch("foo", "\\w+"); } // unknown syntax try { System.out.format("Test unknown syntax"); FileSystems.getDefault().getPathMatcher("grep:foo"); System.out.println(" ==> NOT EXPECTED TO COMPILE"); failures++; } catch (UnsupportedOperationException e) { System.out.println(" OKAY"); } // GLOB_SYNTAX case sensitivity of getPathMatcher: should not throw UOE Path foobar = Paths.get("/foo", "bar"); try { PathMatcher pmGlob = FileSystems.getDefault().getPathMatcher("glob:java"); pmGlob = FileSystems.getDefault().getPathMatcher("Glob:java"); pmGlob = FileSystems.getDefault().getPathMatcher("GLOB:java"); // next three lines to avoid unused variable complaints about // 'pmGlob' and any possibility of things eventually being // optimized out if (pmGlob.matches(Paths.get("/foo", "bar"))) { System.out.println("pmGlob matches foobar!"); } System.out.println("Test GLOB_SYNTAX case sensitivity OKAY"); } catch (UnsupportedOperationException e) { System.err.println("getPathMatcher GLOB_SYNTAX case sensitivity"); e.printStackTrace(); failures++; } // REGEX_SYNTAX case sensitivity of getPathMatcher: should not throw UOE try { PathMatcher pmRegex = FileSystems.getDefault().getPathMatcher("regex:java"); pmRegex = FileSystems.getDefault().getPathMatcher("Regex:java"); pmRegex = FileSystems.getDefault().getPathMatcher("RegEx:java"); pmRegex = FileSystems.getDefault().getPathMatcher("REGEX:java"); // next three lines to avoid unused variable complaints about // 'pmRegex' and any possibility of things eventually being // optimized out if (pmRegex.matches(Paths.get("/foo", "bar"))) { System.out.println("pmRegex matches foobar!"); } System.out.println("Test REGEX_SYNTAX case sensitivity OKAY"); } catch (UnsupportedOperationException e) { System.err.println("getPathMatcher REGEX_SYNTAX case sensitivity"); e.printStackTrace(); failures++; } if (failures > 0) throw new RuntimeException(failures + " sub-test(s) failed - see log for details"); } }