|
|
@ -17,53 +17,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
package com.tencent.cloud.polaris.ratelimit.filter;
|
|
|
|
package com.tencent.cloud.polaris.ratelimit.filter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
import javax.servlet.FilterChain;
|
|
|
|
import javax.servlet.FilterChain;
|
|
|
|
import javax.servlet.ServletException;
|
|
|
|
import javax.servlet.ServletException;
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.google.protobuf.InvalidProtocolBufferException;
|
|
|
|
|
|
|
|
import com.google.protobuf.util.JsonFormat;
|
|
|
|
import com.tencent.cloud.common.metadata.MetadataContext;
|
|
|
|
import com.tencent.cloud.common.metadata.MetadataContext;
|
|
|
|
import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
|
|
|
|
import com.tencent.cloud.polaris.context.ServiceRuleManager;
|
|
|
|
import com.tencent.cloud.common.util.expresstion.SpringWebExpressionLabelUtils;
|
|
|
|
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.RateLimitRuleLabelResolver;
|
|
|
|
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties;
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties;
|
|
|
|
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.resolver.RateLimitRuleArgumentServletResolver;
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelServletResolver;
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelServletResolver;
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLimitedFallback;
|
|
|
|
import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLimitedFallback;
|
|
|
|
import com.tencent.polaris.api.plugin.ratelimiter.QuotaResult;
|
|
|
|
import com.tencent.polaris.api.plugin.ratelimiter.QuotaResult;
|
|
|
|
import com.tencent.polaris.ratelimit.api.core.LimitAPI;
|
|
|
|
import com.tencent.polaris.ratelimit.api.core.LimitAPI;
|
|
|
|
import com.tencent.polaris.ratelimit.api.rpc.QuotaRequest;
|
|
|
|
import com.tencent.polaris.ratelimit.api.rpc.QuotaRequest;
|
|
|
|
import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse;
|
|
|
|
import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse;
|
|
|
|
import org.junit.jupiter.api.AfterAll;
|
|
|
|
import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto;
|
|
|
|
import org.junit.jupiter.api.BeforeAll;
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
|
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 org.mockito.MockedStatic;
|
|
|
|
|
|
|
|
import org.mockito.Mockito;
|
|
|
|
|
|
|
|
import org.mockito.junit.jupiter.MockitoExtension;
|
|
|
|
|
|
|
|
import org.mockito.junit.jupiter.MockitoSettings;
|
|
|
|
|
|
|
|
import org.mockito.quality.Strictness;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
|
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
|
|
import org.springframework.boot.test.context.SpringBootTest;
|
|
|
|
import org.springframework.boot.test.context.SpringBootTest;
|
|
|
|
import org.springframework.http.MediaType;
|
|
|
|
import org.springframework.http.MediaType;
|
|
|
|
import org.springframework.mock.web.MockHttpServletRequest;
|
|
|
|
import org.springframework.mock.web.MockHttpServletRequest;
|
|
|
|
import org.springframework.mock.web.MockHttpServletResponse;
|
|
|
|
import org.springframework.mock.web.MockHttpServletResponse;
|
|
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
|
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
import static org.assertj.core.api.Assertions.fail;
|
|
|
|
import static org.assertj.core.api.Assertions.fail;
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
|
import static org.mockito.ArgumentMatchers.anySet;
|
|
|
|
|
|
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
|
import static org.mockito.Mockito.mockStatic;
|
|
|
|
|
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -71,41 +65,23 @@ import static org.mockito.Mockito.when;
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @author Haotian Zhang, cheese8
|
|
|
|
* @author Haotian Zhang, cheese8
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@ExtendWith(MockitoExtension.class)
|
|
|
|
@ExtendWith(SpringExtension.class)
|
|
|
|
@MockitoSettings(strictness = Strictness.LENIENT)
|
|
|
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
|
|
|
|
@SpringBootTest(classes = QuotaCheckServletFilterTest.TestApplication.class, properties = {
|
|
|
|
classes = QuotaCheckServletFilterTest.TestApplication.class,
|
|
|
|
|
|
|
|
properties = {
|
|
|
|
"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"
|
|
|
|
"spring.cloud.polaris.namespace=Test", "spring.cloud.polaris.service=TestApp"
|
|
|
|
})
|
|
|
|
})
|
|
|
|
public class QuotaCheckServletFilterTest {
|
|
|
|
public class QuotaCheckServletFilterTest {
|
|
|
|
|
|
|
|
|
|
|
|
private static MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils;
|
|
|
|
|
|
|
|
private static MockedStatic<SpringWebExpressionLabelUtils> expressionLabelUtilsMockedStatic;
|
|
|
|
|
|
|
|
private final PolarisRateLimiterLabelServletResolver labelResolver =
|
|
|
|
private final PolarisRateLimiterLabelServletResolver labelResolver =
|
|
|
|
exchange -> Collections.singletonMap("ServletResolver", "ServletResolver");
|
|
|
|
exchange -> Collections.singletonMap("xxx", "xxx");
|
|
|
|
private QuotaCheckServletFilter quotaCheckServletFilter;
|
|
|
|
private QuotaCheckServletFilter quotaCheckServletFilter;
|
|
|
|
private QuotaCheckServletFilter quotaCheckWithHtmlRejectTipsServletFilter;
|
|
|
|
private QuotaCheckServletFilter quotaCheckWithHtmlRejectTipsServletFilter;
|
|
|
|
private QuotaCheckServletFilter quotaCheckWithRateLimiterLimitedFallbackFilter;
|
|
|
|
private QuotaCheckServletFilter quotaCheckWithRateLimiterLimitedFallbackFilter;
|
|
|
|
private PolarisRateLimiterLimitedFallback polarisRateLimiterLimitedFallback;
|
|
|
|
private PolarisRateLimiterLimitedFallback polarisRateLimiterLimitedFallback;
|
|
|
|
|
|
|
|
|
|
|
|
@BeforeAll
|
|
|
|
|
|
|
|
static void beforeAll() {
|
|
|
|
|
|
|
|
expressionLabelUtilsMockedStatic = mockStatic(SpringWebExpressionLabelUtils.class);
|
|
|
|
|
|
|
|
when(SpringWebExpressionLabelUtils.resolve(any(ServerWebExchange.class), anySet()))
|
|
|
|
|
|
|
|
.thenReturn(Collections.singletonMap("RuleLabelResolver", "RuleLabelResolver"));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class);
|
|
|
|
|
|
|
|
mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString()))
|
|
|
|
|
|
|
|
.thenReturn("unit-test");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@AfterAll
|
|
|
|
|
|
|
|
static void afterAll() {
|
|
|
|
|
|
|
|
mockedApplicationContextAwareUtils.close();
|
|
|
|
|
|
|
|
expressionLabelUtilsMockedStatic.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@BeforeEach
|
|
|
|
@BeforeEach
|
|
|
|
void setUp() {
|
|
|
|
void setUp() throws InvalidProtocolBufferException {
|
|
|
|
MetadataContext.LOCAL_NAMESPACE = "TEST";
|
|
|
|
MetadataContext.LOCAL_NAMESPACE = "TEST";
|
|
|
|
|
|
|
|
|
|
|
|
LimitAPI limitAPI = mock(LimitAPI.class);
|
|
|
|
LimitAPI limitAPI = mock(LimitAPI.class);
|
|
|
@ -133,15 +109,21 @@ public class QuotaCheckServletFilterTest {
|
|
|
|
polarisRateLimitWithHtmlRejectTipsProperties.setRejectRequestTips("<h1>RejectRequestTips提示消息</h1>");
|
|
|
|
polarisRateLimitWithHtmlRejectTipsProperties.setRejectRequestTips("<h1>RejectRequestTips提示消息</h1>");
|
|
|
|
polarisRateLimitWithHtmlRejectTipsProperties.setRejectHttpCode(419);
|
|
|
|
polarisRateLimitWithHtmlRejectTipsProperties.setRejectHttpCode(419);
|
|
|
|
|
|
|
|
|
|
|
|
RateLimitRuleLabelResolver rateLimitRuleLabelResolver = mock(RateLimitRuleLabelResolver.class);
|
|
|
|
ServiceRuleManager serviceRuleManager = mock(ServiceRuleManager.class);
|
|
|
|
when(rateLimitRuleLabelResolver.getExpressionLabelKeys(anyString(), anyString())).thenReturn(Collections.emptySet());
|
|
|
|
|
|
|
|
|
|
|
|
RateLimitProto.Rule.Builder ratelimitRuleBuilder = RateLimitProto.Rule.newBuilder();
|
|
|
|
this.quotaCheckServletFilter = new QuotaCheckServletFilter(limitAPI, labelResolver, polarisRateLimitProperties, rateLimitRuleLabelResolver, null);
|
|
|
|
InputStream inputStream = QuotaCheckServletFilterTest.class.getClassLoader().getResourceAsStream("ratelimit.json");
|
|
|
|
this.quotaCheckWithHtmlRejectTipsServletFilter = new QuotaCheckServletFilter(
|
|
|
|
String json = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)).lines().collect(Collectors.joining(""));
|
|
|
|
limitAPI, labelResolver, polarisRateLimitWithHtmlRejectTipsProperties, rateLimitRuleLabelResolver, null);
|
|
|
|
JsonFormat.parser().ignoringUnknownFields().merge(json, ratelimitRuleBuilder);
|
|
|
|
polarisRateLimiterLimitedFallback = new JsonPolarisRateLimiterLimitedFallback();
|
|
|
|
RateLimitProto.Rule rateLimitRule = ratelimitRuleBuilder.build();
|
|
|
|
this.quotaCheckWithRateLimiterLimitedFallbackFilter = new QuotaCheckServletFilter(
|
|
|
|
RateLimitProto.RateLimit rateLimit = RateLimitProto.RateLimit.newBuilder().addRules(rateLimitRule).build();
|
|
|
|
limitAPI, labelResolver, polarisRateLimitWithHtmlRejectTipsProperties, rateLimitRuleLabelResolver, polarisRateLimiterLimitedFallback);
|
|
|
|
when(serviceRuleManager.getServiceRateLimitRule(anyString(), anyString())).thenReturn(rateLimit);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RateLimitRuleArgumentServletResolver rateLimitRuleArgumentServletResolver = new RateLimitRuleArgumentServletResolver(serviceRuleManager, labelResolver);
|
|
|
|
|
|
|
|
this.quotaCheckServletFilter = new QuotaCheckServletFilter(limitAPI, polarisRateLimitProperties, rateLimitRuleArgumentServletResolver, null);
|
|
|
|
|
|
|
|
this.quotaCheckWithHtmlRejectTipsServletFilter = new QuotaCheckServletFilter(limitAPI, polarisRateLimitWithHtmlRejectTipsProperties, rateLimitRuleArgumentServletResolver, null);
|
|
|
|
|
|
|
|
this.polarisRateLimiterLimitedFallback = new JsonPolarisRateLimiterLimitedFallback();
|
|
|
|
|
|
|
|
this.quotaCheckWithRateLimiterLimitedFallbackFilter = new QuotaCheckServletFilter(limitAPI, polarisRateLimitWithHtmlRejectTipsProperties, rateLimitRuleArgumentServletResolver, polarisRateLimiterLimitedFallback);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
@ -167,40 +149,6 @@ public class QuotaCheckServletFilterTest {
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.init();
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.init();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
|
|
|
public void testGetRuleExpressionLabels() {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
Method getCustomResolvedLabels = QuotaCheckServletFilter.class.getDeclaredMethod("getCustomResolvedLabels", HttpServletRequest.class);
|
|
|
|
|
|
|
|
getCustomResolvedLabels.setAccessible(true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mock request
|
|
|
|
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// labelResolver != null
|
|
|
|
|
|
|
|
Map<String, String> result = (Map<String, String>) getCustomResolvedLabels.invoke(quotaCheckServletFilter, request);
|
|
|
|
|
|
|
|
assertThat(result.size()).isEqualTo(1);
|
|
|
|
|
|
|
|
assertThat(result.get("ServletResolver")).isEqualTo("ServletResolver");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// throw exception
|
|
|
|
|
|
|
|
PolarisRateLimiterLabelServletResolver exceptionLabelResolver = request1 -> {
|
|
|
|
|
|
|
|
throw new RuntimeException("Mock exception.");
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
quotaCheckServletFilter = new QuotaCheckServletFilter(null, exceptionLabelResolver, null, null, null);
|
|
|
|
|
|
|
|
result = (Map<String, String>) getCustomResolvedLabels.invoke(quotaCheckServletFilter, request);
|
|
|
|
|
|
|
|
assertThat(result.size()).isEqualTo(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// labelResolver == null
|
|
|
|
|
|
|
|
quotaCheckServletFilter = new QuotaCheckServletFilter(null, null, null, null, null);
|
|
|
|
|
|
|
|
result = (Map<String, String>) getCustomResolvedLabels.invoke(quotaCheckServletFilter, request);
|
|
|
|
|
|
|
|
assertThat(result.size()).isEqualTo(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getCustomResolvedLabels.setAccessible(false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
|
|
|
|
|
|
|
fail("Exception encountered.", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@Test
|
|
|
|
public void testDoFilterInternal() {
|
|
|
|
public void testDoFilterInternal() {
|
|
|
|
// Create mock FilterChain
|
|
|
|
// Create mock FilterChain
|
|
|
@ -210,34 +158,39 @@ public class QuotaCheckServletFilterTest {
|
|
|
|
|
|
|
|
|
|
|
|
// Mock request
|
|
|
|
// Mock request
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quotaCheckServletFilter.init();
|
|
|
|
quotaCheckServletFilter.init();
|
|
|
|
|
|
|
|
quotaCheckWithHtmlRejectTipsServletFilter.init();
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// Pass
|
|
|
|
// Pass
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp1";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp1";
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
MockHttpServletResponse testApp1Response = new MockHttpServletResponse();
|
|
|
|
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, testApp1Response, filterChain);
|
|
|
|
|
|
|
|
|
|
|
|
// Unirate waiting 1000ms
|
|
|
|
// Unirate waiting 1000ms
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp2";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp2";
|
|
|
|
|
|
|
|
MockHttpServletResponse testApp2Response = new MockHttpServletResponse();
|
|
|
|
long startTimestamp = System.currentTimeMillis();
|
|
|
|
long startTimestamp = System.currentTimeMillis();
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, testApp2Response, filterChain);
|
|
|
|
assertThat(System.currentTimeMillis() - startTimestamp).isGreaterThanOrEqualTo(1000L);
|
|
|
|
assertThat(System.currentTimeMillis() - startTimestamp).isGreaterThanOrEqualTo(1000L);
|
|
|
|
|
|
|
|
|
|
|
|
// Rate limited
|
|
|
|
// Rate limited
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp3";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp3";
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
MockHttpServletResponse testApp3Response = new MockHttpServletResponse();
|
|
|
|
assertThat(response.getStatus()).isEqualTo(419);
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, testApp3Response, filterChain);
|
|
|
|
assertThat(response.getContentAsString()).isEqualTo("RejectRequestTips提示消息");
|
|
|
|
assertThat(testApp3Response.getStatus()).isEqualTo(419);
|
|
|
|
|
|
|
|
assertThat(testApp3Response.getContentAsString()).isEqualTo("RejectRequestTips提示消息");
|
|
|
|
|
|
|
|
|
|
|
|
quotaCheckWithHtmlRejectTipsServletFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
MockHttpServletResponse testApp3Response2 = new MockHttpServletResponse();
|
|
|
|
assertThat(response.getStatus()).isEqualTo(419);
|
|
|
|
quotaCheckWithHtmlRejectTipsServletFilter.doFilterInternal(request, testApp3Response2, filterChain);
|
|
|
|
assertThat(response.getContentAsString()).isEqualTo("RejectRequestTips提示消息");
|
|
|
|
assertThat(testApp3Response2.getStatus()).isEqualTo(419);
|
|
|
|
|
|
|
|
assertThat(testApp3Response2.getContentAsString()).isEqualTo("<h1>RejectRequestTips提示消息</h1>");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exception
|
|
|
|
// Exception
|
|
|
|
|
|
|
|
MockHttpServletResponse testApp4Response = new MockHttpServletResponse();
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp4";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp4";
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
quotaCheckServletFilter.doFilterInternal(request, testApp4Response, filterChain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (ServletException | IOException e) {
|
|
|
|
catch (ServletException | IOException e) {
|
|
|
|
fail("Exception encountered.", e);
|
|
|
|
fail("Exception encountered.", e);
|
|
|
@ -252,31 +205,34 @@ public class QuotaCheckServletFilterTest {
|
|
|
|
|
|
|
|
|
|
|
|
// Mock request
|
|
|
|
// Mock request
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
|
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.init();
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.init();
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// Pass
|
|
|
|
// Pass
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp1";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp1";
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
MockHttpServletResponse testApp1response = new MockHttpServletResponse();
|
|
|
|
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, testApp1response, filterChain);
|
|
|
|
|
|
|
|
|
|
|
|
// Unirate waiting 1000ms
|
|
|
|
// Unirate waiting 1000ms
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp2";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp2";
|
|
|
|
|
|
|
|
MockHttpServletResponse testApp2response = new MockHttpServletResponse();
|
|
|
|
long startTimestamp = System.currentTimeMillis();
|
|
|
|
long startTimestamp = System.currentTimeMillis();
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, testApp2response, filterChain);
|
|
|
|
assertThat(System.currentTimeMillis() - startTimestamp).isGreaterThanOrEqualTo(1000L);
|
|
|
|
assertThat(System.currentTimeMillis() - startTimestamp).isGreaterThanOrEqualTo(1000L);
|
|
|
|
|
|
|
|
|
|
|
|
// Rate limited
|
|
|
|
// Rate limited
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp3";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp3";
|
|
|
|
|
|
|
|
MockHttpServletResponse testApp3response = new MockHttpServletResponse();
|
|
|
|
String contentType = new MediaType(polarisRateLimiterLimitedFallback.mediaType(), polarisRateLimiterLimitedFallback.charset()).toString();
|
|
|
|
String contentType = new MediaType(polarisRateLimiterLimitedFallback.mediaType(), polarisRateLimiterLimitedFallback.charset()).toString();
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, testApp3response, filterChain);
|
|
|
|
assertThat(response.getStatus()).isEqualTo(polarisRateLimiterLimitedFallback.rejectHttpCode());
|
|
|
|
assertThat(testApp3response.getStatus()).isEqualTo(polarisRateLimiterLimitedFallback.rejectHttpCode());
|
|
|
|
assertThat(response.getContentAsString()).isEqualTo(polarisRateLimiterLimitedFallback.rejectTips());
|
|
|
|
assertThat(testApp3response.getContentAsString()).isEqualTo(polarisRateLimiterLimitedFallback.rejectTips());
|
|
|
|
assertThat(response.getContentType()).isEqualTo(contentType);
|
|
|
|
assertThat(testApp3response.getContentType()).isEqualTo(contentType);
|
|
|
|
|
|
|
|
|
|
|
|
// Exception
|
|
|
|
// Exception
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp4";
|
|
|
|
MetadataContext.LOCAL_SERVICE = "TestApp4";
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, response, filterChain);
|
|
|
|
MockHttpServletResponse testApp4response = new MockHttpServletResponse();
|
|
|
|
|
|
|
|
quotaCheckWithRateLimiterLimitedFallbackFilter.doFilterInternal(request, testApp4response, filterChain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (ServletException | IOException e) {
|
|
|
|
catch (ServletException | IOException e) {
|
|
|
|
fail("Exception encountered.", e);
|
|
|
|
fail("Exception encountered.", e);
|
|
|
|