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

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


The following commit(s) were added to refs/heads/master by this push:
     new f30ea291aa3 Add test cases on ReadwriteSplittingDataSourceRouter 
(#32854)
f30ea291aa3 is described below

commit f30ea291aa3c086c634ab73cbc414f7f46e33da0
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Sep 13 19:13:44 2024 +0800

    Add test cases on ReadwriteSplittingDataSourceRouter (#32854)
---
 .../route/ReadwriteSplittingDataSourceRouter.java  | 17 +++--
 .../ReadwriteSplittingDataSourceRouterTest.java    | 83 ++++++++++++++++++++++
 2 files changed, 91 insertions(+), 9 deletions(-)

diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouter.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouter.java
index 6bed86521de..ae371eb5894 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouter.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouter.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.readwritesplitting.route;
 
-import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
@@ -33,30 +32,30 @@ import java.util.Collection;
 /**
  * Data source router for readwrite-splitting.
  */
-@RequiredArgsConstructor
 public final class ReadwriteSplittingDataSourceRouter {
     
     private final ReadwriteSplittingDataSourceGroupRule rule;
     
-    private final ConnectionContext connectionContext;
+    private final Collection<QualifiedReadwriteSplittingDataSourceRouter> 
qualifiedRouters;
+    
+    public ReadwriteSplittingDataSourceRouter(final 
ReadwriteSplittingDataSourceGroupRule rule, final ConnectionContext 
connectionContext) {
+        this.rule = rule;
+        qualifiedRouters = Arrays.asList(new 
QualifiedReadwriteSplittingPrimaryDataSourceRouter(), new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(connectionContext));
+    }
     
     /**
      * Route.
      *
      * @param sqlStatementContext SQL statement context
      * @param hintValueContext hint value context
-     * @return data source name
+     * @return routed data source name
      */
     public String route(final SQLStatementContext sqlStatementContext, final 
HintValueContext hintValueContext) {
-        for (QualifiedReadwriteSplittingDataSourceRouter each : 
getQualifiedRouters(connectionContext)) {
+        for (QualifiedReadwriteSplittingDataSourceRouter each : 
qualifiedRouters) {
             if (each.isQualified(sqlStatementContext, rule, hintValueContext)) 
{
                 return each.route(rule);
             }
         }
         return new StandardReadwriteSplittingDataSourceRouter().route(rule);
     }
-    
-    private Collection<QualifiedReadwriteSplittingDataSourceRouter> 
getQualifiedRouters(final ConnectionContext connectionContext) {
-        return Arrays.asList(new 
QualifiedReadwriteSplittingPrimaryDataSourceRouter(), new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(connectionContext));
-    }
 }
diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouterTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouterTest.java
new file mode 100644
index 00000000000..ddb56b78533
--- /dev/null
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingDataSourceRouterTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.shardingsphere.readwritesplitting.route;
+
+import lombok.SneakyThrows;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import 
org.apache.shardingsphere.readwritesplitting.route.qualified.QualifiedReadwriteSplittingDataSourceRouter;
+import 
org.apache.shardingsphere.readwritesplitting.route.standard.filter.ReadDataSourcesFilter;
+import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceGroupRule;
+import org.apache.shardingsphere.test.mock.AutoMockExtension;
+import org.apache.shardingsphere.test.mock.StaticMockSettings;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+
+import java.lang.reflect.Field;
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(AutoMockExtension.class)
+@StaticMockSettings(ShardingSphereServiceLoader.class)
+class ReadwriteSplittingDataSourceRouterTest {
+    
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private ReadwriteSplittingDataSourceGroupRule rule;
+    
+    @Mock
+    private SQLStatementContext sqlStatementContext;
+    
+    @Mock
+    private HintValueContext hintValueContext;
+    
+    @Test
+    void assertRouteWithQualifiedRouters() {
+        ReadwriteSplittingDataSourceRouter router = new 
ReadwriteSplittingDataSourceRouter(rule, mock(ConnectionContext.class));
+        QualifiedReadwriteSplittingDataSourceRouter qualifiedRouter = 
mock(QualifiedReadwriteSplittingDataSourceRouter.class);
+        when(qualifiedRouter.isQualified(sqlStatementContext, rule, 
hintValueContext)).thenReturn(true);
+        when(qualifiedRouter.route(rule)).thenReturn("qualified_ds");
+        setQualifiedRouters(router, qualifiedRouter);
+        assertThat(router.route(sqlStatementContext, hintValueContext), 
is("qualified_ds"));
+    }
+    
+    @Test
+    void assertRouteWithStandardRouters() {
+        when(rule.getLoadBalancer().getTargetName(any(), 
any())).thenReturn("standard_ds");
+        ReadwriteSplittingDataSourceRouter router = new 
ReadwriteSplittingDataSourceRouter(rule, mock(ConnectionContext.class));
+        setQualifiedRouters(router, 
mock(QualifiedReadwriteSplittingDataSourceRouter.class));
+        
when(ShardingSphereServiceLoader.getServiceInstances(ReadDataSourcesFilter.class)).thenReturn(Collections.emptyList());
+        assertThat(router.route(sqlStatementContext, hintValueContext), 
is("standard_ds"));
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private void setQualifiedRouters(final ReadwriteSplittingDataSourceRouter 
router, final QualifiedReadwriteSplittingDataSourceRouter qualifiedRouter) {
+        Field field = router.getClass().getDeclaredField("qualifiedRouters");
+        field.setAccessible(true);
+        field.set(router, Collections.singleton(qualifiedRouter));
+        field.setAccessible(false);
+    }
+}

Reply via email to