From 123327bfd29f8c8e4c6a0e557a6c595d50c2f1e5 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 27 Apr 2018 16:14:09 -0400 Subject: [PATCH] Moves GatewaySampleApplicationTests to use local httpbin --- spring-cloud-gateway-core/pom.xml | 12 +++++ spring-cloud-gateway-sample/pom.xml | 11 +++++ .../sample/GatewaySampleApplication.java | 28 +++++++----- .../cloud/gateway/sample/AdditionalRoutes.kt | 7 ++- .../src/main/resources/application.yml | 8 +++- .../sample/GatewaySampleApplicationTests.java | 45 +++++++++++++++++-- 6 files changed, 94 insertions(+), 17 deletions(-) diff --git a/spring-cloud-gateway-core/pom.xml b/spring-cloud-gateway-core/pom.xml index 498719a1..5a54c11f 100644 --- a/spring-cloud-gateway-core/pom.xml +++ b/spring-cloud-gateway-core/pom.xml @@ -179,6 +179,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + 3.1.0 + + + + test-jar + + + + diff --git a/spring-cloud-gateway-sample/pom.xml b/spring-cloud-gateway-sample/pom.xml index 5d634759..a0ae9675 100644 --- a/spring-cloud-gateway-sample/pom.xml +++ b/spring-cloud-gateway-sample/pom.xml @@ -33,11 +33,22 @@ org.springframework.cloud spring-cloud-starter-gateway + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + org.isomorphism token-bucket 1.7 + + org.springframework.cloud + spring-cloud-gateway-core + ${project.version} + test-jar + test + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java index 2b89e04e..99bb5c95 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java @@ -42,7 +42,7 @@ import org.springframework.web.reactive.function.server.ServerResponse; @Import(AdditionalRoutes.class) public class GatewaySampleApplication { - @Value("${route.uri:http://httpbin.org:80}") + @Value("${test.uri:http://httpbin.org:80}") String uri; @Bean @@ -51,20 +51,23 @@ public class GatewaySampleApplication { // String uri = "http://httpbin.org:80"; // String uri = "http://localhost:9080"; return builder.routes() - .route(r -> r.host("**.abc.org").and().path("/image/png") + .route(r -> r.host("**.abc.org").and().path("/anything/png") .filters(f -> - f.addResponseHeader("X-TestHeader", "foobar")) + f.prefixPath("/httpbin") + .addResponseHeader("X-TestHeader", "foobar")) .uri(uri) ) .route("read_body_pred", r -> r.host("*.readbody.org") .and().readBody(String.class, s -> s.trim().equalsIgnoreCase("hello")) .filters(f -> - f.addRequestHeader("X-TestHeader", "read_body_pred") + f.prefixPath("/httpbin") + .addRequestHeader("X-TestHeader", "read_body_pred") ).uri(uri) ) .route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org") - .filters(f -> f.addRequestHeader("X-TestHeader", "rewrite_request") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-TestHeader", "rewrite_request") .modifyRequestBody(String.class, Hello.class, (exchange, s) -> { return new Hello(s.toUpperCase()); @@ -72,7 +75,8 @@ public class GatewaySampleApplication { ).uri(uri) ) .route("rewrite_request_upper", r -> r.host("*.rewriterequestupper.org") - .filters(f -> f.addRequestHeader("X-TestHeader", "rewrite_request_upper") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-TestHeader", "rewrite_request_upper") .modifyRequestBody(String.class, String.class, (exchange, s) -> { return s.toUpperCase(); @@ -80,7 +84,8 @@ public class GatewaySampleApplication { ).uri(uri) ) .route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org") - .filters(f -> f.addRequestHeader("X-TestHeader", "rewrite_response_upper") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-TestHeader", "rewrite_response_upper") .modifyResponseBody(String.class, String.class, (exchange, s) -> { return s.toUpperCase(); @@ -88,7 +93,8 @@ public class GatewaySampleApplication { ).uri(uri) ) .route("rewrite_response_obj", r -> r.host("*.rewriteresponseobj.org") - .filters(f -> f.addRequestHeader("X-TestHeader", "rewrite_response_obj") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-TestHeader", "rewrite_response_obj") .modifyResponseBody(Map.class, String.class, (exchange, map) -> { Object data = map.get("data"); @@ -98,12 +104,14 @@ public class GatewaySampleApplication { ) .route(r -> r.path("/image/webp") .filters(f -> - f.addResponseHeader("X-AnotherHeader", "baz")) + f.prefixPath("/httpbin") + .addResponseHeader("X-AnotherHeader", "baz")) .uri(uri) ) .route(r -> r.order(-1) .host("**.throttle.org").and().path("/get") - .filters(f -> f.filter(new ThrottleGatewayFilter() + .filters(f -> f.prefixPath("/httpbin") + .filter(new ThrottleGatewayFilter() .setCapacity(1) .setRefillTokens(1) .setRefillPeriod(10) diff --git a/spring-cloud-gateway-sample/src/main/kotlin/org/springframework/cloud/gateway/sample/AdditionalRoutes.kt b/spring-cloud-gateway-sample/src/main/kotlin/org/springframework/cloud/gateway/sample/AdditionalRoutes.kt index e24f4715..c6107205 100644 --- a/spring-cloud-gateway-sample/src/main/kotlin/org/springframework/cloud/gateway/sample/AdditionalRoutes.kt +++ b/spring-cloud-gateway-sample/src/main/kotlin/org/springframework/cloud/gateway/sample/AdditionalRoutes.kt @@ -1,5 +1,6 @@ package org.springframework.cloud.gateway.sample +import org.springframework.beans.factory.annotation.Value import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder import org.springframework.cloud.gateway.route.builder.filters import org.springframework.cloud.gateway.route.builder.routes @@ -9,14 +10,18 @@ import org.springframework.context.annotation.Configuration @Configuration open class AdditionalRoutes { + @Value("\${test.uri:http://httpbin.org:80}") + var uri: String? = null + @Bean open fun additionalRouteLocator(builder: RouteLocatorBuilder) = builder.routes { route(id = "test-kotlin") { host("kotlin.abc.org") and path("/image/png") filters { + prefixPath("/httpbin") addResponseHeader("X-TestHeader", "foobar") } - uri("http://httpbin.org:80") + uri(uri) } } diff --git a/spring-cloud-gateway-sample/src/main/resources/application.yml b/spring-cloud-gateway-sample/src/main/resources/application.yml index cb00d792..f354e9d6 100644 --- a/spring-cloud-gateway-sample/src/main/resources/application.yml +++ b/spring-cloud-gateway-sample/src/main/resources/application.yml @@ -1,13 +1,17 @@ test: - hostport: httpbin.org:80 +# hostport: httpbin.org:80 # hostport: localhost:5000 - uri: http://${test.hostport} +# uri: http://${test.hostport} + uri: lb://httpbin spring: + jmx: + enabled: false cloud: gateway: default-filters: + - PrefixPath=/httpbin - AddResponseHeader=X-Response-Default-Foo, Default-Bar routes: diff --git a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java index 24e71dac..651740eb 100644 --- a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java +++ b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java @@ -17,26 +17,38 @@ package org.springframework.cloud.gateway.sample; +import java.time.Duration; + +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.cloud.gateway.test.HttpBinCompatibleController; +import org.springframework.cloud.netflix.ribbon.RibbonClient; +import org.springframework.cloud.netflix.ribbon.StaticServerList; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.util.SocketUtils; -import java.time.Duration; - import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** * @author Spencer Gibb */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = GatewaySampleApplication.class, webEnvironment = RANDOM_PORT) +@SpringBootTest(classes = { GatewaySampleApplicationTests.TestConfig.class}, + webEnvironment = RANDOM_PORT) public class GatewaySampleApplicationTests { @LocalServerPort @@ -50,6 +62,7 @@ public class GatewaySampleApplicationTests { @BeforeClass public static void beforeClass() { managementPort = SocketUtils.findAvailableTcpPort(); + System.setProperty("management.server.port", String.valueOf(managementPort)); } @@ -75,7 +88,7 @@ public class GatewaySampleApplicationTests { @Test public void complexPredicate() { webClient.get() - .uri("/image/png") + .uri("/anything/png") .header("Host", "www.abc.org") .exchange() .expectHeader().valueEquals("X-TestHeader", "foobar") @@ -90,4 +103,28 @@ public class GatewaySampleApplicationTests { .exchange() .expectStatus().isOk(); } + + @Configuration + @EnableAutoConfiguration + @RibbonClient(name = "httpbin", configuration = RibbonConfig.class) + @Import(GatewaySampleApplication.class) + protected static class TestConfig { + @Bean + public HttpBinCompatibleController httpBinCompatibleController() { + return new HttpBinCompatibleController(); + } + + } + + protected static class RibbonConfig { + @LocalServerPort + int port; + + @Bean + @Primary + public ServerList ribbonServerList() { + return new StaticServerList<>(new Server("localhost", port)); + } + } + }