Search in sources :

Example 1 with MetadataContextHolder

use of com.tencent.cloud.common.metadata.MetadataContextHolder in project spring-cloud-tencent by Tencent.

the class PolarisLoadBalancerInterceptorTest method testRouterContext.

@Test
public void testRouterContext() throws Exception {
    String callerService = "callerService";
    String calleeService = "calleeService";
    HttpRequest request = new MockedHttpRequest("http://" + calleeService + "/user/get");
    // mock local metadata
    Map<String, String> localMetadata = new HashMap<>();
    localMetadata.put("k1", "v1");
    localMetadata.put("k2", "v2");
    when(metadataLocalProperties.getContent()).thenReturn(localMetadata);
    // mock custom resolved from request
    Map<String, String> customResolvedLabels = new HashMap<>();
    customResolvedLabels.put("k2", "v22");
    customResolvedLabels.put("k4", "v4");
    when(routerLabelResolver.resolve(request, null)).thenReturn(customResolvedLabels);
    // mock expression rule labels
    Set<String> expressionKeys = new HashSet<>();
    expressionKeys.add("${http.method}");
    expressionKeys.add("${http.uri}");
    when(routerRuleLabelResolver.getExpressionLabelKeys(callerService, callerService, calleeService)).thenReturn(expressionKeys);
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn(callerService);
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock transitive metadata
        Map<String, String> transitiveLabels = new HashMap<>();
        transitiveLabels.put("k1", "v1");
        transitiveLabels.put("k2", "v22");
        when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels);
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisLoadBalancerInterceptor polarisLoadBalancerInterceptor = new PolarisLoadBalancerInterceptor(loadBalancerClient, loadBalancerRequestFactory, Collections.singletonList(routerLabelResolver), metadataLocalProperties, routerRuleLabelResolver);
            PolarisRouterContext routerContext = polarisLoadBalancerInterceptor.genRouterContext(request, null, calleeService);
            verify(metadataLocalProperties).getContent();
            verify(routerRuleLabelResolver).getExpressionLabelKeys(callerService, callerService, calleeService);
            verify(routerLabelResolver).resolve(request, null);
            Assert.assertEquals("v1", routerContext.getLabels(PolarisRouterContext.TRANSITIVE_LABELS).get("k1"));
            Assert.assertEquals("v22", routerContext.getLabels(PolarisRouterContext.TRANSITIVE_LABELS).get("k2"));
            Assert.assertEquals("v1", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k1"));
            Assert.assertEquals("v22", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k2"));
            Assert.assertEquals("v4", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k4"));
            Assert.assertEquals("GET", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("${http.method}"));
            Assert.assertEquals("/user/get", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("${http.uri}"));
        }
    }
}
Also used : HttpRequest(org.springframework.http.HttpRequest) HashMap(java.util.HashMap) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 2 with MetadataContextHolder

use of com.tencent.cloud.common.metadata.MetadataContextHolder in project spring-cloud-tencent by Tencent.

the class PolarisLoadBalancerInterceptorTest method testProxyRibbonLoadBalance.

@Test
public void testProxyRibbonLoadBalance() throws Exception {
    String callerService = "callerService";
    String calleeService = "calleeService";
    HttpRequest request = new MockedHttpRequest("http://" + calleeService + "/user/get");
    // mock local metadata
    Map<String, String> localMetadata = new HashMap<>();
    localMetadata.put("k1", "v1");
    localMetadata.put("k2", "v2");
    when(metadataLocalProperties.getContent()).thenReturn(localMetadata);
    // mock custom resolved from request
    Map<String, String> customResolvedLabels = new HashMap<>();
    customResolvedLabels.put("k3", "v3");
    customResolvedLabels.put("k4", "v4");
    when(routerLabelResolver.resolve(request, null)).thenReturn(customResolvedLabels);
    // mock expression rule labels
    Set<String> expressionKeys = new HashSet<>();
    expressionKeys.add("${http.method}");
    expressionKeys.add("${http.uri}");
    when(routerRuleLabelResolver.getExpressionLabelKeys(callerService, callerService, calleeService)).thenReturn(expressionKeys);
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn(callerService);
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock transitive metadata
        Map<String, String> transitiveLabels = new HashMap<>();
        transitiveLabels.put("k1", "v1");
        transitiveLabels.put("k2", "v22");
        when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels);
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            LoadBalancerRequest<ClientHttpResponse> loadBalancerRequest = new MockedLoadBalancerRequest<>();
            when(loadBalancerRequestFactory.createRequest(request, null, null)).thenReturn(loadBalancerRequest);
            PolarisLoadBalancerInterceptor polarisLoadBalancerInterceptor = new PolarisLoadBalancerInterceptor(loadBalancerClient, loadBalancerRequestFactory, Collections.singletonList(routerLabelResolver), metadataLocalProperties, routerRuleLabelResolver);
            polarisLoadBalancerInterceptor.intercept(request, null, null);
            verify(metadataLocalProperties).getContent();
            verify(routerRuleLabelResolver).getExpressionLabelKeys(callerService, callerService, calleeService);
            verify(routerLabelResolver).resolve(request, null);
        }
    }
}
Also used : HttpRequest(org.springframework.http.HttpRequest) HashMap(java.util.HashMap) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) MockClientHttpResponse(org.springframework.mock.http.client.MockClientHttpResponse) ClientHttpResponse(org.springframework.http.client.ClientHttpResponse) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 3 with MetadataContextHolder

