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

zhangliang 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 d804e040d14 Add more test cases on ReadwriteSplittingSQLRouterTest 
(#38254)
d804e040d14 is described below

commit d804e040d14d83e94faa3090505136a8ebe5ceeb
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Feb 27 22:44:55 2026 +0800

    Add more test cases on ReadwriteSplittingSQLRouterTest (#38254)
    
    * Add more test cases on ReadwriteSplittingSQLRouterTest
    
    * Add more test cases on 
QualifiedReadwriteSplittingTransactionalDataSourceRouterTest
    
    * Add more test cases on 
QualifiedReadwriteSplittingTransactionalDataSourceRouterTest
---
 .../route/ReadwriteSplittingSQLRouterTest.java     | 71 ++++++++++------------
 ...SplittingTransactionalDataSourceRouterTest.java | 55 +++++++++--------
 .../rule/ReadwriteSplittingRuleTest.java           |  6 ++
 3 files changed, 67 insertions(+), 65 deletions(-)

diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingSQLRouterTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingSQLRouterTest.java
index 11c8c2f29c7..c09f82e3991 100644
--- 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingSQLRouterTest.java
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/ReadwriteSplittingSQLRouterTest.java
@@ -17,16 +17,15 @@
 
 package org.apache.shardingsphere.readwritesplitting.route;
 
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
-import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.route.SQLRouter;
+import org.apache.shardingsphere.infra.route.SQLRouter.Type;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
@@ -46,15 +45,16 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
+import java.util.List;
 import java.util.Optional;
 import java.util.Properties;
 
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -62,14 +62,6 @@ import static org.mockito.Mockito.when;
 @ExtendWith(MockitoExtension.class)
 class ReadwriteSplittingSQLRouterTest {
     
-    private static final String DATASOURCE_NAME = "ds";
-    
-    private static final String NONE_READWRITE_SPLITTING_DATASOURCE_NAME = 
"noneReadwriteSplittingDataSource";
-    
-    private static final String WRITE_DATASOURCE = "write";
-    
-    private static final String READ_DATASOURCE = "read";
-    
     private ReadwriteSplittingRule staticRule;
     
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -79,23 +71,22 @@ class ReadwriteSplittingSQLRouterTest {
     
     @BeforeEach
     void setUp() {
-        staticRule = new ReadwriteSplittingRule("logic_db", new 
ReadwriteSplittingRuleConfiguration(Collections.singleton(new 
ReadwriteSplittingDataSourceGroupRuleConfiguration(DATASOURCE_NAME,
-                WRITE_DATASOURCE, Collections.singletonList(READ_DATASOURCE), 
"")), Collections.emptyMap()), mock(ComputeNodeInstanceContext.class));
+        staticRule = new ReadwriteSplittingRule("logic_db", new 
ReadwriteSplittingRuleConfiguration(
+                Collections.singleton(new 
ReadwriteSplittingDataSourceGroupRuleConfiguration("ds", "write", 
Collections.singletonList("read"), "")), Collections.emptyMap()), mock());
         
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         sqlRouter = (ReadwriteSplittingSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(staticRule)).get(staticRule);
     }
     
     @Test
     void assertDecorateRouteContextToPrimaryDataSource() {
-        RouteContext actual = mockRouteContext();
+        RouteContext routeContext = mockRouteContext();
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class));
         RuleMetaData ruleMetaData = new 
RuleMetaData(Collections.singleton(staticRule));
-        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
-                mock(DatabaseType.class), mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), ruleMetaData, Collections.emptyList());
-        sqlRouter.decorateRouteContext(actual, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
-        Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
-        assertThat(routedDataSourceNames.next(), 
is(NONE_READWRITE_SPLITTING_DATASOURCE_NAME));
-        assertThat(routedDataSourceNames.next(), is(WRITE_DATASOURCE));
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(), mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), ruleMetaData, 
Collections.emptyList());
+        sqlRouter.decorateRouteContext(routeContext, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
+        List<String> routedDataSourceNames = new 
ArrayList<>(routeContext.getActualDataSourceNames());
+        assertThat(routedDataSourceNames.get(0), 
is("noneReadwriteSplittingDataSource"));
+        assertThat(routedDataSourceNames.get(1), is("write"));
     }
     
     @Test
@@ -107,25 +98,32 @@ class ReadwriteSplittingSQLRouterTest {
         
when(connectionContext.getTransactionContext()).thenReturn(mock(TransactionConnectionContext.class));
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext(), connectionContext, 
mock(ShardingSphereMetaData.class));
         RuleMetaData ruleMetaData = new 
