diff --git a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java index 26f11725f..8eb259aa7 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java +++ b/spring-cloud-tencent-rpc-enhancement/src/main/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapter.java @@ -186,7 +186,7 @@ public abstract class AbstractPolarisReporterAdapter { * @param httpStatus request http status code * @return true , otherwise return false . */ - private boolean apply(@Nullable HttpStatus httpStatus) { + protected boolean apply(@Nullable HttpStatus httpStatus) { if (Objects.isNull(httpStatus)) { return false; } @@ -221,7 +221,7 @@ public abstract class AbstractPolarisReporterAdapter { return false; } - private RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) { + protected RetStatus getRetStatusFromRequest(HttpHeaders headers, RetStatus defaultVal) { if (headers != null && headers.containsKey(HeaderConstant.INTERNAL_CALLEE_RET_STATUS)) { List values = headers.get(HeaderConstant.INTERNAL_CALLEE_RET_STATUS); if (CollectionUtils.isNotEmpty(values)) { @@ -237,7 +237,7 @@ public abstract class AbstractPolarisReporterAdapter { return defaultVal; } - private String getActiveRuleNameFromRequest(HttpHeaders headers) { + protected String getActiveRuleNameFromRequest(HttpHeaders headers) { if (headers != null && headers.containsKey(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME)) { Collection values = headers.get(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME); if (CollectionUtils.isNotEmpty(values)) { diff --git a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java index 4b04d9634..be2005317 100644 --- a/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java +++ b/spring-cloud-tencent-rpc-enhancement/src/test/java/com/tencent/cloud/rpc/enhancement/AbstractPolarisReporterAdapterTest.java @@ -1,162 +1,322 @@ -///* -// * 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.rpc.enhancement; -// -//import com.tencent.cloud.common.constant.HeaderConstant; -//import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; -//import com.tencent.polaris.api.pojo.RetStatus; -//import org.assertj.core.api.Assertions; -//import org.junit.jupiter.api.Test; -// -//import org.springframework.http.HttpHeaders; -//import org.springframework.http.HttpStatus; -// -///** -// * Test For {@link AbstractPolarisReporterAdapter}. -// * -// * @author Elve.Xu 2022/7/11 -// */ -//public class AbstractPolarisReporterAdapterTest { -// -// @Test -// public void testApplyWithDefaultConfig() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// // Assert -// Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); -// } -// -// @Test -// public void testApplyWithoutIgnoreInternalServerError() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.setIgnoreInternalServerError(false); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// // Assert -// Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(true); -// Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); -// } -// -// @Test -// public void testApplyWithIgnoreInternalServerError() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.setIgnoreInternalServerError(true); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// // Assert -// Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); -// } -// -// @Test -// public void testApplyWithoutSeries() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.getSeries().clear(); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// // Assert -// Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); -// } -// -// @Test -// public void testApplyWithSeries() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.getSeries().clear(); -// properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// // Assert -// Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); -// Assertions.assertThat(adapter.apply(HttpStatus.FORBIDDEN)).isEqualTo(true); -// } -// -// -// @Test -// public void testGetRetStatusFromRequest() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.getSeries().clear(); -// properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// HttpHeaders headers = new HttpHeaders(); -// RetStatus ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); -// Assertions.assertThat(ret).isEqualTo(RetStatus.RetFail); -// -// headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetFlowControl.getDesc()); -// ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); -// Assertions.assertThat(ret).isEqualTo(RetStatus.RetFlowControl); -// -// headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetReject.getDesc()); -// ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); -// Assertions.assertThat(ret).isEqualTo(RetStatus.RetReject); -// } -// -// @Test -// public void testGetActiveRuleNameFromRequest() { -// RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); -// // Mock Condition -// properties.getStatuses().clear(); -// properties.getSeries().clear(); -// properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); -// -// SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties); -// -// HttpHeaders headers = new HttpHeaders(); -// String ruleName = adapter.getActiveRuleNameFromRequest(headers); -// Assertions.assertThat(ruleName).isEqualTo(""); -// -// headers.set(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME, "mock_rule"); -// ruleName = adapter.getActiveRuleNameFromRequest(headers); -// Assertions.assertThat(ruleName).isEqualTo("mock_rule"); -// } -// -// /** -// * Simple Polaris CircuitBreak Adapter Implements . -// */ -// public static class SimplePolarisReporterAdapter extends AbstractPolarisReporterAdapter { -// -// public SimplePolarisReporterAdapter(RpcEnhancementReporterProperties properties) { -// super(properties); -// } -// } -//} +/* + * 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.rpc.enhancement; + +import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URISyntaxException; + +import com.tencent.cloud.common.constant.HeaderConstant; +import com.tencent.cloud.common.constant.RouterConstant; +import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.common.util.ApplicationContextAwareUtils; +import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; +import com.tencent.polaris.api.config.Configuration; +import com.tencent.polaris.api.config.global.APIConfig; +import com.tencent.polaris.api.config.global.GlobalConfig; +import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; +import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.client.api.SDKContext; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; + +import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; +import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +/** + * Test For {@link AbstractPolarisReporterAdapter}. + * + * @author Elve.Xu 2022/7/11 + */ +@ExtendWith(MockitoExtension.class) +public class AbstractPolarisReporterAdapterTest { + + private static MockedStatic mockedApplicationContextAwareUtils; + private final RpcEnhancementReporterProperties reporterProperties = new RpcEnhancementReporterProperties(); + @Mock + private SDKContext sdkContext; + + @BeforeAll + static void beforeAll() { + mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class); + mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())) + .thenReturn("unit-test"); + } + + @AfterAll + static void afterAll() { + mockedApplicationContextAwareUtils.close(); + } + + @BeforeEach + void setUp() { + MetadataContext.LOCAL_NAMESPACE = NAMESPACE_TEST; + MetadataContext.LOCAL_SERVICE = SERVICE_PROVIDER; + } + + @Test + public void testServiceCallResult() throws URISyntaxException { + APIConfig apiConfig = mock(APIConfig.class); + doReturn("0.0.0.0").when(apiConfig).getBindIP(); + + GlobalConfig globalConfig = mock(GlobalConfig.class); + doReturn(apiConfig).when(globalConfig).getAPI(); + + Configuration configuration = mock(Configuration.class); + doReturn(globalConfig).when(configuration).getGlobal(); + + doReturn(configuration).when(sdkContext).getConfig(); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(reporterProperties, sdkContext); + + ServiceCallResult serviceCallResult; + + HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.add(RouterConstant.ROUTER_LABEL_HEADER, "{\"k1\":\"v1\"}"); + + serviceCallResult = adapter.createServiceCallResult( + "test", + new URI("http://0.0.0.0/"), + requestHeaders, + new HttpHeaders(), + 200, + 0, + null + ); + assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetSuccess); + + serviceCallResult = adapter.createServiceCallResult( + "test", + new URI("http://0.0.0.0/"), + requestHeaders, + new HttpHeaders(), + 502, + 0, + null + ); + assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetFail); + + serviceCallResult = adapter.createServiceCallResult( + "test", + new URI("http://0.0.0.0/"), + requestHeaders, + new HttpHeaders(), + 200, + 0, + new SocketTimeoutException() + ); + assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetTimeout); + + serviceCallResult = adapter.createServiceCallResult( + "test", + "0.0.0.0", + 8080, + new URI("/"), + requestHeaders, + new HttpHeaders(), + 200, + 0, + null + ); + assertThat(serviceCallResult.getRetStatus()).isEqualTo(RetStatus.RetSuccess); + assertThat(serviceCallResult.getHost()).isEqualTo("0.0.0.0"); + assertThat(serviceCallResult.getPort()).isEqualTo(8080); + } + + @Test + public void testResourceStat() throws URISyntaxException { + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(reporterProperties, sdkContext); + + ResourceStat resourceStat; + + resourceStat = adapter.createInstanceResourceStat("test", + new URI("http://0.0.0.0/"), + 200, + 0, + null + ); + assertThat(resourceStat.getRetStatus()).isEqualTo(RetStatus.RetSuccess); + + resourceStat = adapter.createInstanceResourceStat("test", + new URI("http://0.0.0.0/"), + 200, + 0, + new SocketTimeoutException() + ); + assertThat(resourceStat.getRetStatus()).isEqualTo(RetStatus.RetTimeout); + + resourceStat = adapter.createInstanceResourceStat("test", + null, + null, + new URI("http://0.0.0.0/"), + 200, + 0, + null + ); + assertThat(resourceStat.getRetStatus()).isEqualTo(RetStatus.RetSuccess); + } + + @Test + public void testApplyWithDefaultConfig() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + // Assert + assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithoutIgnoreInternalServerError() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.setIgnoreInternalServerError(false); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + // Assert + assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(true); + assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithIgnoreInternalServerError() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.setIgnoreInternalServerError(true); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + // Assert + assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithoutSeries() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + // Assert + assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(true); + } + + @Test + public void testApplyWithSeries() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + // Assert + assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.INTERNAL_SERVER_ERROR)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.BAD_GATEWAY)).isEqualTo(false); + assertThat(adapter.apply(HttpStatus.FORBIDDEN)).isEqualTo(true); + } + + + @Test + public void testGetRetStatusFromRequest() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + HttpHeaders headers = new HttpHeaders(); + RetStatus ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + assertThat(ret).isEqualTo(RetStatus.RetFail); + + headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetFlowControl.getDesc()); + ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + assertThat(ret).isEqualTo(RetStatus.RetFlowControl); + + headers.set(HeaderConstant.INTERNAL_CALLEE_RET_STATUS, RetStatus.RetReject.getDesc()); + ret = adapter.getRetStatusFromRequest(headers, RetStatus.RetFail); + assertThat(ret).isEqualTo(RetStatus.RetReject); + } + + @Test + public void testGetActiveRuleNameFromRequest() { + RpcEnhancementReporterProperties properties = new RpcEnhancementReporterProperties(); + // Mock Condition + properties.getStatuses().clear(); + properties.getSeries().clear(); + properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR); + + SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties, sdkContext); + + HttpHeaders headers = new HttpHeaders(); + String ruleName = adapter.getActiveRuleNameFromRequest(headers); + assertThat(ruleName).isEqualTo(""); + + headers.set(HeaderConstant.INTERNAL_ACTIVE_RULE_NAME, "mock_rule"); + ruleName = adapter.getActiveRuleNameFromRequest(headers); + assertThat(ruleName).isEqualTo("mock_rule"); + } + + /** + * Simple Polaris CircuitBreak Adapter Implements . + */ + public static class SimplePolarisReporterAdapter extends AbstractPolarisReporterAdapter { + + /** + * Constructor With {@link RpcEnhancementReporterProperties} . + * + * @param reportProperties instance of {@link RpcEnhancementReporterProperties}. + * @param context + */ + protected SimplePolarisReporterAdapter(RpcEnhancementReporterProperties reportProperties, SDKContext context) { + super(reportProperties, context); + } + } +}