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));
+ }
}