This is an automated email from the ASF dual-hosted git repository.
totalo 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 6beb5c54193 Add test cases on ConnectionTransaction (#33085)
6beb5c54193 is described below
commit 6beb5c541935ed8644d3856709d775e1265c1c8f
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Oct 1 19:33:59 2024 +0800
Add test cases on ConnectionTransaction (#33085)
* Add test cases on ConnectionTransaction
* Add test cases on ConnectionTransaction
---
.../transaction/ConnectionTransaction.java | 2 +-
.../transaction/ConnectionTransactionTest.java | 156 +++++++++++++++++----
2 files changed, 129 insertions(+), 29 deletions(-)
diff --git
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java
index 262074d4f7b..8b91a4cf40b 100644
---
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java
+++
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionTransaction.java
@@ -52,7 +52,7 @@ public final class ConnectionTransaction {
* @return in transaction or not
*/
public boolean isInTransaction(final TransactionConnectionContext
transactionContext) {
- return transactionContext.isInTransaction() && null !=
distributionTransactionManager &&
distributionTransactionManager.isInTransaction();
+ return transactionContext.isInTransaction() && isInTransaction();
}
/**
diff --git
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java
index 844bdd5fc86..b84be80faac 100644
---
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java
+++
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionTransactionTest.java
@@ -19,60 +19,160 @@ package org.apache.shardingsphere.transaction;
import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
import
org.apache.shardingsphere.transaction.ConnectionTransaction.DistributedTransactionOperationType;
-import
org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
+import org.apache.shardingsphere.transaction.api.TransactionType;
import org.apache.shardingsphere.transaction.rule.TransactionRule;
+import
org.apache.shardingsphere.transaction.spi.ShardingSphereDistributionTransactionManager;
import org.junit.jupiter.api.Test;
-import java.util.Collections;
-import java.util.Properties;
+import java.sql.Connection;
+import java.sql.SQLException;
import static org.hamcrest.CoreMatchers.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.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
class ConnectionTransactionTest {
- private ConnectionTransaction connectionTransaction;
+ @Test
+ void assertIsNotInTransactionWhenTransactionIsNotBegin() {
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ assertFalse(new ConnectionTransaction(mock(TransactionRule.class,
RETURNS_DEEP_STUBS), context).isInTransaction(context));
+ }
+
+ @Test
+ void assertIsNotInTransactionWhenIsNotDistributionTransaction() {
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ context.beginTransaction("LOCAL");
+ assertFalse(new ConnectionTransaction(mock(TransactionRule.class),
context).isInTransaction(context));
+ }
@Test
- void assertDistributedTransactionOperationTypeCommit() {
- connectionTransaction = new
ConnectionTransaction(getXATransactionRule(), new
TransactionConnectionContext());
- DistributedTransactionOperationType operationType =
connectionTransaction.getDistributedTransactionOperationType(true);
- assertThat(operationType,
is(DistributedTransactionOperationType.COMMIT));
+ void assertIsNotInTransactionWhenDistributionTransactionIsNotBegin() {
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ context.beginTransaction("XA");
+ assertFalse(new ConnectionTransaction(mock(TransactionRule.class,
RETURNS_DEEP_STUBS), context).isInTransaction(context));
}
@Test
- void assertDistributedTransactionOperationTypeIgnore() {
- connectionTransaction = new
ConnectionTransaction(getXATransactionRule(), new
TransactionConnectionContext());
- DistributedTransactionOperationType operationType =
connectionTransaction.getDistributedTransactionOperationType(false);
- assertThat(operationType,
is(DistributedTransactionOperationType.IGNORE));
+ void assertIsInTransaction() {
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ context.beginTransaction("XA");
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true);
+ assertTrue(new ConnectionTransaction(rule,
context).isInTransaction(context));
}
@Test
void assertIsLocalTransaction() {
- connectionTransaction = new
ConnectionTransaction(getLocalTransactionRule(), new
TransactionConnectionContext());
- assertTrue(connectionTransaction.isLocalTransaction());
- connectionTransaction = new
ConnectionTransaction(getXATransactionRule(), new
TransactionConnectionContext());
- assertFalse(connectionTransaction.isLocalTransaction());
+ TransactionRule rule = mock(TransactionRule.class);
+ when(rule.getDefaultType()).thenReturn(TransactionType.LOCAL);
+ assertTrue(new ConnectionTransaction(rule, new
TransactionConnectionContext()).isLocalTransaction());
}
@Test
- void assertIsHoldTransaction() {
- connectionTransaction = new
ConnectionTransaction(getLocalTransactionRule(), new
TransactionConnectionContext());
- assertTrue(connectionTransaction.isHoldTransaction(false));
- connectionTransaction = new
ConnectionTransaction(getXATransactionRule(), new
TransactionConnectionContext());
- assertTrue(connectionTransaction.isInTransaction());
- assertTrue(connectionTransaction.isHoldTransaction(true));
- connectionTransaction = new
ConnectionTransaction(getLocalTransactionRule(), new
TransactionConnectionContext());
- assertFalse(connectionTransaction.isHoldTransaction(true));
+ void assertIsNotLocalTransaction() {
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+ when(rule.getDefaultType()).thenReturn(TransactionType.XA);
+ assertFalse(new ConnectionTransaction(rule, new
TransactionConnectionContext()).isLocalTransaction());
}
- private TransactionRule getLocalTransactionRule() {
- return new TransactionRule(new TransactionRuleConfiguration("LOCAL",
null, new Properties()), Collections.emptyMap());
+ @Test
+ void assertIsHoldTransactionWithLocalAndNotAutoCommit() {
+ TransactionRule rule = mock(TransactionRule.class);
+ when(rule.getDefaultType()).thenReturn(TransactionType.LOCAL);
+ assertTrue(new ConnectionTransaction(rule, new
TransactionConnectionContext()).isHoldTransaction(false));
}
- private TransactionRule getXATransactionRule() {
- return new TransactionRule(new TransactionRuleConfiguration("XA",
"Atomikos", new Properties()), Collections.emptyMap());
+ @Test
+ void assertIsHoldTransactionWithXAAndAutoCommit() {
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+ when(rule.getDefaultType()).thenReturn(TransactionType.XA);
+
when(rule.getResource().getTransactionManager(TransactionType.XA).isInTransaction()).thenReturn(true);
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ context.beginTransaction("XA");
+ assertTrue(new ConnectionTransaction(rule,
context).isHoldTransaction(true));
+ }
+
+ @Test
+ void assertBegin() {
+ ShardingSphereDistributionTransactionManager
distributionTransactionManager =
mock(ShardingSphereDistributionTransactionManager.class);
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType())).thenReturn(distributionTransactionManager);
+ new ConnectionTransaction(rule, new
TransactionConnectionContext()).begin();
+ verify(distributionTransactionManager).begin();
+ }
+
+ @Test
+ void assertCommit() {
+ ShardingSphereDistributionTransactionManager
distributionTransactionManager =
mock(ShardingSphereDistributionTransactionManager.class);
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType())).thenReturn(distributionTransactionManager);
+ new ConnectionTransaction(rule, new
TransactionConnectionContext()).commit();
+ verify(distributionTransactionManager).commit(false);
+ }
+
+ @Test
+ void assertRollback() {
+ ShardingSphereDistributionTransactionManager
distributionTransactionManager =
mock(ShardingSphereDistributionTransactionManager.class);
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType())).thenReturn(distributionTransactionManager);
+ new ConnectionTransaction(rule, new
TransactionConnectionContext()).rollback();
+ verify(distributionTransactionManager).rollback();
+ }
+
+ @Test
+ void assertIsHoldTransactionWithLocalAndAutoCommit() {
+ TransactionRule rule = mock(TransactionRule.class);
+ when(rule.getDefaultType()).thenReturn(TransactionType.LOCAL);
+ assertFalse(new ConnectionTransaction(rule, new
TransactionConnectionContext()).isHoldTransaction(true));
+ }
+
+ @Test
+ void assertGetConnectionWithoutInDistributeTransaction() throws
SQLException {
+ TransactionRule rule = mock(TransactionRule.class);
+ when(rule.getDefaultType()).thenReturn(TransactionType.LOCAL);
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ assertFalse(new ConnectionTransaction(rule,
context).getConnection("foo_db", "foo_ds", context).isPresent());
+ }
+
+ @Test
+ void assertGetConnectionWithInDistributeTransaction() throws SQLException {
+ TransactionConnectionContext context = new
TransactionConnectionContext();
+ context.beginTransaction("XA");
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType()).getConnection("foo_db",
"foo_ds")).thenReturn(mock(Connection.class));
+ assertTrue(new ConnectionTransaction(rule,
context).getConnection("foo_db", "foo_ds", context).isPresent());
+ }
+
+ @Test
+ void assertGetDistributedTransactionBeginOperationType() {
+ assertThat(new ConnectionTransaction(mock(TransactionRule.class,
RETURNS_DEEP_STUBS), new
TransactionConnectionContext()).getDistributedTransactionOperationType(false),
+ is(DistributedTransactionOperationType.BEGIN));
+ }
+
+ @Test
+ void assertGetDistributedTransactionCommitOperationType() {
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true);
+ assertThat(new ConnectionTransaction(rule, new
TransactionConnectionContext()).getDistributedTransactionOperationType(true),
is(DistributedTransactionOperationType.COMMIT));
+ }
+
+ @Test
+ void assertDistributedTransactionIgnoreOperationTypeWhenIsAutoCommit() {
+ TransactionRule rule = mock(TransactionRule.class, RETURNS_DEEP_STUBS);
+
when(rule.getResource().getTransactionManager(rule.getDefaultType()).isInTransaction()).thenReturn(true);
+ assertThat(new ConnectionTransaction(rule, new
TransactionConnectionContext()).getDistributedTransactionOperationType(false),
is(DistributedTransactionOperationType.IGNORE));
+ }
+
+ @Test
+ void
assertDistributedTransactionIgnoreOperationTypeWhenIsNotInDistributedTransaction()
{
+ ConnectionTransaction connectionTransaction = new
ConnectionTransaction(mock(TransactionRule.class, RETURNS_DEEP_STUBS), new
TransactionConnectionContext());
+
assertThat(connectionTransaction.getDistributedTransactionOperationType(true),
is(DistributedTransactionOperationType.IGNORE));
}
}