package test.http.router; import com.firefly.server.http2.router.Matcher; import com.firefly.server.http2.router.Router; import com.firefly.server.http2.router.RouterManager; import com.firefly.server.http2.router.impl.RouterManagerImpl; import org.junit.Assert; import org.junit.Test; import java.util.NavigableSet; import static org.hamcrest.Matchers.*; /** * @author Pengtao Qiu */ public class TestMatcher { @Test public void testFindRouter() { RouterManager routerManager = new RouterManagerImpl(); Router router0 = routerManager.register() .get("/hello/get") .produces("application/json"); Router router1 = routerManager.register() .get("/hello/:testParam0") .produces("application/json"); Router router2 = routerManager.register() .get("/hello/:testParam1") .produces("application/json"); Router router3 = routerManager.register() .post("/book/update/:id") .consumes("*/json"); Router router4 = routerManager.register() .post("/book/update/:id") .consumes("application/json"); NavigableSet<RouterManager.RouterMatchResult> result = routerManager.findRouter("GET", "/hello/get", null, "application/json,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.size(), is(3)); Assert.assertThat(result.first().getRouter(), is(router0)); Assert.assertThat(result.lower(result.last()).getRouter(), is(router1)); Assert.assertThat(result.last().getRouter(), is(router2)); Assert.assertThat(result.last().getParameters().get("testParam1"), is("get")); result = routerManager.findRouter("GET", "/hello/get", null, "application/*,*/*;q=0.8"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.size(), is(3)); Assert.assertThat(result.first().getRouter(), is(router0)); Assert.assertThat(result.lower(result.last()).getRouter(), is(router1)); Assert.assertThat(result.last().getRouter(), is(router2)); Assert.assertThat(result.last().getParameters().get("testParam1"), is("get")); result = routerManager.findRouter("GET", "/hello/get", null, "*/json,*/*;q=0.8"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.size(), is(3)); Assert.assertThat(result.first().getRouter(), is(router0)); Assert.assertThat(result.lower(result.last()).getRouter(), is(router1)); Assert.assertThat(result.last().getRouter(), is(router2)); Assert.assertThat(result.last().getParameters().get("testParam1"), is("get")); result = routerManager.findRouter("GET", "/hello/get", null, "*/*"); Assert.assertThat(result, empty()); result = routerManager.findRouter("GET", "/hello/get", null, null); Assert.assertThat(result, empty()); result = routerManager.findRouter("POST", "/book/update/3", null, null); Assert.assertThat(result, empty()); result = routerManager.findRouter("POST", "/book/update/3", "application/json;charset=UTF-8", null); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.size(), is(2)); Assert.assertThat(result.first().getRouter(), is(router3)); Assert.assertThat(result.last().getRouter(), is(router4)); Assert.assertThat(result.last().getParameters().get("id"), is("3")); Assert.assertThat(result.first().getParameters().get("param0"), is("application")); } @Test public void testMIMETypeMatcher() { RouterManagerImpl routerManager = new RouterManagerImpl(); Router router0 = routerManager.register().consumes("text/html"); Router router1 = routerManager.register().consumes("*/json"); Matcher.MatchResult result = routerManager.getContentTypePreciseMatcher().match("text/html"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router0), is(true)); result = routerManager.getContentTypePatternMatcher().match("application/json"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router1), is(true)); Assert.assertThat(result.getParameters().get(router1).get("param0"), is("application")); } @Test public void testMethodMatcher() { RouterManagerImpl routerManager = new RouterManagerImpl(); Router router0 = routerManager.register().post("/food/update"); Matcher.MatchResult result = routerManager.getHttpMethodMatcher().match("POST"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router0), is(true)); result = routerManager.getPrecisePathMather().match("/food/update"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router0), is(true)); result = routerManager.getHttpMethodMatcher().match("GET"); Assert.assertThat(result, nullValue()); } @Test public void testPathMatcher() { RouterManagerImpl routerManager = new RouterManagerImpl(); Router router0 = routerManager.register().path("/hello/foo"); Router router1 = routerManager.register().path("/"); Router router2 = routerManager.register().path("/hello*"); Router router3 = routerManager.register().path("*"); Router router4 = routerManager.register().path("/*"); Router router5 = routerManager.register().path("/he*/*"); Router router6 = routerManager.register().path("/hello/:foo"); Router router7 = routerManager.register().path("/:hello/:foo/"); Router router8 = routerManager.register().path("/hello/:foo/:bar"); Router router9 = routerManager.register().pathRegex("/hello(\\d*)"); Matcher.MatchResult result = routerManager.getPrecisePathMather().match("/hello/foo"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router0), is(true)); result = routerManager.getPrecisePathMather().match("/"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router1), is(true)); result = routerManager.getPatternPathMatcher().match("/hello/foo"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(4)); Assert.assertThat(result.getRouters().contains(router2), is(true)); Assert.assertThat(result.getParameters().get(router2).get("param0"), is("/foo")); Assert.assertThat(result.getRouters().contains(router3), is(true)); Assert.assertThat(result.getParameters().get(router3).get("param0"), is("/hello/foo")); Assert.assertThat(result.getRouters().contains(router4), is(true)); Assert.assertThat(result.getParameters().get(router4).get("param0"), is("hello/foo")); Assert.assertThat(result.getRouters().contains(router5), is(true)); Assert.assertThat(result.getParameters().get(router5).get("param0"), is("llo")); Assert.assertThat(result.getParameters().get(router5).get("param1"), is("foo")); result = routerManager.getParameterPathMatcher().match("/hello/foooo"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(2)); Assert.assertThat(result.getRouters().contains(router6), is(true)); Assert.assertThat(result.getRouters().contains(router7), is(true)); Assert.assertThat(result.getParameters().get(router6).get("foo"), is("foooo")); Assert.assertThat(result.getParameters().get(router7).get("foo"), is("foooo")); Assert.assertThat(result.getParameters().get(router7).get("hello"), is("hello")); result = routerManager.getParameterPathMatcher().match("/"); Assert.assertThat(result, nullValue()); result = routerManager.getParameterPathMatcher().match("/hello/11/2333"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router8), is(true)); result = routerManager.getRegexPathMatcher().match("/hello113"); Assert.assertThat(result, notNullValue()); Assert.assertThat(result.getRouters().size(), is(1)); Assert.assertThat(result.getRouters().contains(router9), is(true)); Assert.assertThat(result.getParameters().get(router9).get("group1"), is("113")); } }