diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml
index 3f537921d..99eeb59bc 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml
@@ -86,5 +86,29 @@
spring-boot-starter-test
test
+
+
+ com.tencent.polaris
+ polaris-test-common
+ test
+
+
+
+ com.tencent.polaris
+ polaris-test-mock-discovery
+ test
+
+
+
+ org.mockito
+ mockito-inline
+ test
+
+
+
+ io.projectreactor
+ reactor-test
+ test
+
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
index f1dcf17a7..a35694c2b 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfigurationTest.java
@@ -17,13 +17,18 @@
package com.tencent.cloud.polaris.circuitbreaker.config;
+import com.tencent.cloud.polaris.circuitbreaker.common.CircuitBreakerConfigModifier;
import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
+import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
+import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
+import org.springframework.cloud.openfeign.CircuitBreakerNameResolver;
import static org.assertj.core.api.Assertions.assertThat;
@@ -38,15 +43,39 @@ public class PolarisCircuitBreakerAutoConfigurationTest {
PolarisContextAutoConfiguration.class,
RpcEnhancementAutoConfiguration.class,
LoadBalancerAutoConfiguration.class,
- RpcEnhancementAutoConfiguration.class,
+ PolarisCircuitBreakerFeignClientAutoConfiguration.class,
PolarisCircuitBreakerAutoConfiguration.class))
.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
+ private final ApplicationContextRunner reactiveContextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
+ RpcEnhancementAutoConfiguration.class,
+ LoadBalancerAutoConfiguration.class,
+ ReactivePolarisCircuitBreakerAutoConfiguration.class))
+ .withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
+
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> {
- assertThat(context).hasSingleBean(
- PolarisCircuitBreakerAutoConfiguration.CircuitBreakerConfigModifier.class);
+ assertThat(context).hasSingleBean(PolarisCircuitBreakerAutoConfiguration.class);
+ assertThat(context).hasSingleBean(CircuitBreakerFactory.class);
+ assertThat(context).hasSingleBean(CircuitBreakerConfigModifier.class);
+ assertThat(context).hasSingleBean(CircuitBreakAPI.class);
+ assertThat(context).hasSingleBean(CircuitBreakerNameResolver.class);
});
}
+
+ @Test
+ public void testReactiveInitialization() {
+ this.reactiveContextRunner.run(context -> {
+ assertThat(context).hasSingleBean(ReactivePolarisCircuitBreakerAutoConfiguration.class);
+ assertThat(context).hasSingleBean(ReactiveCircuitBreakerFactory.class);
+ assertThat(context).hasSingleBean(CircuitBreakerConfigModifier.class);
+ assertThat(context).hasSingleBean(CircuitBreakAPI.class);
+ });
+ }
+
+
+
}
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
index 9213272cd..653ba8ffe 100644
--- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerBootstrapConfigurationTest.java
@@ -34,10 +34,10 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
public class PolarisCircuitBreakerBootstrapConfigurationTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(PolarisContextAutoConfiguration.class,
+ .withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
RpcEnhancementAutoConfiguration.class,
LoadBalancerAutoConfiguration.class,
- RpcEnhancementAutoConfiguration.class,
PolarisCircuitBreakerBootstrapConfiguration.class))
.withPropertyValues("spring.cloud.polaris.enabled=true")
.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
@@ -45,8 +45,9 @@ public class PolarisCircuitBreakerBootstrapConfigurationTest {
@Test
public void testDefaultInitialization() {
this.contextRunner.run(context -> {
- assertThat(context).hasSingleBean(
- PolarisCircuitBreakerAutoConfiguration.CircuitBreakerConfigModifier.class);
+ assertThat(context).hasSingleBean(PolarisCircuitBreakerAutoConfiguration.class);
+ assertThat(context).hasSingleBean(PolarisCircuitBreakerFeignClientAutoConfiguration.class);
+ assertThat(context).hasSingleBean(ReactivePolarisCircuitBreakerAutoConfiguration.class);
});
}
}
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerTest.java
new file mode 100644
index 000000000..31fa3c38e
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * 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 com.tencent.cloud.polaris.circuitbreaker.config;
+
+
+import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
+import com.tencent.cloud.polaris.circuitbreaker.PolarisCircuitBreaker;
+import com.tencent.cloud.polaris.circuitbreaker.PolarisCircuitBreakerFactory;
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
+
+import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
+import static com.tencent.polaris.test.common.Consts.SERVICE_CIRCUIT_BREAKER;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Test for {@link PolarisCircuitBreaker}.
+ *
+ * @author sean yu
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class PolarisCircuitBreakerTest {
+
+ private static ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
+ RpcEnhancementAutoConfiguration.class,
+ LoadBalancerAutoConfiguration.class,
+ PolarisCircuitBreakerFeignClientAutoConfiguration.class,
+ PolarisCircuitBreakerAutoConfiguration.class))
+ .withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
+
+ private static MockedStatic mockedApplicationContextAwareUtils;
+
+ @BeforeClass
+ public static void beforeClass() {
+ mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
+ mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.namespace"))
+ .thenReturn(NAMESPACE_TEST);
+ mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.service"))
+ .thenReturn(SERVICE_CIRCUIT_BREAKER);
+ }
+
+ @After
+ public void after() {
+ mockedApplicationContextAwareUtils.close();
+ }
+
+ @Test
+ public void run() {
+ this.contextRunner.run(context -> {
+ PolarisCircuitBreakerFactory polarisCircuitBreakerFactory = context.getBean(PolarisCircuitBreakerFactory.class);
+ CircuitBreaker cb = polarisCircuitBreakerFactory.create(SERVICE_CIRCUIT_BREAKER);
+
+ assertThat(cb.run(() -> "foobar")).isEqualTo("foobar");
+
+ assertThat((String) cb.run(() -> {
+ throw new RuntimeException("boom");
+ }, t -> "fallback")).isEqualTo("fallback");
+
+ });
+ }
+
+
+
+
+}
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerTest.java
new file mode 100644
index 000000000..5021bf016
--- /dev/null
+++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/ReactivePolarisCircuitBreakerTest.java
@@ -0,0 +1,99 @@
+/*
+ * Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
+ *
+ * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
+ *
+ * Licensed under the BSD 3-Clause License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/BSD-3-Clause
+ *
+ * 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 com.tencent.cloud.polaris.circuitbreaker.config;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
+import com.tencent.cloud.polaris.circuitbreaker.PolarisCircuitBreaker;
+import com.tencent.cloud.polaris.circuitbreaker.ReactivePolarisCircuitBreaker;
+import com.tencent.cloud.polaris.circuitbreaker.ReactivePolarisCircuitBreakerFactory;
+import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration;
+import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration;
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreaker;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration;
+
+import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST;
+import static com.tencent.polaris.test.common.Consts.SERVICE_CIRCUIT_BREAKER;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Test for {@link ReactivePolarisCircuitBreaker}.
+ *
+ * @author sean yu
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ReactivePolarisCircuitBreakerTest {
+
+ private final ApplicationContextRunner reactiveContextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(
+ PolarisContextAutoConfiguration.class,
+ RpcEnhancementAutoConfiguration.class,
+ LoadBalancerAutoConfiguration.class,
+ ReactivePolarisCircuitBreakerAutoConfiguration.class))
+ .withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true");
+
+ private static MockedStatic mockedApplicationContextAwareUtils;
+
+ @BeforeClass
+ public static void beforeClass() {
+ mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
+ mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.namespace"))
+ .thenReturn(NAMESPACE_TEST);
+ mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties("spring.cloud.polaris.service"))
+ .thenReturn(SERVICE_CIRCUIT_BREAKER);
+ }
+
+ @After
+ public void after() {
+ mockedApplicationContextAwareUtils.close();
+ }
+
+ @Test
+ public void run() {
+ this.reactiveContextRunner.run(context -> {
+ ReactivePolarisCircuitBreakerFactory polarisCircuitBreakerFactory = context.getBean(ReactivePolarisCircuitBreakerFactory.class);
+ ReactiveCircuitBreaker cb = polarisCircuitBreakerFactory.create(SERVICE_CIRCUIT_BREAKER);
+
+ assertThat(Mono.just("foobar").transform(cb::run).block()).isEqualTo("foobar");
+
+ assertThat(Mono.error(new RuntimeException("boom")).transform(it -> cb.run(it, t -> Mono.just("fallback")))
+ .block()).isEqualTo("fallback");
+
+ assertThat(Flux.just("foobar", "hello world").transform(cb::run).collectList().block())
+ .isEqualTo(Arrays.asList("foobar", "hello world"));
+
+ assertThat(Flux.error(new RuntimeException("boom")).transform(it -> cb.run(it, t -> Flux.just("fallback")))
+ .collectList().block()).isEqualTo(Collections.singletonList("fallback"));
+ });
+ }
+
+}