This is an automated email from the ASF dual-hosted git repository.

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new ec06eb6a68  fix: guard ingress upstream protocol index (#6864) (#6966)
ec06eb6a68 is described below

commit ec06eb6a686c62e3184af46ebb290a0e2ebf84dd
Author: Southern <[email protected]>
AuthorDate: Mon Oct 12 09:12:24 2026 +0800

     fix: guard ingress upstream protocol index (#6864) (#6966)
---
 .../shenyu/k8s/DivideIngressReconcilerTest.java    | 25 ++++++++++++++++++++
 .../org/apache/shenyu/k8s/DubboReconcilerTest.java | 27 ++++++++++++++++++++++
 2 files changed, 52 insertions(+)

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 c5e8430ed3..185ad79436 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.V1EndpointsBuilder;
 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.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.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 final class DivideIngressReconcilerTest {
         verify(shenyuCacheRepository).saveOrUpdateRuleData(any());
     }
 
+    /**
+     * test reconcile with fewer protocols than endpoints.
+     */
+    @Test
+    public void testReconcileWithFewerProtocolsThanEndpoints() {
+        V1Ingress ingress = 
ingressInformer.getIndexer().getByKey("mockedNamespace/mockedIngress");
+        Map<String, String> 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<SelectorData> 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 50220f60ab..e9231ea755 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,6 +35,9 @@ import io.kubernetes.client.openapi.models.V1Secret;
 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.common.dto.convert.selector.DubboUpstream;
+import org.apache.shenyu.common.utils.GsonUtils;
 import org.apache.shenyu.k8s.cache.IngressCache;
 import org.apache.shenyu.k8s.parser.IngressParser;
 import org.apache.shenyu.k8s.reconciler.IngressReconciler;
@@ -42,8 +45,10 @@ 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.List;
 import java.util.Map;
 
 import static org.mockito.Mockito.any;
@@ -230,4 +235,26 @@ public final class DubboReconcilerTest {
         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(NAMESPACE + 
"/" + INGRESS_NAME);
+        Map<String, String> annotations = 
ingress.getMetadata().getAnnotations();
+        annotations.put("shenyu.apache.org/upstreams-protocol", 
"dubbo+ssl://");
+        V1Endpoints endpoints = 
endpointsInformer.getIndexer().getByKey(NAMESPACE + "/" + SERVICE_NAME);
+        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(NAMESPACE, INGRESS_NAME));
+        ArgumentCaptor<SelectorData> selectorCaptor = 
ArgumentCaptor.forClass(SelectorData.class);
+        
verify(shenyuCacheRepository).saveOrUpdateSelectorData(selectorCaptor.capture());
+        List<DubboUpstream> upstreams = 
GsonUtils.getInstance().fromList(selectorCaptor.getValue().getHandle(), 
DubboUpstream.class);
+        Assertions.assertEquals(2, upstreams.size());
+        Assertions.assertEquals("127.0.0.1:20888", 
upstreams.get(0).getUpstreamUrl());
+        Assertions.assertEquals("dubbo+ssl://", 
upstreams.get(0).getProtocol());
+        Assertions.assertEquals("127.0.0.2:20888", 
upstreams.get(1).getUpstreamUrl());
+        Assertions.assertEquals("dubbo://", upstreams.get(1).getProtocol());
+    }
 }

Reply via email to