diff --git a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java index c5e8430ed31f..185ad79436bf 100644 --- a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java +++ b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java @@ -34,6 +34,7 @@ import io.kubernetes.client.openapi.models.V1EndpointSubsetBuilder; import io.kubernetes.client.openapi.models.V1EndpointAddress; import org.apache.shenyu.common.config.ssl.ShenyuSniAsyncMapping; +import org.apache.shenyu.common.dto.SelectorData; import org.apache.shenyu.common.enums.PluginEnum; import org.apache.shenyu.k8s.cache.IngressCache; import org.apache.shenyu.k8s.cache.IngressSelectorCache; @@ -44,6 +45,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import java.util.Collections; import java.util.HashMap; @@ -77,6 +79,11 @@ public final class DivideIngressReconcilerTest { @BeforeEach public void init() { + // These caches are process-wide singletons; isolate each test case. + IngressCache.getInstance().remove("mockedNamespace", "mockedIngress"); + IngressSelectorCache.getInstance().remove("mockedNamespace", "mockedIngress", PluginEnum.DIVIDE.getName()); + ServiceIngressCache.getInstance().removeSpecifiedIngressName( + "mockedNamespace", "testService", "mockedNamespace", "mockedIngress"); ingressInformer = mock(SharedIndexInformer.class); secretInformer = mock(SharedIndexInformer.class); shenyuCacheRepository = mock(ShenyuCacheRepository.class); @@ -127,6 +134,24 @@ public void testReconcile() { verify(shenyuCacheRepository).saveOrUpdateRuleData(any()); } + /** + * test reconcile with fewer protocols than endpoints. + */ + @Test + public void testReconcileWithFewerProtocolsThanEndpoints() { + V1Ingress ingress = ingressInformer.getIndexer().getByKey("mockedNamespace/mockedIngress"); + Map annotations = ingress.getMetadata().getAnnotations(); + annotations.put("shenyu.apache.org/upstreams-protocol", "https://"); + V1Endpoints endpoints = endpointsInformer.getIndexer().getByKey("mockedNamespace/testService"); + endpoints.getSubsets().get(0).setAddresses(java.util.Arrays.asList( + new V1EndpointAddress().ip("127.0.0.1"), new V1EndpointAddress().ip("127.0.0.2"))); + ingressReconciler.reconcile(new Request("mockedNamespace", "mockedIngress")); + ArgumentCaptor selectorCaptor = ArgumentCaptor.forClass(SelectorData.class); + verify(shenyuCacheRepository).saveOrUpdateSelectorData(selectorCaptor.capture()); + Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("https://")); + Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("http://")); + } + /** * Test reconcile after ingress deletion. */ diff --git a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java index 74639e616664..e2df9aee00c6 100644 --- a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java +++ b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java @@ -35,12 +35,14 @@ import io.kubernetes.client.openapi.models.V1Service; import io.kubernetes.client.openapi.models.V1ServiceBuilder; import org.apache.shenyu.common.config.ssl.ShenyuSniAsyncMapping; +import org.apache.shenyu.common.dto.SelectorData; import org.apache.shenyu.k8s.parser.IngressParser; import org.apache.shenyu.k8s.reconciler.IngressReconciler; import org.apache.shenyu.k8s.repository.ShenyuCacheRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import java.util.HashMap; import java.util.Map; @@ -192,4 +194,22 @@ public void testParseSkipsContextPathWhenDubboEnabled() { IngressParser ingressParser = new IngressParser(serviceInformer, endpointsInformer); Assertions.assertEquals(1, ingressParser.parse(ingress, mock(io.kubernetes.client.openapi.apis.CoreV1Api.class)).size()); } + + /** + * test reconcile with fewer protocols than endpoints. + */ + @Test + public void testReconcileWithFewerProtocolsThanEndpoints() { + V1Ingress ingress = ingressInformer.getIndexer().getByKey("mockedNamespace/mockedIngress"); + Map annotations = ingress.getMetadata().getAnnotations(); + annotations.put("shenyu.apache.org/upstreams-protocol", "dubbo+ssl://"); + V1Endpoints endpoints = endpointsInformer.getIndexer().getByKey("mockedNamespace/testService"); + endpoints.getSubsets().get(0).setAddresses(java.util.Arrays.asList( + new V1EndpointAddress().ip("127.0.0.1"), new V1EndpointAddress().ip("127.0.0.2"))); + ingressReconciler.reconcile(new Request("mockedNamespace", "mockedIngress")); + ArgumentCaptor selectorCaptor = ArgumentCaptor.forClass(SelectorData.class); + verify(shenyuCacheRepository).saveOrUpdateSelectorData(selectorCaptor.capture()); + Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("dubbo+ssl://")); + Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("dubbo://")); + } }