diff --git a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/pom.xml b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/pom.xml index acea97cd75..99034b5c20 100644 --- a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/pom.xml +++ b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/pom.xml @@ -67,7 +67,7 @@ javax.servlet javax.servlet-api ${servlet-api.version} - provided + test org.springframework.boot diff --git a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/com/huawei/flowcontrol/DispatcherServletInterceptor.java b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/com/huawei/flowcontrol/DispatcherServletInterceptor.java index 62ce0c0970..dcfb304d74 100644 --- a/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/com/huawei/flowcontrol/DispatcherServletInterceptor.java +++ b/sermant-plugins/sermant-flowcontrol/flowcontrol-plugin/src/main/java/com/huawei/flowcontrol/DispatcherServletInterceptor.java @@ -24,16 +24,15 @@ import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; import com.huaweicloud.sermant.core.utils.LogUtils; +import com.huaweicloud.sermant.core.utils.ReflectUtils; +import java.io.PrintWriter; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** * DispatcherServlet 的 API接口增强 埋点定义sentinel资源 * @@ -49,18 +48,18 @@ public class DispatcherServletInterceptor extends InterceptorSupporter { * @param request 请求 * @return HttpRequestEntity */ - private Optional convertToHttpEntity(HttpServletRequest request) { + private Optional convertToHttpEntity(Object request) { if (request == null) { return Optional.empty(); } - String uri = request.getRequestURI(); + String uri = getRequestUri(request); return Optional.of(new HttpRequestEntity.Builder() .setRequestType(RequestType.SERVER) - .setPathInfo(request.getPathInfo()) + .setPathInfo(getPathInfo(request)) .setServletPath(uri) .setHeaders(getHeaders(request)) - .setMethod(request.getMethod()) - .setServiceName(request.getHeader(ConfigConst.FLOW_REMOTE_SERVICE_NAME_HEADER_KEY)) + .setMethod(getMethod(request)) + .setServiceName(getHeader(request, ConfigConst.FLOW_REMOTE_SERVICE_NAME_HEADER_KEY)) .build()); } @@ -70,12 +69,12 @@ private Optional convertToHttpEntity(HttpServletRequest reque * @param request 请求信息 * @return headers */ - private Map getHeaders(HttpServletRequest request) { - final Enumeration headerNames = request.getHeaderNames(); + private Map getHeaders(Object request) { + final Enumeration headerNames = getHeaderNames(request); final Map headers = new HashMap<>(); while (headerNames.hasMoreElements()) { final String headerName = headerNames.nextElement(); - headers.put(headerName, request.getHeader(headerName)); + headers.put(headerName, getHeader(request, headerName)); } return Collections.unmodifiableMap(headers); } @@ -84,19 +83,19 @@ private Map getHeaders(HttpServletRequest request) { protected final ExecuteContext doBefore(ExecuteContext context) throws Exception { LogUtils.printHttpRequestBeforePoint(context); final Object[] allArguments = context.getArguments(); - final HttpServletRequest argument = (HttpServletRequest) allArguments[0]; + final Object request = allArguments[0]; final FlowControlResult result = new FlowControlResult(); - final Optional httpRequestEntity = convertToHttpEntity(argument); + final Optional httpRequestEntity = convertToHttpEntity(request); if (!httpRequestEntity.isPresent()) { return context; } chooseHttpService().onBefore(className, httpRequestEntity.get(), result); if (result.isSkip()) { context.skip(null); - final HttpServletResponse response = (HttpServletResponse) allArguments[1]; + final Object response = allArguments[1]; if (response != null) { - response.setStatus(result.getResponse().getCode()); - response.getWriter().print(result.buildResponseMsg()); + setStatus(response, result.getResponse().getCode()); + getWriter(response).print(result.buildResponseMsg()); } } return context; @@ -115,4 +114,39 @@ protected final ExecuteContext doThrow(ExecuteContext context) { LogUtils.printHttpRequestOnThrowPoint(context); return context; } + + private String getRequestUri(Object httpServletRequest) { + return getString(httpServletRequest, "getRequestURI"); + } + + private String getPathInfo(Object httpServletRequest) { + return getString(httpServletRequest, "getPathInfo"); + } + + private String getMethod(Object httpServletRequest) { + return getString(httpServletRequest, "getMethod"); + } + + private Enumeration getHeaderNames(Object httpServletRequest) { + return (Enumeration) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getHeaderNames") + .orElse(null); + } + + private String getHeader(Object httpServletRequest, String key) { + return (String) ReflectUtils.invokeMethod(httpServletRequest, "getHeader", new Class[]{String.class}, + new Object[]{key}).orElse(null); + } + + private PrintWriter getWriter(Object httpServletRequest) { + return (PrintWriter) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getWriter") + .orElse(null); + } + + private void setStatus(Object httpServletResponse, int code) { + ReflectUtils.invokeMethod(httpServletResponse, "setStatus", new Class[]{int.class}, new Object[]{code}); + } + + private String getString(Object object, String method) { + return (String) ReflectUtils.invokeMethodWithNoneParameter(object, method).orElse(null); + } } diff --git a/sermant-plugins/sermant-monitor/monitor-plugin/pom.xml b/sermant-plugins/sermant-monitor/monitor-plugin/pom.xml index 8e8383e5f3..21f7f68421 100644 --- a/sermant-plugins/sermant-monitor/monitor-plugin/pom.xml +++ b/sermant-plugins/sermant-monitor/monitor-plugin/pom.xml @@ -40,12 +40,6 @@ ${apache.dubbo.version} provided - - javax.servlet - javax.servlet-api - ${servlet-api.version} - provided - junit junit diff --git a/sermant-plugins/sermant-monitor/monitor-plugin/src/main/java/com/huawei/monitor/interceptor/DispatcherServletInterceptor.java b/sermant-plugins/sermant-monitor/monitor-plugin/src/main/java/com/huawei/monitor/interceptor/DispatcherServletInterceptor.java index 3f8edcd52b..e1d73cd471 100644 --- a/sermant-plugins/sermant-monitor/monitor-plugin/src/main/java/com/huawei/monitor/interceptor/DispatcherServletInterceptor.java +++ b/sermant-plugins/sermant-monitor/monitor-plugin/src/main/java/com/huawei/monitor/interceptor/DispatcherServletInterceptor.java @@ -23,8 +23,7 @@ import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; import com.huaweicloud.sermant.core.plugin.agent.interceptor.AbstractInterceptor; import com.huaweicloud.sermant.core.utils.LogUtils; - -import javax.servlet.http.HttpServletRequest; +import com.huaweicloud.sermant.core.utils.ReflectUtils; /** * HTTP拦截定义 @@ -51,7 +50,7 @@ public ExecuteContext after(ExecuteContext context) { LogUtils.printHttpRequestAfterPoint(context); return context; } - String uri = ((HttpServletRequest) context.getArguments()[0]).getRequestURI(); + String uri = getRequestUri(context.getArguments()[0]); MetricCalEntity metricCalEntity = MonitorCacheUtil.getMetricCalEntity(uri); metricCalEntity.getReqNum().incrementAndGet(); long startTime = (Long) context.getExtMemberFieldValue(START_TIME); @@ -71,11 +70,15 @@ public ExecuteContext onThrow(ExecuteContext context) { LogUtils.printHttpRequestOnThrowPoint(context); return context; } - String uri = ((HttpServletRequest) context.getArguments()[0]).getRequestURI(); + String uri = getRequestUri(context.getArguments()[0]); MetricCalEntity metricCalEntity = MonitorCacheUtil.getMetricCalEntity(uri); metricCalEntity.getReqNum().incrementAndGet(); metricCalEntity.getFailedReqNum().incrementAndGet(); LogUtils.printHttpRequestOnThrowPoint(context); return context; } + + private String getRequestUri(Object httpServletRequest) { + return (String) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getRequestURI").orElse(null); + } } diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/SpringWebHandlerDeclarer.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/DispatcherServletDeclarer.java similarity index 84% rename from sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/SpringWebHandlerDeclarer.java rename to sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/DispatcherServletDeclarer.java index 030591734f..38a395ea5b 100644 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/SpringWebHandlerDeclarer.java +++ b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/declarers/DispatcherServletDeclarer.java @@ -17,7 +17,7 @@ package com.huawei.registry.grace.declarers; -import com.huawei.registry.grace.interceptors.SpringWebHandlerInterceptor; +import com.huawei.registry.grace.interceptors.DispatcherServletInterceptor; import com.huaweicloud.sermant.core.plugin.agent.declarer.AbstractPluginDeclarer; import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer; @@ -30,16 +30,16 @@ * @author zhouss * @since 2022-05-23 */ -public class SpringWebHandlerDeclarer extends AbstractPluginDeclarer { +public class DispatcherServletDeclarer extends AbstractPluginDeclarer { /** * 增强类的全限定名 */ - private static final String ENHANCE_CLASS = "org.springframework.web.servlet.HandlerExecutionChain"; + private static final String ENHANCE_CLASS = "org.springframework.web.servlet.DispatcherServlet"; /** * 拦截类的全限定名 */ - private static final String INTERCEPT_CLASS = SpringWebHandlerInterceptor.class.getCanonicalName(); + private static final String INTERCEPT_CLASS = DispatcherServletInterceptor.class.getCanonicalName(); @Override public ClassMatcher getClassMatcher() { diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/inject/grace/SpringRequestInterceptor.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptor.java similarity index 57% rename from sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/inject/grace/SpringRequestInterceptor.java rename to sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptor.java index 4c8cb6c15a..73bdea5bd8 100644 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/inject/grace/SpringRequestInterceptor.java +++ b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptor.java @@ -20,7 +20,7 @@ * from the Apache Dubbo project. */ -package com.huawei.registry.inject.grace; +package com.huawei.registry.grace.interceptors; import com.huawei.registry.config.GraceConfig; import com.huawei.registry.config.grace.GraceConstants; @@ -30,23 +30,19 @@ import com.huawei.registry.context.RegisterContext.ClientInfo; import com.huawei.registry.services.GraceService; +import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; import com.huaweicloud.sermant.core.plugin.config.PluginConfigManager; import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager; +import com.huaweicloud.sermant.core.utils.ReflectUtils; import com.huaweicloud.sermant.core.utils.StringUtils; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - /** - * Spring Web请求前置拦截器, 由拦截器动态加入, 每次请求都会添加, {@link com.huawei.registry.grace.interceptors.SpringWebHandlerInterceptor} + * Spring Web请求拦截器 * * @author zhouss * @since 2022-05-23 */ -public class SpringRequestInterceptor implements HandlerInterceptor { +public class DispatcherServletInterceptor extends GraceSwitchInterceptor { private final GraceService graceService; private final GraceConfig graceConfig; @@ -54,55 +50,78 @@ public class SpringRequestInterceptor implements HandlerInterceptor { /** * 构造方法 */ - public SpringRequestInterceptor() { + public DispatcherServletInterceptor() { graceService = PluginServiceManager.getPluginService(GraceService.class); graceConfig = PluginConfigManager.getPluginConfig(GraceConfig.class); } @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + public ExecuteContext doBefore(ExecuteContext context) { if (GraceContext.INSTANCE.getStartWarmUpTime() == 0) { GraceContext.INSTANCE.setStartWarmUpTime(System.currentTimeMillis()); } + Object[] arguments = context.getArguments(); + Object request = arguments[0]; + Object response = arguments[1]; + addGraceAddress(request); final GraceShutDownManager graceShutDownManager = GraceContext.INSTANCE.getGraceShutDownManager(); graceShutDownManager.increaseRequestCount(); if (graceShutDownManager.isShutDown() && graceConfig.isEnableGraceShutdown()) { // 已被标记为关闭状态, 开始统计进入的请求数 final ClientInfo clientInfo = RegisterContext.INSTANCE.getClientInfo(); - response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT, + addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT, buildEndpoint(clientInfo.getIp(), clientInfo.getPort())); - response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT, + addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT, buildEndpoint(clientInfo.getHost(), clientInfo.getPort())); - response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_NAME, clientInfo.getServiceName()); + addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_NAME, clientInfo.getServiceName()); } - return true; + return context; } @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) { + public ExecuteContext doAfter(ExecuteContext context) { + GraceContext.INSTANCE.getGraceShutDownManager().decreaseRequestCount(); + return context; } @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, - Exception ex) { + public ExecuteContext doThrow(ExecuteContext context) { GraceContext.INSTANCE.getGraceShutDownManager().decreaseRequestCount(); + return context; } - private String buildEndpoint(String host, int port) { - return host + ":" + port; - } - - private void addGraceAddress(HttpServletRequest request) { + private void addGraceAddress(Object request) { if (graceConfig.isEnableSpring() && graceConfig.isEnableGraceShutdown() && graceConfig.isEnableOfflineNotify() && GraceConstants.GRACE_OFFLINE_SOURCE_VALUE - .equals(request.getHeader(GraceConstants.GRACE_OFFLINE_SOURCE_KEY))) { - String address = request.getHeader(GraceConstants.SERMANT_GRACE_ADDRESS); + .equals(getHeader(request, GraceConstants.GRACE_OFFLINE_SOURCE_KEY))) { + String address = getHeader(request, GraceConstants.SERMANT_GRACE_ADDRESS); if (StringUtils.isBlank(address)) { - address = request.getRemoteAddr() + ":" + request.getServerPort(); + address = getRemoteAddr(request) + ":" + getServerPort(request); } graceService.addAddress(address); } } + + private void addHeader(Object httpServletRequest, String key, String value) { + ReflectUtils.invokeMethod(httpServletRequest, "addHeader", new Class[]{String.class, String.class}, + new Object[]{key, value}); + } + + private int getServerPort(Object httpServletRequest) { + return (int) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getServerPort").orElse(0); + } + + private String getRemoteAddr(Object httpServletRequest) { + return getString(httpServletRequest, "getRemoteAddr"); + } + + private String getHeader(Object httpServletRequest, String key) { + return (String) ReflectUtils.invokeMethod(httpServletRequest, "getHeader", new Class[]{String.class}, + new Object[]{key}).orElse(null); + } + + private String getString(Object object, String method) { + return (String) ReflectUtils.invokeMethodWithNoneParameter(object, method).orElse(null); + } } diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/GraceSwitchInterceptor.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/GraceSwitchInterceptor.java index c1345034aa..8b4bb9cc64 100644 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/GraceSwitchInterceptor.java +++ b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/GraceSwitchInterceptor.java @@ -75,7 +75,7 @@ protected boolean isEnabled() { * @return endpoint */ protected String buildEndpoint(String host, int port) { - return String.format(Locale.ENGLISH, "%s:%s", host, port); + return host + ":" + port; } /** diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptor.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptor.java deleted file mode 100644 index f314e4f891..0000000000 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptor.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved. - * - * 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 com.huawei.registry.grace.interceptors; - -import com.huawei.registry.inject.grace.SpringRequestInterceptor; - -import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; - -import org.springframework.web.servlet.HandlerExecutionChain; -import org.springframework.web.servlet.HandlerInterceptor; - -/** - * 注入请求拦截器 - * - * @author zhouss - * @since 2022-05-23 - */ -public class SpringWebHandlerInterceptor extends GraceSwitchInterceptor { - private HandlerInterceptor handlerInterceptor; - - @Override - protected ExecuteContext doBefore(ExecuteContext context) { - final Object object = context.getObject(); - if (object instanceof HandlerExecutionChain) { - HandlerExecutionChain chain = (HandlerExecutionChain) object; - chain.addInterceptor(getInterceptor()); - } - return context; - } - - private HandlerInterceptor getInterceptor() { - if (handlerInterceptor == null) { - handlerInterceptor = new SpringRequestInterceptor(); - } - return handlerInterceptor; - } -} diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer index be843d2224..b303333db4 100644 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer +++ b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer @@ -36,7 +36,7 @@ com.huawei.registry.declarers.health.HealthIndicatorDeclarer com.huawei.registry.grace.declarers.RegistryDelayDeclarer com.huawei.registry.grace.declarers.SpringRibbonWarmUpDeclarer com.huawei.registry.grace.declarers.SpringLoadbalancerWarmUpDeclarer -com.huawei.registry.grace.declarers.SpringWebHandlerDeclarer +com.huawei.registry.grace.declarers.DispatcherServletDeclarer com.huawei.registry.grace.declarers.SpringRibbonBalancerDeclarer com.huawei.registry.grace.declarers.SpringCacheManagerDeclarer com.huawei.registry.grace.declarers.SpringLoadbalancerFeignResponseDeclarer diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/inject/grace/SpringRequestInterceptorTest.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptorTest.java similarity index 81% rename from sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/inject/grace/SpringRequestInterceptorTest.java rename to sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptorTest.java index ab824aed3c..1888fc4aaa 100644 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/inject/grace/SpringRequestInterceptorTest.java +++ b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/DispatcherServletInterceptorTest.java @@ -1,11 +1,11 @@ /* - * Copyright (C) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (C) 2022-2024 Huawei Technologies Co., Ltd. All rights reserved. * * 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 + * 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, @@ -14,13 +14,14 @@ * limitations under the License. */ -package com.huawei.registry.inject.grace; +package com.huawei.registry.grace.interceptors; import com.huawei.registry.config.GraceConfig; import com.huawei.registry.config.grace.GraceConstants; import com.huawei.registry.config.grace.GraceContext; import com.huawei.registry.services.GraceService; +import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; import com.huaweicloud.sermant.core.plugin.config.PluginConfigManager; import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager; @@ -45,7 +46,7 @@ * @author zhouss * @since 2022-09-06 */ -public class SpringRequestInterceptorTest { +public class DispatcherServletInterceptorTest { private final String testAddress = "localhost:8099"; private final List addresses = new ArrayList<>(); @@ -64,7 +65,9 @@ public void addAddress(String address) { } }; - private SpringRequestInterceptor interceptor; + private ExecuteContext executeContext; + + private DispatcherServletInterceptor interceptor; @Mock private HttpServletRequest request; @@ -77,7 +80,7 @@ public void addAddress(String address) { private MockedStatic pluginConfigManagerMockedStatic; @Before - public void setUp() { + public void setUp() throws NoSuchMethodException { MockitoAnnotations.openMocks(this); pluginServiceManagerMockedStatic = Mockito.mockStatic(PluginServiceManager.class); pluginConfigManagerMockedStatic = Mockito.mockStatic(PluginConfigManager.class); @@ -92,7 +95,10 @@ public void setUp() { .thenReturn(GraceConstants.GRACE_OFFLINE_SOURCE_VALUE); Mockito.when(request.getHeader(GraceConstants.SERMANT_GRACE_ADDRESS)) .thenReturn(testAddress); - interceptor = new SpringRequestInterceptor(); + interceptor = new DispatcherServletInterceptor(); + Object[] arguments = new Object[]{request, response}; + executeContext = ExecuteContext.forMemberMethod(new Object(), String.class.getMethod("trim"), arguments, null, + null); } @After @@ -102,9 +108,9 @@ public void tearDown() throws Exception { } @Test - public void preHandle() { + public void before() { GraceContext.INSTANCE.getGraceShutDownManager().setShutDown(true); - interceptor.preHandle(request, response, new Object()); + interceptor.doBefore(executeContext); Assert.assertTrue(GraceContext.INSTANCE.getStartWarmUpTime() > 0); Assert.assertTrue(addresses.contains(testAddress)); Assert.assertTrue(GraceContext.INSTANCE.getGraceShutDownManager().getRequestCount() > 0); @@ -115,13 +121,13 @@ public void preHandle() { } @Test - public void postHandle() { - interceptor.postHandle(request, response, new Object(), null); + public void after() { + interceptor.doAfter(executeContext); } @Test - public void afterCompletion() { - interceptor.afterCompletion(request, response, new Object(), null); + public void doThrow() { + interceptor.doThrow(executeContext); Assert.assertTrue(GraceContext.INSTANCE.getGraceShutDownManager().getRequestCount() < 0); GraceContext.INSTANCE.getGraceShutDownManager().increaseRequestCount(); } diff --git a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptorTest.java b/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptorTest.java deleted file mode 100644 index a46c7ac444..0000000000 --- a/sermant-plugins/sermant-service-registry/spring-cloud-registry-plugin/src/test/java/com/huawei/registry/grace/interceptors/SpringWebHandlerInterceptorTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved. - * - * 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 com.huawei.registry.grace.interceptors; - -import com.huawei.registry.config.GraceConfig; -import com.huawei.registry.config.RegisterConfig; -import com.huawei.registry.services.GraceService; - -import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; -import com.huaweicloud.sermant.core.plugin.config.PluginConfigManager; -import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.springframework.web.servlet.HandlerExecutionChain; - -import java.util.Objects; - -/** - * 添加拦截器测试 - * - * @author zhouss - * @since 2022-06-30 - */ -public class SpringWebHandlerInterceptorTest { - private final GraceConfig graceConfig = new GraceConfig(); - - /** - * PluginConfigManager mock对象 - */ - public MockedStatic pluginConfigManagerMockedStatic; - - private MockedStatic pluginServiceManagerMockedStatic; - - /** - * 初始化 - */ - @Before - public void init() { - graceConfig.setEnableSpring(true); - pluginConfigManagerMockedStatic = Mockito.mockStatic(PluginConfigManager.class); - pluginConfigManagerMockedStatic.when(() -> PluginConfigManager.getPluginConfig(GraceConfig.class)) - .thenReturn(graceConfig); - pluginConfigManagerMockedStatic.when(() -> PluginConfigManager.getPluginConfig(RegisterConfig.class)) - .thenReturn(new RegisterConfig()); - pluginServiceManagerMockedStatic = Mockito.mockStatic(PluginServiceManager.class); - pluginServiceManagerMockedStatic.when(() -> PluginServiceManager.getPluginService(GraceService.class)) - .thenReturn(new GraceService() { - @Override - public void shutdown() { - - } - - @Override - public void addAddress(String address) { - - } - }); - } - - @After - public void tearDown() { - pluginConfigManagerMockedStatic.close(); - pluginServiceManagerMockedStatic.close(); - } - - /** - * 测试添加拦截器 - */ - @Test - public void testAddInterceptor() { - final HandlerExecutionChain chain = new HandlerExecutionChain(new Object()); - final ExecuteContext executeContext = ExecuteContext.forMemberMethod(chain, null, null, null, null); - final SpringWebHandlerInterceptor springWebHandlerInterceptor = new SpringWebHandlerInterceptor(); - springWebHandlerInterceptor.doBefore(executeContext); - Assert.assertTrue(Objects.requireNonNull(chain.getInterceptors()).length > 0); - } -}