use of com.tencent.cloud.common.metadata.MetadataContextHolder in project spring-cloud-tencent by Tencent.

the class PolarisFeignLoadBalancerTest method testHasRouterContext.

@Test
public void testHasRouterContext() {
    DefaultClientConfigImpl config = new DefaultClientConfigImpl();
    config.loadDefaultValues();
    ILoadBalancer loadBalancer = new SimpleLoadBalancer();
    ServerIntrospector serverIntrospector = new DefaultServerIntrospector();
    PolarisFeignLoadBalancer polarisFeignLoadBalancer = new PolarisFeignLoadBalancer(loadBalancer, config, serverIntrospector);
    Map<String, String> labels = new HashMap<>();
    labels.put("k1", "v1");
    labels.put("k2", "v2");
    List<String> headerValues = new ArrayList<>();
    headerValues.add(JacksonUtils.serialize2Json(labels));
    Map<String, Collection<String>> headers = new HashMap<>();
    headers.put(RouterConstants.ROUTER_LABEL_HEADER, headerValues);
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn("unit-test");
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisRouterContext routerContext = polarisFeignLoadBalancer.buildRouterContext(headers);
            Assert.assertNotNull(routerContext);
            Map<String, String> routerLabels = routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS);
            Assert.assertNotNull(routerLabels);
            Assert.assertEquals("v1", routerLabels.get("k1"));
            Assert.assertEquals("v2", routerLabels.get("k2"));
            Assert.assertNull(routerLabels.get("k3"));
        }
    }
}
Also used : SimpleLoadBalancer(com.tencent.cloud.polaris.router.SimpleLoadBalancer) HashMap(java.util.HashMap) ServerIntrospector(org.springframework.cloud.netflix.ribbon.ServerIntrospector) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) ArrayList(java.util.ArrayList) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) Mockito.anyString(org.mockito.Mockito.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) ILoadBalancer(com.netflix.loadbalancer.ILoadBalancer) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) Collection(java.util.Collection) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) DefaultClientConfigImpl(com.netflix.client.config.DefaultClientConfigImpl) Test(org.junit.Test)

Example 4 with MetadataContextHolder

use of com.tencent.cloud.common.metadata.MetadataContextHolder in project spring-cloud-tencent by Tencent.

the class PolarisFeignLoadBalancerTest method testHasNoneRouterContext.

@Test
public void testHasNoneRouterContext() {
    DefaultClientConfigImpl config = new DefaultClientConfigImpl();
    config.loadDefaultValues();
    ILoadBalancer loadBalancer = new SimpleLoadBalancer();
    ServerIntrospector serverIntrospector = new DefaultServerIntrospector();
    PolarisFeignLoadBalancer polarisFeignLoadBalancer = new PolarisFeignLoadBalancer(loadBalancer, config, serverIntrospector);
    Map<String, Collection<String>> headers = new HashMap<>();
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn("unit-test");
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisRouterContext routerContext = polarisFeignLoadBalancer.buildRouterContext(headers);
            Assert.assertNull(routerContext);
        }
    }
}
Also used : SimpleLoadBalancer(com.tencent.cloud.polaris.router.SimpleLoadBalancer) HashMap(java.util.HashMap) ServerIntrospector(org.springframework.cloud.netflix.ribbon.ServerIntrospector) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) Mockito.anyString(org.mockito.Mockito.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) ILoadBalancer(com.netflix.loadbalancer.ILoadBalancer) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) Collection(java.util.Collection) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) DefaultClientConfigImpl(com.netflix.client.config.DefaultClientConfigImpl) Test(org.junit.Test)

