/* * Copyright 2013-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.cloud.netflix.zuul.filters.discovery; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.util.RequestUtils; import org.springframework.core.env.ConfigurableEnvironment; import com.netflix.zuul.context.RequestContext; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.MockitoAnnotations.initMocks; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author Spencer Gibb * @author Dave Syer */ public class DiscoveryClientRouteLocatorTests { public static final String IGNOREDSERVICE = "ignoredservice"; public static final String IGNOREDPATTERN = "/foo/**"; public static final String ASERVICE = "aservice"; public static final String MYSERVICE = "myservice"; @Mock private ConfigurableEnvironment env; @Mock private DiscoveryClient discovery; private ZuulProperties properties = new ZuulProperties(); @Data @AllArgsConstructor @NoArgsConstructor public static class RegexMapper { private boolean enabled = false; private String servicePattern = "(?<name>.*)-(?<version>v.*$)"; private String routePattern = "${version}/${name}"; } private RegexMapper regexMapper = new RegexMapper(); @Before public void init() { initMocks(this); setTestRequestcontext(); // re-initialize Zuul context for each test } @Test public void testGetMatchingPath() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("foo", route.getId()); } @Test public void testGetMatchingPathWithPrefix() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.setPrefix("/proxy"); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } @Test public void testGetMatchingPathWithServletPath() throws Exception { setTestRequestcontext(); RequestContext.getCurrentContext().set(RequestUtils.IS_DISPATCHERSERVLETREQUEST, true); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/app/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } @Test public void testGetMatchingPathWithZuulServletPath() throws Exception { RequestContext.getCurrentContext().setZuulEngineRan(); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/zuul/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } @Test public void testGetMatchingPathWithNoPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/proxy/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithLocalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/proxy/1", route.getPath()); } @Test public void testGetMatchingPathWithGlobalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithGlobalPrefixStrippingAndServletPath() throws Exception { RequestContext.getCurrentContext().set(RequestUtils.IS_DISPATCHERSERVLETREQUEST, true); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/app/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithGlobalPrefixStrippingAndZuulServletPath() throws Exception { RequestContext.getCurrentContext().setZuulEngineRan(); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/zuul/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithRoutePrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); ZuulRoute zuulRoute = new ZuulRoute("/foo/**"); zuulRoute.setStripPrefix(true); this.properties.getRoutes().put("foo", zuulRoute); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } @Test public void testGetMatchingPathWithoutMatchingIgnoredPattern() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("bar", new ZuulRoute("/bar/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/bar/1"); assertEquals("bar", route.getLocation()); assertEquals("bar", route.getId()); } @Test public void testGetMatchingPathWithMatchingIgnoredPattern() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/foo/1"); assertNull("routes did not ignore " + IGNOREDPATTERN, route); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithPrefix() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.setPrefix("/proxy"); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithServletPath() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/app/foo/1"); assertNull("routes did not ignore " + IGNOREDPATTERN, route); } @Test public void testGetMatchingPathWithoutMatchingIgnoredPatternWithNoPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/proxy/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithNoPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties .setIgnoredPatterns(Collections.singleton("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertNull("routes did not ignore " + "/proxy" + IGNOREDPATTERN, route); } @Test public void testGetMatchingPathWithoutMatchingIgnoredPatternWithLocalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/proxy/1", route.getPath()); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithLocalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties .setIgnoredPatterns(Collections.singleton("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertNull("routes did not ignore " + "/proxy" + IGNOREDPATTERN, route); } @Test public void testGetMatchingPathWithoutMatchingIgnoredPatternWithGlobalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertEquals("foo", route.getLocation()); assertEquals("/foo/1", route.getPath()); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithGlobalPrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties .setIgnoredPatterns(Collections.singleton("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null, null)); this.properties.setPrefix("/proxy"); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/proxy/foo/1"); assertNull("routes did not ignore " + "/proxy" + IGNOREDPATTERN, route); } @Test public void testGetMatchingPathWithMatchingIgnoredPatternWithRoutePrefixStripping() throws Exception { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); ZuulRoute zuulRoute = new ZuulRoute("/foo/**"); zuulRoute.setStripPrefix(true); this.properties.setIgnoredPatterns(Collections.singleton(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", zuulRoute); this.properties.init(); routeLocator.getRoutes(); // force refresh Route route = routeLocator.getMatchingRoute("/foo/1"); assertNull("routes did not ignore " + IGNOREDPATTERN, route); } @Test public void testGetRoutes() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**")); this.properties.init(); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, ASERVICE); } @Test public void testGetRoutesWithMapping() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**", ASERVICE)); this.properties.setPrefix("/foo"); List<Route> routesMap = routeLocator.getRoutes(); assertMapping(routesMap, ASERVICE, "foo/" + ASERVICE); } @Test public void testGetPhysicalRoutes() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**", "http://" + ASERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "http://" + ASERVICE, ASERVICE); } @Test public void testGetDefaultRoute() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/**", ASERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertDefaultMapping(routesMap, ASERVICE); } @Test public void testGetDefaultPhysicalRoute() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/**", "http://" + ASERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertDefaultMapping(routesMap, "http://" + ASERVICE); } @Test public void testIgnoreRoutes() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton(IGNOREDSERVICE)); given(this.discovery.getServices()) .willReturn(Collections.singletonList(IGNOREDSERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNull("routes did not ignore " + IGNOREDSERVICE, getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoreRoutesWithPattern() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("ignore*")); given(this.discovery.getServices()) .willReturn(Collections.singletonList(IGNOREDSERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNull("routes did not ignore " + IGNOREDSERVICE, getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoreAllRoutes() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("*")); given(this.discovery.getServices()) .willReturn(Collections.singletonList(IGNOREDSERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNull("routes did not ignore " + IGNOREDSERVICE, getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoredRouteIncludedIfConfiguredAndDiscovered() { this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routes ignored foo", getRoute(routesMap, "/foo/**")); } @Test public void testIgnoredRoutePropertiesRemain() { ZuulRoute route = new ZuulRoute("/foo/**"); route.setStripPrefix(true); route.setRetryable(Boolean.TRUE); this.properties.getRoutes().put("foo", route); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); LinkedHashMap<String, ZuulRoute> routes = routeLocator.locateRoutes(); ZuulRoute actual = routes.get("/foo/**"); assertNotNull("routes ignored foo", actual); assertTrue("stripPrefix is wrong", actual.isStripPrefix()); assertEquals("retryable is wrong", Boolean.TRUE, actual.getRetryable()); } @Test public void testIgnoredRouteNonServiceIdPathRemains() { // This is how you setup a route defined like zuul.proxy.route.foo=/** ZuulRoute route = new ZuulRoute("/**", "foo"); route.setId("foo"); this.properties.getRoutes().put("foo", route); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); LinkedHashMap<String, ZuulRoute> routes = routeLocator.locateRoutes(); ZuulRoute actual = routes.get("/**"); assertNotNull("routes ignored foo", actual); assertEquals("id is wrong", "foo", actual.getId()); assertEquals("location is wrong", "foo", actual.getServiceId()); assertEquals("path is wrong", "/**", actual.getPath()); } @Test public void testIgnoredRouteIncludedIfConfiguredAndNotDiscovered() { this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "http://foo.com")); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singleton("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("bar")); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routes ignored foo", getRoute(routesMap, getMapping("foo"))); } @Test public void testAutoRoutes() { DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); } @Test public void testAutoRoutesCanBeOverridden() { ZuulRoute route = new ZuulRoute("/" + MYSERVICE + "/**", "http://example.com/" + MYSERVICE); this.properties.getRoutes().put(MYSERVICE, route); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "http://example.com/" + MYSERVICE, MYSERVICE); } @Test public void testIgnoredLocalServiceByDefault() { given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); given(this.discovery.getLocalServiceInstance()).willReturn( new DefaultServiceInstance(MYSERVICE, "localhost", 80, false)); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); LinkedHashMap<String, ZuulRoute> routes = routeLocator.locateRoutes(); ZuulRoute actual = routes.get("/**"); assertNull("routes didn't ignore " + MYSERVICE, actual); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertTrue("routesMap was empty", routesMap.isEmpty()); } @Test public void testIgnoredLocalServiceFalse() { this.properties.setIgnoreLocalService(false); given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); } @Test public void testLocalServiceExceptionIgnored() { given(this.discovery.getServices()) .willReturn(Collections.<String>emptyList()); given(this.discovery.getLocalServiceInstance()).willThrow(new RuntimeException()); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties); // if no exception is thrown in constructor, this is a success routeLocator.locateRoutes(); } @Test public void testRegExServiceRouteMapperNoServiceIdMatches() { given(this.discovery.getServices()) .willReturn(Collections.singletonList(MYSERVICE)); PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper( this.regexMapper.getServicePattern(), this.regexMapper.getRoutePattern()); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties, regExServiceRouteMapper); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); } @Test public void testRegExServiceRouteMapperServiceIdMatches() { given(this.discovery.getServices()) .willReturn(Collections.singletonList("rest-service-v1")); PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper( this.regexMapper.getServicePattern(), this.regexMapper.getRoutePattern()); DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, this.properties, regExServiceRouteMapper); List<Route> routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "rest-service-v1", "v1/rest-service"); } protected void assertMapping(List<Route> routesMap, String serviceId) { assertMapping(routesMap, serviceId, serviceId); } protected void assertMapping(List<Route> routesMap, String expectedRoute, String key) { String mapping = getMapping(key); Route route = getRoute(routesMap, mapping); assertNotNull("Could not find route for " + key, route); String location = route.getLocation(); assertEquals("routesMap had wrong value for " + mapping, expectedRoute, location); } private String getMapping(String serviceId) { return "/" + serviceId + "/**"; } protected void assertDefaultMapping(List<Route> routesMap, String expectedRoute) { String mapping = "/**"; String route = getRoute(routesMap, mapping).getLocation(); assertEquals("routesMap had wrong value for " + mapping, expectedRoute, route); } private Route getRoute(List<Route> routes, String path) { for (Route route : routes) { String pattern = route.getFullPath(); if (path.equals(pattern)) { return route; } } return null; } private void setTestRequestcontext() { RequestContext context = new RequestContext(); RequestContext.testSetCurrentContext(context); } }