package io.undertow.util; import io.undertow.testutils.category.UnitTest; import org.junit.Assert; import org.junit.Test; import org.junit.experimental.categories.Category; /** * Test the path matcher to ensure that it can handle different cases and * protect against common user mistakes either by throwing the proper exception * or by fixing them * * @author Chris Ruffalo * */ @Category(UnitTest.class) public class PathMatcherTestCase { /** * Test simple case with adding a prefix * */ @Test public void testSimplePrefixCase() { PathMatcher<String> pathMatcher = new PathMatcher<>(); pathMatcher.addPrefixPath("prefix", "response"); Assert.assertEquals("response", pathMatcher.getPrefixPath("prefix")); Assert.assertEquals("response", pathMatcher.getPrefixPath("/prefix")); Assert.assertEquals("response", pathMatcher.getPrefixPath("/prefix/")); pathMatcher.addPrefixPath("/prefix", "new response"); Assert.assertEquals("new response", pathMatcher.getPrefixPath("prefix")); Assert.assertEquals("new response", pathMatcher.getPrefixPath("/prefix")); Assert.assertEquals("new response", pathMatcher.getPrefixPath("/prefix/")); pathMatcher.addPrefixPath("/prefix/", "different response"); Assert.assertEquals("different response", pathMatcher.getPrefixPath("prefix")); Assert.assertEquals("different response", pathMatcher.getPrefixPath("/prefix")); Assert.assertEquals("different response", pathMatcher.getPrefixPath("/prefix/")); pathMatcher.addPrefixPath("/prefix//////////////////////", "last response"); Assert.assertEquals("last response", pathMatcher.getPrefixPath("prefix")); Assert.assertEquals("last response", pathMatcher.getPrefixPath("/prefix")); Assert.assertEquals("last response", pathMatcher.getPrefixPath("/prefix/")); pathMatcher.clearPaths(); Assert.assertNull(pathMatcher.getPrefixPath("prefix")); Assert.assertNull(pathMatcher.getPrefixPath("/prefix")); Assert.assertNull(pathMatcher.getPrefixPath("/prefix/")); } /** * Test simple case with adding a prefix and getting default matches * */ @Test public void testSimpleMatchCase() { PathMatcher<String> pathMatcher = new PathMatcher<>(); pathMatcher.addPrefixPath("prefix", "response"); Assert.assertEquals("response", pathMatcher.match("/prefix").getValue()); Assert.assertEquals("response", pathMatcher.match("/prefix/").getValue()); pathMatcher.addPrefixPath("/prefix", "new response"); Assert.assertEquals("new response", pathMatcher.match("/prefix").getValue()); Assert.assertEquals("new response", pathMatcher.match("/prefix/").getValue()); pathMatcher.addPrefixPath("/prefix/", "different response"); Assert.assertEquals("different response", pathMatcher.match("/prefix").getValue()); Assert.assertEquals("different response", pathMatcher.match("/prefix/").getValue()); pathMatcher.addPrefixPath("/prefix//////////////////////", "last response"); Assert.assertEquals("last response", pathMatcher.match("/prefix").getValue()); Assert.assertEquals("last response", pathMatcher.match("/prefix/").getValue()); pathMatcher.clearPaths(); Assert.assertNull(pathMatcher.match("/prefix").getValue()); Assert.assertNull(pathMatcher.match("/prefix/").getValue()); } /** * Test cases around default matches * */ @Test public void testSimpleDefaultCase() { PathMatcher<String> pathMatcher = new PathMatcher<>(); pathMatcher.addPrefixPath("/", "default"); Assert.assertEquals("default", pathMatcher.getPrefixPath("/")); Assert.assertEquals("default", pathMatcher.match("/").getValue()); pathMatcher.addPrefixPath("//////", "needs normalize default"); Assert.assertEquals("needs normalize default", pathMatcher.getPrefixPath("/")); Assert.assertEquals("needs normalize default", pathMatcher.match("/").getValue()); pathMatcher.clearPaths(); Assert.assertNull(pathMatcher.getPrefixPath("/")); } /** * Test case based on value falling through to default value/handler * */ @Test public void testDefaultFallthrough() { PathMatcher<String> pathMatcher = new PathMatcher<>("default"); // check defaults Assert.assertEquals("default", pathMatcher.getPrefixPath("/")); Assert.assertEquals("default", pathMatcher.match("/").getValue()); // add a few items pathMatcher.addPrefixPath("/test1", "test1"); pathMatcher.addPrefixPath("/test2", "test2"); pathMatcher.addPrefixPath("/test3", "test3"); pathMatcher.addPrefixPath("/test4", "test4"); // check matching with no matches Assert.assertEquals("default", pathMatcher.match("/adsfasdfdsaf").getValue()); Assert.assertEquals("default", pathMatcher.match("/ ").getValue()); Assert.assertEquals("default", pathMatcher.match("/drooadfas").getValue()); Assert.assertEquals("default", pathMatcher.match("/thing/thing").getValue()); Assert.assertEquals("default", pathMatcher.match("").getValue()); // check that matching actual matches still works Assert.assertEquals("test1", pathMatcher.match("/test1").getValue()); Assert.assertEquals("test2", pathMatcher.match("/test2").getValue()); Assert.assertEquals("test3", pathMatcher.match("/test3").getValue()); Assert.assertEquals("test4", pathMatcher.match("/test4").getValue()); } }