Example 5 with MetadataContextHolder

use of com.tencent.cloud.common.metadata.MetadataContextHolder in project spring-cloud-tencent by Tencent.

the class RouterLabelFeignInterceptorTest method testResolveRouterLabel.

@Test
public void testResolveRouterLabel() {
    RouterLabelFeignInterceptor routerLabelFeignInterceptor = new RouterLabelFeignInterceptor(Collections.singletonList(routerLabelResolver), metadataLocalProperties, routerRuleLabelResolver);
    // mock request template
    RequestTemplate requestTemplate = new RequestTemplate();
    String headerUidKey = "uid";
    String headerUidValue = "1000";
    requestTemplate.header(headerUidKey, headerUidValue);
    String peerService = "peerService";
    Target.EmptyTarget<Object> target = Target.EmptyTarget.create(Object.class, peerService);
    requestTemplate.feignTarget(target);
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        String testService = "callerService";
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn(testService);
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock transitive metadata
        Map<String, String> transitiveLabels = new HashMap<>();
        transitiveLabels.put("k1", "v1");
        transitiveLabels.put("k2", "v22");
        when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            // mock custom resolved labels from request
            Map<String, String> customResolvedLabels = new HashMap<>();
            customResolvedLabels.put("k2", "v2");
            customResolvedLabels.put("k3", "v3");
            when(routerLabelResolver.resolve(requestTemplate)).thenReturn(customResolvedLabels);
            // mock expression rule labels
            Set<String> expressionKeys = new HashSet<>();
            expressionKeys.add("${http.header.uid}");
            expressionKeys.add("${http.header.name}");
            when(routerRuleLabelResolver.getExpressionLabelKeys(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE, peerService)).thenReturn(expressionKeys);
            // mock local metadata
            Map<String, String> localMetadata = new HashMap<>();
            localMetadata.put("k3", "v31");
            localMetadata.put("k4", "v4");
            when(metadataLocalProperties.getContent()).thenReturn(localMetadata);
            routerLabelFeignInterceptor.apply(requestTemplate);
            Collection<String> routerLabels = requestTemplate.headers().get(RouterConstants.ROUTER_LABEL_HEADER);
            Assert.assertNotNull(routerLabels);
            for (String value : routerLabels) {
                Map<String, String> labels = unescape(JacksonUtils.deserialize2Map(value));
                Assert.assertEquals("v1", labels.get("k1"));
                Assert.assertEquals("v22", labels.get("k2"));
                Assert.assertEquals("v3", labels.get("k3"));
                Assert.assertEquals("v4", labels.get("k4"));
                Assert.assertEquals(headerUidValue, labels.get("${http.header.uid}"));
                Assert.assertEquals("", labels.get("${http.header.name}"));
            }
        }
    }
}
Also used : HashMap(java.util.HashMap) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Target(feign.Target) RequestTemplate(feign.RequestTemplate) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) HashSet(java.util.HashSet) Test(org.junit.Test)

Aggregations

MetadataContext (com.tencent.cloud.common.metadata.MetadataContext)5 MetadataContextHolder (com.tencent.cloud.common.metadata.MetadataContextHolder)5 ApplicationContextAwareUtils (com.tencent.cloud.common.util.ApplicationContextAwareUtils)5 HashMap (java.util.HashMap)5 Test (org.junit.Test)5 PolarisRouterContext (com.tencent.cloud.polaris.router.PolarisRouterContext)3 HashSet (java.util.HashSet)3 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)3 DefaultClientConfigImpl (com.netflix.client.config.DefaultClientConfigImpl)2 ILoadBalancer (com.netflix.loadbalancer.ILoadBalancer)2 SimpleLoadBalancer (com.tencent.cloud.polaris.router.SimpleLoadBalancer)2 Collection (java.util.Collection)2 Mockito.anyString (org.mockito.Mockito.anyString)2 DefaultServerIntrospector (org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector)2 ServerIntrospector (org.springframework.cloud.netflix.ribbon.ServerIntrospector)2 HttpRequest (org.springframework.http.HttpRequest)2 RequestTemplate (feign.RequestTemplate)1 Target (feign.Target)1 ArrayList (java.util.ArrayList)1 ClientHttpResponse (org.springframework.http.client.ClientHttpResponse)1