RuleMetaData(Collections.singleton(staticRule));
-        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(DatabaseType.class), mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), 
ruleMetaData, Collections.emptyList());
-        RouteContext actual = mockRouteContext();
-        sqlRouter.decorateRouteContext(actual, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
-        assertThat(actual.getActualDataSourceNames(), is(new 
HashSet<>(Arrays.asList(NONE_READWRITE_SPLITTING_DATASOURCE_NAME, 
READ_DATASOURCE))));
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(), mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), ruleMetaData, 
Collections.emptyList());
+        RouteContext routeContext = mockRouteContext();
+        sqlRouter.decorateRouteContext(routeContext, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
+        assertThat(routeContext.getActualDataSourceNames(), is(new 
HashSet<>(Arrays.asList("noneReadwriteSplittingDataSource", "read"))));
     }
     
     @Test
     void assertDecorateRouteContextToPrimaryDataSourceWithLock() {
-        RouteContext actual = mockRouteContext();
+        RouteContext routeContext = mockRouteContext();
         SelectStatement selectStatement = mock(SelectStatement.class);
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         
when(selectStatement.getLock()).thenReturn(Optional.of(mock(LockSegment.class)));
+        
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class));
         RuleMetaData ruleMetaData = new 
RuleMetaData(Collections.singleton(staticRule));
-        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(DatabaseType.class), mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), 
ruleMetaData, Collections.emptyList());
-        sqlRouter.decorateRouteContext(actual, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
-        Iterator<String> routedDataSourceNames = 
actual.getActualDataSourceNames().iterator();
-        assertThat(routedDataSourceNames.next(), 
is(NONE_READWRITE_SPLITTING_DATASOURCE_NAME));
-        assertThat(routedDataSourceNames.next(), is(WRITE_DATASOURCE));
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
mock(), mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), ruleMetaData, 
Collections.emptyList());
+        sqlRouter.decorateRouteContext(routeContext, queryContext, database, 
staticRule, Collections.emptyList(), new ConfigurationProperties(new 
Properties()));
+        List<String> routedDataSourceNames = new 
ArrayList<>(routeContext.getActualDataSourceNames());
+        assertThat(routedDataSourceNames.get(0), 
is("noneReadwriteSplittingDataSource"));
+        assertThat(routedDataSourceNames.get(1), is("write"));
+    }
+    
+    private RouteContext mockRouteContext() {
+        RouteContext result = new RouteContext();
+        result.getRouteUnits().add(new RouteUnit(new RouteMapper("ds", "ds"), 
Collections.singleton(new RouteMapper("table", "table_0"))));
+        result.getRouteUnits().add(new RouteUnit(new 
RouteMapper("noneReadwriteSplittingDataSource", 
"noneReadwriteSplittingDataSource"), Collections.emptyList()));
+        return result;
     }
     
     private ConnectionContext mockConnectionContext() {
@@ -134,11 +132,8 @@ class ReadwriteSplittingSQLRouterTest {
         return result;
     }
     
-    private RouteContext mockRouteContext() {
-        RouteContext result = new RouteContext();
-        RouteUnit routeUnit = new RouteUnit(new RouteMapper(DATASOURCE_NAME, 
DATASOURCE_NAME), Collections.singleton(new RouteMapper("table", "table_0")));
-        result.getRouteUnits().add(routeUnit);
-        result.getRouteUnits().add(new RouteUnit(new 
RouteMapper(NONE_READWRITE_SPLITTING_DATASOURCE_NAME, 
NONE_READWRITE_SPLITTING_DATASOURCE_NAME), Collections.emptyList()));
-        return result;
+    @Test
+    void assertGetType() {
+        assertThat(sqlRouter.getType(), is(Type.DATA_SOURCE));
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/qualified/type/QualifiedReadwriteSplittingTransactionalDataSourceRouterTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/qualified/type/QualifiedReadwriteSplittingTransactionalDataSourceRouterTest.java
index c43eb68c1c4..04323bb746c 100644
--- 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/qualified/type/QualifiedReadwriteSplittingTransactionalDataSourceRouterTest.java
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/route/qualified/type/QualifiedReadwriteSplittingTransactionalDataSourceRouterTest.java
@@ -18,58 +18,59 @@
 package org.apache.shardingsphere.readwritesplitting.route.qualified.type;
 
 import 
org.apache.shardingsphere.infra.algorithm.loadbalancer.round.robin.RoundRobinLoadBalanceAlgorithm;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
+import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionManager;
 import 
org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceGroupRule;
 import 
org.apache.shardingsphere.readwritesplitting.transaction.TransactionalReadQueryStrategy;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.stream.Stream;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 
 class QualifiedReadwriteSplittingTransactionalDataSourceRouterTest {
     
     @Test
     void assertIsQualified() {
-        assertFalse(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(new 
ConnectionContext(Collections::emptySet)).isQualified(null, null, 
mock(HintValueContext.class)));
+        assertFalse(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(new 
ConnectionContext(Collections::emptySet)).isQualified(null, null, null));
     }
     
     @Test
-    void assertRouteWithFixedAndWithoutReadWriteSplitReplicaRoute() {
-        ReadwriteSplittingDataSourceGroupRuleConfiguration 
dataSourceGroupConfig = createDataSourceGroupRuleConfiguration();
-        ReadwriteSplittingDataSourceGroupRule rule = new 
ReadwriteSplittingDataSourceGroupRule(dataSourceGroupConfig, 
TransactionalReadQueryStrategy.FIXED, new RoundRobinLoadBalanceAlgorithm());
-        assertThat(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(new 
ConnectionContext(Collections::emptySet)).route(rule), is("read_ds0"));
-    }
-    
-    @Test
-    void assertRouteWithFixedAndWithReadWriteSplitReplicaRoute() {
-        ReadwriteSplittingDataSourceGroupRuleConfiguration 
dataSourceGroupConfig = createDataSourceGroupRuleConfiguration();
-        ReadwriteSplittingDataSourceGroupRule rule = new 
ReadwriteSplittingDataSourceGroupRule(dataSourceGroupConfig, 
TransactionalReadQueryStrategy.FIXED, new RoundRobinLoadBalanceAlgorithm());
+    void assertIsQualifiedInTransaction() {
         ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);
-        
connectionContext.getTransactionContext().setReadWriteSplitReplicaRoute("read_ds1");
-        assertThat(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(connectionContext).route(rule),
 is("read_ds1"));
-    }
-    
-    @Test
-    void assertRouteWithDynamic() {
-        ReadwriteSplittingDataSourceGroupRuleConfiguration 
dataSourceGroupConfig = createDataSourceGroupRuleConfiguration();
-        ReadwriteSplittingDataSourceGroupRule rule = new 
ReadwriteSplittingDataSourceGroupRule(dataSourceGroupConfig, 
TransactionalReadQueryStrategy.DYNAMIC, new RoundRobinLoadBalanceAlgorithm());
-        assertThat(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(new 
ConnectionContext(Collections::emptySet)).route(rule), is("read_ds0"));
+        connectionContext.getTransactionContext().beginTransaction("LOCAL", 
mock(TransactionManager.class));
+        assertTrue(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(connectionContext).isQualified(null,
 null, null));
     }
     
-    @Test
-    void assertRouteWithPrimary() {
-        ReadwriteSplittingDataSourceGroupRule rule = new 
ReadwriteSplittingDataSourceGroupRule(createDataSourceGroupRuleConfiguration(), 
TransactionalReadQueryStrategy.PRIMARY, null);
-        assertThat(new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(new 
ConnectionContext(Collections::emptySet)).route(rule), is("write_ds"));
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("routeArguments")
+    void assertRoute(final String name, final TransactionalReadQueryStrategy 
transactionalReadQueryStrategy, final String readWriteSplitReplicaRoute, final 
String expectedDataSourceName) {
+        ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);
+        if (null != readWriteSplitReplicaRoute) {
+            
connectionContext.getTransactionContext().setReadWriteSplitReplicaRoute(readWriteSplitReplicaRoute);
+        }
+        ReadwriteSplittingDataSourceGroupRule rule = new 
ReadwriteSplittingDataSourceGroupRule(
+                new 
ReadwriteSplittingDataSourceGroupRuleConfiguration("foo_group", "write_ds", 
Arrays.asList("read_ds0", "read_ds1"), null), transactionalReadQueryStrategy,
+                TransactionalReadQueryStrategy.PRIMARY == 
transactionalReadQueryStrategy ? null : new RoundRobinLoadBalanceAlgorithm());
+        String actualDataSourceName = new 
QualifiedReadwriteSplittingTransactionalDataSourceRouter(connectionContext).route(rule);
+        assertThat(actualDataSourceName, is(expectedDataSourceName));
     }
     
-    private ReadwriteSplittingDataSourceGroupRuleConfiguration 
createDataSourceGroupRuleConfiguration() {
-        return new 
ReadwriteSplittingDataSourceGroupRuleConfiguration("foo_group", "write_ds", 
Arrays.asList("read_ds0", "read_ds1"), null);
+    private static Stream<Arguments> routeArguments() {
+        return Stream.of(
+                Arguments.of("fixed without route", 
TransactionalReadQueryStrategy.FIXED, null, "read_ds0"),
+                Arguments.of("fixed with route", 
TransactionalReadQueryStrategy.FIXED, "read_ds1", "read_ds1"),
+                Arguments.of("dynamic", 
TransactionalReadQueryStrategy.DYNAMIC, null, "read_ds0"),
+                Arguments.of("primary", 
TransactionalReadQueryStrategy.PRIMARY, null, "write_ds"));
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
index 22d4de66673..39ac38a9b9f 100644
--- 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourc
 import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
 import 
org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration;
+import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
 import 
org.apache.shardingsphere.readwritesplitting.exception.actual.InvalidReadwriteSplittingActualDataSourceInlineExpressionException;
 import org.junit.jupiter.api.Test;
 
@@ -125,4 +126,9 @@ class ReadwriteSplittingRuleTest {
         
assertThat(actual.get().getReadwriteSplittingGroup().getReadDataSources(), 
is(Arrays.asList("read_ds_0", "read_ds_1", "read_ds_2", "read_ds_3")));
         assertThat(actual.get().getLoadBalancer().getType(), is("RANDOM"));
     }
+    
+    @Test
+    void assertGetOrder() {
+        assertThat(createReadwriteSplittingRule().getOrder(), 
is(ReadwriteSplittingOrder.ORDER));
+    }
 }

Reply via email to