pull/881/head
seanyu 3 years ago
parent a0d10a527f
commit 22a371c516

@ -88,6 +88,12 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>com.tencent.polaris</groupId> <groupId>com.tencent.polaris</groupId>
<artifactId>polaris-test-common</artifactId> <artifactId>polaris-test-common</artifactId>

@ -18,23 +18,38 @@
package com.tencent.cloud.polaris.circuitbreaker; package com.tencent.cloud.polaris.circuitbreaker;
import java.util.HashSet;
import java.util.Set;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext; import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author sean yu
*/
@ExtendWith(SpringExtension.class) @ExtendWith(SpringExtension.class)
@SpringBootTest( @SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
@ -42,21 +57,36 @@ import org.springframework.web.bind.annotation.RestController;
"spring.cloud.gateway.enabled=true", "spring.cloud.gateway.enabled=true",
"spring.cloud.polaris.namespace=default", "spring.cloud.polaris.namespace=default",
"spring.cloud.polaris.service=Test", "spring.cloud.polaris.service=Test",
"spring.main.web-application-type=reactive" "spring.main.web-application-type=reactive",
"httpbin=http://localhost:${wiremock.server.port}"
}, },
classes = PolarisCircuitBreakerGatewayIntegrationTest.TestApplication.class classes = PolarisCircuitBreakerGatewayIntegrationTest.TestApplication.class
) )
@AutoConfigureWireMock(port = 0)
@ActiveProfiles("test-gateway") @ActiveProfiles("test-gateway")
@AutoConfigureWebTestClient(timeout = "10000")
public class PolarisCircuitBreakerGatewayIntegrationTest { public class PolarisCircuitBreakerGatewayIntegrationTest {
@Autowired @Autowired
private ApplicationContext context; private WebTestClient webClient;
@Test @Test
public void contextLoads() throws Exception { public void fallback() throws Exception {
WebTestClient client = WebTestClient.bindToApplicationContext(this.context)
.build(); stubFor(get(urlEqualTo("/err"))
client.get().uri("/hello/1").exchange().expectStatus().isOk(); .willReturn(aResponse()
.withStatus(500)
.withBody("err")
.withFixedDelay(3000)));
webClient
.get().uri("/err")
.header("Host", "www.circuitbreaker.com")
.exchange()
.expectStatus().isOk()
.expectBody()
.consumeWith(
response -> assertThat(response.getResponseBody()).isEqualTo("fallback".getBytes()));
} }
@ -64,14 +94,30 @@ public class PolarisCircuitBreakerGatewayIntegrationTest {
@EnableAutoConfiguration @EnableAutoConfiguration
public static class TestApplication { public static class TestApplication {
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
String httpUri = "http://httpbin.org:80";
Set<String> codeSets = new HashSet<>();
codeSets.add("4**");
codeSets.add("5**");
return builder.routes()
.route(p -> p
.host("*.circuitbreaker.com")
.filters(f -> f
.circuitBreaker(config -> config
.setStatusCodes(codeSets)
.setFallbackUri("forward:/fallback")
))
.uri(httpUri))
.build();
}
@RestController @RestController
static class Controller { static class Controller {
@RequestMapping("/fallback")
@GetMapping("/hello/{id}") public Mono<String> fallback() {
public Mono<String> hello(@PathVariable Integer id) { return Mono.just("fallback");
return Mono.just("hello" + id);
} }
} }
} }

Loading…
Cancel
Save