diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index bd36a279c2b..13c6ed085d5 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -9,7 +9,7 @@ Add changes here for all PR submitted to the 2.x branch.
- [[#PR_NO](https://github.com/seata/seata/pull/PR_NO)] A brief and accurate description of PR
### optimize:
-- [[#PR_NO](https://github.com/seata/seata/pull/PR_NO)] A brief and accurate description of PR
+- [[#6031](https://github.com/seata/seata/pull/6031)] add a check for the existence of the undolog table
### security:
- [[#6069](https://github.com/seata/seata/pull/6069)] Upgrade Guava dependencies to fix security vulnerabilities
@@ -21,6 +21,8 @@ Thanks to these contributors for their code commits. Please report an unintended
- [slievrly](https://github.com/slievrly)
+- [laywin](https://github.com/laywin)
- [imcmai](https://github.com/imcmai)
+
Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index f155efa1195..749d418cf23 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -9,7 +9,7 @@
- [[#PR_NO](https://github.com/seata/seata/pull/PR_NO)] 准确简要的PR描述
### optimize:
-- [[#PR_NO](https://github.com/seata/seata/pull/PR_NO)] 准确简要的PR描述
+- [[#6031](https://github.com/seata/seata/pull/6031)] 添加undo_log表的存在性校验
### security:
- [[#6069](https://github.com/seata/seata/pull/6069)] 升级Guava依赖版本,修复安全漏洞
@@ -21,6 +21,7 @@
- [slievrly](https://github.com/slievrly)
+- [laywin](https://github.com/laywin)
- [imcmai](https://github.com/imcmai)
同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
diff --git a/config/seata-config-core/src/test/java/io/seata/config/ConfigFutureTest.java b/config/seata-config-core/src/test/java/io/seata/config/ConfigFutureTest.java
index 60ffb299527..57daca70fb5 100644
--- a/config/seata-config-core/src/test/java/io/seata/config/ConfigFutureTest.java
+++ b/config/seata-config-core/src/test/java/io/seata/config/ConfigFutureTest.java
@@ -21,7 +21,6 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
-import org.mockito.internal.util.reflection.FieldSetter;
import java.lang.reflect.Field;
import java.util.concurrent.CompletableFuture;
@@ -44,7 +43,8 @@ void testGet() throws NoSuchFieldException, IllegalAccessException, ExecutionExc
// mock field
origin = Mockito.spy(origin);
// set mocked field to object
- FieldSetter.setField(configFuture, originField, origin);
+ originField.setAccessible(true);
+ originField.set(configFuture, origin);
Mockito.doThrow(ExecutionException.class).when(origin).get(Mockito.anyLong(), Mockito.any());
Assertions.assertThrows(ShouldNeverHappenException.class, configFuture::get);
diff --git a/core/src/main/java/io/seata/core/constants/DBType.java b/core/src/main/java/io/seata/core/constants/DBType.java
index 49063bb802e..a0171474033 100644
--- a/core/src/main/java/io/seata/core/constants/DBType.java
+++ b/core/src/main/java/io/seata/core/constants/DBType.java
@@ -208,5 +208,4 @@ public static DBType valueof(String dbType) {
}
throw new IllegalArgumentException("unknown dbtype:" + dbType);
}
-
}
diff --git a/dependencies/pom.xml b/dependencies/pom.xml
index d82345a1f4b..166b1aa298d 100644
--- a/dependencies/pom.xml
+++ b/dependencies/pom.xml
@@ -118,7 +118,7 @@
1.4.3
- 2.23.4
+ 4.5.1
3.12.2
9.4.38.v20210224
3.1.7
@@ -701,6 +701,11 @@
mockito-junit-jupiter
${mockito.version}
+
+ org.mockito
+ mockito-inline
+ ${mockito.version}
+
org.assertj
assertj-core
diff --git a/pom.xml b/pom.xml
index f2371a43ce7..4d7b21b35e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,11 @@
mockito-junit-jupiter
test
+
+ org.mockito
+ mockito-inline
+ test
+
org.assertj
assertj-core
diff --git a/rm-datasource/src/main/java/io/seata/rm/RMHandlerAT.java b/rm-datasource/src/main/java/io/seata/rm/RMHandlerAT.java
index 333a121a295..cc9d1971890 100644
--- a/rm-datasource/src/main/java/io/seata/rm/RMHandlerAT.java
+++ b/rm-datasource/src/main/java/io/seata/rm/RMHandlerAT.java
@@ -19,8 +19,6 @@
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import io.seata.common.util.DateUtil;
import io.seata.core.model.BranchType;
@@ -44,8 +42,6 @@ public class RMHandlerAT extends AbstractRMHandler {
private static final int LIMIT_ROWS = 3000;
- private final Map undoLogTableExistRecord = new ConcurrentHashMap<>();
-
@Override
public void handle(UndoLogDeleteRequest request) {
String resourceId = request.getResourceId();
@@ -56,12 +52,6 @@ public void handle(UndoLogDeleteRequest request) {
return;
}
- boolean hasUndoLogTable = undoLogTableExistRecord.computeIfAbsent(resourceId, id -> checkUndoLogTableExist(dataSourceProxy));
- if (!hasUndoLogTable) {
- LOGGER.debug("resource({}) has no undo_log table, UndoLogDeleteRequest will be ignored", resourceId);
- return;
- }
-
Date division = getLogCreated(request.getSaveDays());
UndoLogManager manager = getUndoLogManager(dataSourceProxy);
@@ -80,19 +70,6 @@ public void handle(UndoLogDeleteRequest request) {
}
}
- boolean checkUndoLogTableExist(DataSourceProxy dataSourceProxy) {
- UndoLogManager manager = getUndoLogManager(dataSourceProxy);
- try (Connection connection = getConnection(dataSourceProxy)) {
- if (connection == null) {
- return false;
- }
- return manager.hasUndoLogTable(connection);
- } catch (Exception e) {
- // should never happen, hasUndoLogTable method had catch all Exception
- return false;
- }
- }
-
Connection getConnection(DataSourceProxy dataSourceProxy) {
try {
return dataSourceProxy.getPlainConnection();
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
index 6d930ea4009..295a22e77b5 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
@@ -22,18 +22,25 @@
import javax.sql.DataSource;
+import io.seata.common.ConfigurationKeys;
import io.seata.common.Constants;
+import io.seata.common.loader.EnhancedServiceNotFoundException;
+import io.seata.config.ConfigurationFactory;
import io.seata.core.context.RootContext;
import io.seata.core.model.BranchType;
import io.seata.core.model.Resource;
import io.seata.rm.DefaultResourceManager;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
+import io.seata.rm.datasource.undo.UndoLogManager;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
import io.seata.rm.datasource.util.JdbcUtils;
import io.seata.sqlparser.util.JdbcConstants;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static io.seata.common.DefaultValues.DEFAULT_TRANSACTION_UNDO_LOG_TABLE;
+
/**
* The type Data source proxy.
*
@@ -101,6 +108,8 @@ private void init(DataSource dataSource, String resourceGroupId) {
validMySQLVersion(connection);
checkDerivativeProduct();
}
+ checkUndoLogTableExist(connection);
+
} catch (SQLException e) {
throw new IllegalStateException("can not init dataSource", e);
}
@@ -143,6 +152,31 @@ private boolean isPolardbXProduct() {
return false;
}
+ /**
+ * check existence of undolog table
+ *
+ * if the table not exist fast fail, or else keep silence
+ *
+ * @param conn db connection
+ */
+ private void checkUndoLogTableExist(Connection conn) {
+ UndoLogManager undoLogManager;
+ try {
+ undoLogManager = UndoLogManagerFactory.getUndoLogManager(dbType);
+ } catch (EnhancedServiceNotFoundException e) {
+ String errMsg = String.format("AT mode don't support the the dbtype: %s", dbType);
+ throw new IllegalStateException(errMsg, e);
+ }
+
+ boolean undoLogTableExist = undoLogManager.hasUndoLogTable(conn);
+ if (!undoLogTableExist) {
+ String undoLogTableName = ConfigurationFactory.getInstance()
+ .getConfig(ConfigurationKeys.TRANSACTION_UNDO_LOG_TABLE, DEFAULT_TRANSACTION_UNDO_LOG_TABLE);
+ String errMsg = String.format("in AT mode, %s table not exist", undoLogTableName);
+ throw new IllegalStateException(errMsg);
+ }
+ }
+
/**
* publish tableMeta refresh event
*/
diff --git a/rm-datasource/src/test/java/io/seata/rm/RMHandlerATTest.java b/rm-datasource/src/test/java/io/seata/rm/RMHandlerATTest.java
index 3ae96f51d0d..f3d34f25c22 100644
--- a/rm-datasource/src/test/java/io/seata/rm/RMHandlerATTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/RMHandlerATTest.java
@@ -22,7 +22,10 @@
import org.junit.jupiter.api.Test;
import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Date;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.times;
@@ -41,30 +44,26 @@
class RMHandlerATTest {
@Test
- void hasUndoLogTableTest() {
- RMHandlerAT handler = buildHandler(true);
+ void testNormalDeleteUndoLogTable() throws SQLException {
+ RMHandlerAT handler = buildHandler(false);
UndoLogDeleteRequest request = buildRequest();
int testTimes = 5;
for (int i = 0; i < testTimes; i++) {
handler.handle(request);
}
- verify(handler, times(1)).checkUndoLogTableExist(any());
verify(handler, times(testTimes)).deleteUndoLog(any(), any(), any());
}
@Test
- void noUndoLogTableTest() {
- RMHandlerAT handler = buildHandler(false);
+ void testErrorDeleteUndoLogTable() throws SQLException {
+ RMHandlerAT handler = buildHandler(true);
UndoLogDeleteRequest request = buildRequest();
- int testTimes = 5;
- for (int i = 0; i < testTimes; i++) {
- handler.handle(request);
- }
- verify(handler, times(1)).checkUndoLogTableExist(any());
- verify(handler, never()).deleteUndoLog(any(), any(), any());
+ request.setSaveDays((short) -1);
+ handler.handle(request);
+ verify(handler, times(1)).deleteUndoLog(any(), any(), any());
}
- private RMHandlerAT buildHandler(boolean hasUndoLogTable) {
+ private RMHandlerAT buildHandler(boolean errorDeleteUndologTable) throws SQLException {
RMHandlerAT handler = spy(new RMHandlerAT());
DataSourceManager dataSourceManager = mock(DataSourceManager.class);
doReturn(dataSourceManager).when(handler).getResourceManager();
@@ -78,9 +77,14 @@ private RMHandlerAT buildHandler(boolean hasUndoLogTable) {
});
UndoLogManager manager = mock(UndoLogManager.class);
- when(manager.hasUndoLogTable(any())).thenReturn(hasUndoLogTable);
+ when(manager.hasUndoLogTable(any())).thenReturn(true);
doReturn(manager).when(handler).getUndoLogManager(any());
+ if (errorDeleteUndologTable) {
+ when(manager.deleteUndoLogByLogCreated(any(Date.class), anyInt(), any(Connection.class)))
+ .thenThrow(new SQLException());
+ }
+
return handler;
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/DataSourceProxyTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/DataSourceProxyTest.java
index d8da5d26acf..e351f674bee 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/DataSourceProxyTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/DataSourceProxyTest.java
@@ -16,6 +16,7 @@
package io.seata.rm.datasource;
import java.lang.reflect.Field;
+import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
@@ -23,8 +24,17 @@
import io.seata.rm.datasource.mock.MockDataSource;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
/**
* @author ph3636
@@ -34,7 +44,6 @@ public class DataSourceProxyTest {
@Test
public void test_constructor() {
DataSource dataSource = new MockDataSource();
-
DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
Assertions.assertEquals(dataSourceProxy.getTargetDataSource(), dataSource);
@@ -42,6 +51,42 @@ public void test_constructor() {
Assertions.assertEquals(dataSourceProxy2.getTargetDataSource(), dataSource);
}
+ @Test
+ public void testNotSupportDb() {
+ final MockDriver mockDriver = new MockDriver();
+ final String username = "username";
+ final String jdbcUrl = "jdbc:mock:xxx";
+
+ // create data source
+ final DruidDataSource dataSource = new DruidDataSource();
+ dataSource.setUrl(jdbcUrl);
+ dataSource.setDriver(mockDriver);
+ dataSource.setUsername(username);
+ dataSource.setPassword("password");
+
+ Throwable throwable = Assertions.assertThrows(IllegalStateException.class, () -> new DataSourceProxy(dataSource));
+ assertThat(throwable).hasMessageContaining("AT mode don't support the the dbtype");
+ }
+
+
+ @Test
+ public void testUndologTableNotExist() {
+ DataSource dataSource = new MockDataSource();
+
+ MockedStatic undoLogManagerFactoryMockedStatic = Mockito.mockStatic(UndoLogManagerFactory.class);
+
+ MySQLUndoLogManager mysqlUndoLogManager = mock(MySQLUndoLogManager.class);
+ undoLogManagerFactoryMockedStatic.when(()->UndoLogManagerFactory.getUndoLogManager(anyString()))
+ .thenReturn(mysqlUndoLogManager);
+
+ doReturn(false).when(mysqlUndoLogManager).hasUndoLogTable(any(Connection.class));
+
+ Throwable throwable = Assertions.assertThrows(IllegalStateException.class, () -> new DataSourceProxy(dataSource));
+ undoLogManagerFactoryMockedStatic.close();
+
+ assertThat(throwable).hasMessageContaining("table not exist");
+ }
+
@Test
public void getResourceIdTest() throws SQLException, NoSuchFieldException, IllegalAccessException {
// Disable 'DataSourceProxy.tableMetaExecutor' to prevent unit tests from being affected
@@ -62,7 +107,7 @@ public void getResourceIdTest() throws SQLException, NoSuchFieldException, Illeg
dataSource.setPassword("password");
// create data source proxy
- final DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ final DataSourceProxy proxy = getDataSourceProxy(dataSource);
// get fields
Field resourceIdField = proxy.getClass().getDeclaredField("resourceId");
@@ -124,4 +169,17 @@ public void getResourceIdTest() throws SQLException, NoSuchFieldException, Illeg
jdbcUrlField.set(proxy, jdbcUrl);
}
}
+
+ // to skip the db & undolog table check
+ public static DataSourceProxy getDataSourceProxy(DataSource dataSource) {
+ try (MockedStatic undoLogManagerFactoryMockedStatic = Mockito.mockStatic(UndoLogManagerFactory.class)) {
+ MySQLUndoLogManager mysqlUndoLogManager = mock(MySQLUndoLogManager.class);
+ undoLogManagerFactoryMockedStatic.when(() -> UndoLogManagerFactory.getUndoLogManager(anyString())).thenReturn(mysqlUndoLogManager);
+
+ doReturn(true).when(mysqlUndoLogManager).hasUndoLogTable(any(Connection.class));
+
+ // create data source proxy
+ return new DataSourceProxy(dataSource);
+ }
+ }
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/PreparedStatementProxyTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/PreparedStatementProxyTest.java
index cd7c58cb9df..3ef88b2e1c8 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/PreparedStatementProxyTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/PreparedStatementProxyTest.java
@@ -44,6 +44,8 @@
import io.seata.rm.datasource.mock.MockClob;
import io.seata.rm.datasource.mock.MockConnection;
import io.seata.rm.datasource.mock.MockDriver;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.SQLRecognizerFactory;
import io.seata.sqlparser.SqlParserType;
import io.seata.sqlparser.druid.DruidDelegatingSQLRecognizerFactory;
@@ -54,6 +56,12 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will
@@ -86,8 +94,7 @@ public static void init() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
-
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/StatementProxyTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/StatementProxyTest.java
index 8260ef81e7e..54646a9ddc3 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/StatementProxyTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/StatementProxyTest.java
@@ -31,6 +31,8 @@
import io.seata.rm.datasource.mock.MockConnection;
import io.seata.rm.datasource.mock.MockDriver;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.SQLRecognizerFactory;
import io.seata.sqlparser.SqlParserType;
import io.seata.sqlparser.druid.DruidDelegatingSQLRecognizerFactory;
@@ -44,6 +46,10 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will
@@ -78,7 +84,7 @@ public static void init() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy,
dataSource.getConnection().getConnection());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/DeleteExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/DeleteExecutorTest.java
index 838e73a3448..b3b5ed10554 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/DeleteExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/DeleteExecutorTest.java
@@ -29,13 +29,23 @@
import com.google.common.collect.Lists;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.StatementProxy;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableRecords;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.druid.mysql.MySQLDeleteRecognizer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
/**
* @author will
@@ -66,7 +76,7 @@ public static void init() {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
@@ -101,4 +111,5 @@ public void testAfterImage() throws SQLException {
TableRecords tableRecords = deleteExecutor.beforeImage();
Assertions.assertEquals(0, deleteExecutor.afterImage(tableRecords).size());
}
+
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/MultiExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/MultiExecutorTest.java
index 332bde4985d..980aee46f69 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/MultiExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/MultiExecutorTest.java
@@ -24,6 +24,9 @@
import java.util.Set;
import java.util.stream.Collectors;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -44,6 +47,14 @@
import io.seata.sqlparser.SQLRecognizer;
import io.seata.sqlparser.SQLType;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class MultiExecutorTest {
@@ -73,7 +84,8 @@ public static void init() throws Throwable {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/PlainExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/PlainExecutorTest.java
index 7a2e545b65c..22b18549ca5 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/PlainExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/PlainExecutorTest.java
@@ -24,6 +24,7 @@
import com.google.common.collect.Lists;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.StatementProxy;
import io.seata.rm.datasource.mock.MockDriver;
import org.junit.jupiter.api.BeforeEach;
@@ -56,7 +57,8 @@ public void init() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
StatementProxy statementProxy = new StatementProxy(connectionProxy, mockStatement);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
index 46d4ca0f75a..c53d382f1dd 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/SelectForUpdateExecutorTest.java
@@ -28,14 +28,21 @@
import io.seata.core.context.RootContext;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.StatementProxy;
import io.seata.rm.datasource.mock.MockConnectionProxy;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.mock.MockLockConflictConnectionProxy;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.druid.mysql.MySQLSelectForUpdateRecognizer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will
@@ -69,7 +76,8 @@ public static void init() {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateExecutorTest.java
index c25df6f4e37..973ae530ad1 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateExecutorTest.java
@@ -30,13 +30,22 @@
import com.google.common.collect.Lists;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.StatementProxy;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableRecords;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will
@@ -68,7 +77,8 @@ public static void init() {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateJoinExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
index 971dfd03373..fbde0a4bd96 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/exec/UpdateJoinExecutorTest.java
@@ -29,13 +29,20 @@
import com.google.common.collect.Lists;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.StatementProxy;
import io.seata.rm.datasource.exec.mysql.MySQLUpdateJoinExecutor;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableRecords;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author renliangyu857
@@ -81,7 +88,7 @@ private StatementProxy mockStatementProxy(List returnValueColumnLabels,
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
try {
Field field = dataSourceProxy.getClass().getDeclaredField("dbType");
field.setAccessible(true);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/TableRecordsTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/TableRecordsTest.java
index 61714ca7778..bc02c64016a 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/TableRecordsTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/TableRecordsTest.java
@@ -15,26 +15,25 @@
*/
package io.seata.rm.datasource.sql.struct;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.List;
-
-import io.seata.rm.datasource.exception.TableMetaException;
-import io.seata.sqlparser.struct.TableMeta;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
import com.alibaba.druid.mock.MockStatement;
import com.alibaba.druid.mock.MockStatementBase;
import com.alibaba.druid.pool.DruidDataSource;
import com.google.common.collect.Lists;
-
import io.seata.common.exception.ShouldNeverHappenException;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.exception.TableMetaException;
import io.seata.rm.datasource.mock.MockDriver;
+import io.seata.sqlparser.struct.TableMeta;
import io.seata.sqlparser.util.JdbcConstants;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.List;
/**
* the table records test
@@ -102,8 +101,9 @@ public void testPkRow() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
+
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL).getTableMeta(proxy.getPlainConnection(),
"table_records_test", proxy.getResourceId());
@@ -122,7 +122,7 @@ public void testBuildRecords() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL).getTableMeta(proxy.getPlainConnection(),
"table_records_test", proxy.getResourceId());
@@ -141,7 +141,7 @@ public void testBuildRecordsNewFeild() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
MockStatementBase mockStatement = new MockStatement(dataSource.getConnection().getConnection());
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.MYSQL).getTableMeta(proxy.getPlainConnection(),
"table_records_test", proxy.getResourceId());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/DmTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/DmTableMetaCacheTest.java
index e4319ea5b3f..8973b130516 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/DmTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/DmTableMetaCacheTest.java
@@ -17,6 +17,7 @@
import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import io.seata.sqlparser.struct.TableMeta;
@@ -65,7 +66,7 @@ public void getTableMetaTest() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMetaCache tableMetaCache = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.DM);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MariadbTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MariadbTableMetaCacheTest.java
index a13c9991c8c..01144502bc9 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MariadbTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MariadbTableMetaCacheTest.java
@@ -19,6 +19,9 @@
import java.sql.Types;
import java.util.Collections;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.struct.ColumnMeta;
import io.seata.sqlparser.struct.IndexMeta;
import io.seata.sqlparser.struct.IndexType;
@@ -34,6 +37,10 @@
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* The table meta fetch test.
@@ -84,7 +91,7 @@ public void getTableMetaTest_0() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = getTableMetaCache().getTableMeta(proxy.getPlainConnection(), "mt1", proxy.getResourceId());
@@ -133,7 +140,7 @@ public void refreshTest_0() throws SQLException {
druidDataSource.setUrl("jdbc:mock:xxx");
druidDataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(druidDataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(druidDataSource);
TableMeta tableMeta = getTableMetaCache().getTableMeta(dataSourceProxy.getPlainConnection(), "t1",
dataSourceProxy.getResourceId());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MysqlTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MysqlTableMetaCacheTest.java
index 56928aa6d70..0dbe2400ef7 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MysqlTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/MysqlTableMetaCacheTest.java
@@ -19,6 +19,9 @@
import java.sql.Types;
import java.util.Collections;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -34,6 +37,13 @@
import io.seata.sqlparser.struct.TableMetaCache;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
/**
* The table meta fetch test.
@@ -84,7 +94,7 @@ public void getTableMetaTest_0() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = getTableMetaCache().getTableMeta(proxy.getPlainConnection(), "mt1", proxy.getResourceId());
@@ -133,7 +143,7 @@ public void refreshTest_0() throws SQLException {
druidDataSource.setUrl("jdbc:mock:xxx");
druidDataSource.setDriver(mockDriver);
- DataSourceProxy dataSourceProxy = new DataSourceProxy(druidDataSource);
+ DataSourceProxy dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(druidDataSource);
TableMeta tableMeta = getTableMetaCache().getTableMeta(dataSourceProxy.getPlainConnection(), "t1",
dataSourceProxy.getResourceId());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/OracleTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/OracleTableMetaCacheTest.java
index 8d3aa2abccd..fd7877acac9 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/OracleTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/OracleTableMetaCacheTest.java
@@ -18,6 +18,9 @@
import java.sql.SQLException;
import java.sql.Types;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -29,6 +32,10 @@
import io.seata.sqlparser.struct.TableMetaCache;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will.zjw
@@ -65,7 +72,7 @@ public void getTableMetaTest() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMetaCache tableMetaCache = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.ORACLE);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/PostgresqlTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/PostgresqlTableMetaCacheTest.java
index 2098629e824..bf1a116c47f 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/PostgresqlTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/PostgresqlTableMetaCacheTest.java
@@ -18,6 +18,9 @@
import java.sql.SQLException;
import java.sql.Types;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -29,6 +32,12 @@
import io.seata.sqlparser.struct.TableMetaCache;
import io.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will.zjw
@@ -65,7 +74,7 @@ public void getTableMetaTest() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMetaCache tableMetaCache = TableMetaCacheFactory.getTableMetaCache(JdbcConstants.POSTGRESQL);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/SqlServerTableMetaCacheTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/SqlServerTableMetaCacheTest.java
index cb0b49e2f79..4cb0f26d85c 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/SqlServerTableMetaCacheTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/struct/cache/SqlServerTableMetaCacheTest.java
@@ -22,7 +22,10 @@
import com.alibaba.druid.pool.DruidDataSource;
import io.seata.common.exception.ShouldNeverHappenException;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.mock.MockDriver;
+import io.seata.rm.datasource.undo.UndoLogManagerFactory;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.struct.ColumnMeta;
import io.seata.sqlparser.struct.IndexMeta;
import io.seata.sqlparser.struct.IndexType;
@@ -32,6 +35,13 @@
import io.seata.sqlparser.util.JdbcConstants;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
/**
* @author GoodBoyCoder
@@ -82,7 +92,7 @@ public void getTableMetaTest_0() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- DataSourceProxy proxy = new DataSourceProxy(dataSource);
+ DataSourceProxy proxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
TableMeta tableMeta = getTableMetaCache().getTableMeta(proxy.getPlainConnection(), "m.mt1", proxy.getResourceId());
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
index 9a84c5e08e5..412cc06bbbb 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
@@ -18,6 +18,8 @@
import io.seata.common.util.IOUtil;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.sqlparser.struct.ColumnMeta;
import io.seata.rm.datasource.sql.struct.Field;
import io.seata.rm.datasource.sql.struct.KeyType;
@@ -29,14 +31,17 @@
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
+import org.mockito.MockedStatic;
import org.mockito.Mockito;
+import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Arrays;
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author Geng Zhang
@@ -58,7 +63,8 @@ public static void start() throws SQLException {
dataSource.setUrl("jdbc:h2:./db_store/test_undo");
dataSource.setUsername("sa");
dataSource.setPassword("");
- dataSourceProxy = new DataSourceProxy(dataSource);
+ dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
connection = dataSourceProxy.getConnection();
tableMeta = mockTableMeta();
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
index 9af77f5eb63..a80799cdbe6 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mariadb/MariadbUndoLogManagerTest.java
@@ -25,6 +25,8 @@
import java.util.Date;
import java.util.List;
+import io.seata.rm.datasource.DataSourceProxyTest;
+import io.seata.rm.datasource.undo.*;
import io.seata.sqlparser.struct.TableMeta;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -42,11 +44,6 @@
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.Row;
import io.seata.rm.datasource.sql.struct.TableRecords;
-import io.seata.rm.datasource.undo.AbstractUndoLogManager;
-import io.seata.rm.datasource.undo.BranchUndoLog;
-import io.seata.rm.datasource.undo.SQLUndoLog;
-import io.seata.rm.datasource.undo.UndoLogParser;
-import io.seata.rm.datasource.undo.UndoLogParserFactory;
import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.rm.datasource.undo.parser.JacksonUndoLogParser;
import io.seata.sqlparser.SQLRecognizerFactory;
@@ -56,6 +53,13 @@
import io.seata.sqlparser.druid.SQLOperateRecognizerHolder;
import io.seata.sqlparser.druid.SQLOperateRecognizerHolderFactory;
import io.seata.sqlparser.util.JdbcConstants;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
/**
* @author funkye
@@ -100,7 +104,8 @@ public void init() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- dataSourceProxy = new DataSourceProxy(dataSource);
+ dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
undoLogManager = new MariadbUndoLogManager();
tableMeta = new TableMeta();
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
index 367dc94a82e..aa6ceeb168a 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/MySQLUndoLogManagerTest.java
@@ -33,15 +33,12 @@
import io.seata.rm.datasource.ConnectionContext;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.Row;
+import io.seata.rm.datasource.undo.*;
import io.seata.sqlparser.struct.TableMeta;
import io.seata.rm.datasource.sql.struct.TableRecords;
-import io.seata.rm.datasource.undo.AbstractUndoLogManager;
-import io.seata.rm.datasource.undo.BranchUndoLog;
-import io.seata.rm.datasource.undo.SQLUndoLog;
-import io.seata.rm.datasource.undo.UndoLogParser;
-import io.seata.rm.datasource.undo.UndoLogParserFactory;
import io.seata.rm.datasource.undo.parser.JacksonUndoLogParser;
import io.seata.sqlparser.SQLRecognizerFactory;
import io.seata.sqlparser.SQLType;
@@ -54,6 +51,12 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* @author will
@@ -98,7 +101,8 @@ public void init() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- dataSourceProxy = new DataSourceProxy(dataSource);
+ dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
+
connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
undoLogManager = new MySQLUndoLogManager();
tableMeta = new TableMeta();
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
index e80575b7e09..cb8b2a41a76 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/polardbx/PolarDBXUndoLogManagerTest.java
@@ -32,15 +32,13 @@
import io.seata.rm.datasource.ConnectionContext;
import io.seata.rm.datasource.ConnectionProxy;
import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.DataSourceProxyTest;
import io.seata.rm.datasource.mock.MockDriver;
import io.seata.rm.datasource.sql.struct.Row;
import io.seata.rm.datasource.sql.struct.TableRecords;
-import io.seata.rm.datasource.undo.AbstractUndoLogManager;
-import io.seata.rm.datasource.undo.BranchUndoLog;
-import io.seata.rm.datasource.undo.SQLUndoLog;
-import io.seata.rm.datasource.undo.UndoLogParser;
-import io.seata.rm.datasource.undo.UndoLogParserFactory;
+import io.seata.rm.datasource.undo.*;
+import io.seata.rm.datasource.undo.mysql.MySQLUndoLogManager;
import io.seata.rm.datasource.undo.parser.JacksonUndoLogParser;
import io.seata.sqlparser.SQLType;
import io.seata.sqlparser.druid.SQLOperateRecognizerHolder;
@@ -51,6 +49,12 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+
+import static org.mockito.ArgumentMatchers.anyString;
/**
* Undo log manager test for PolarDB-X
@@ -95,7 +99,7 @@ public void init() throws SQLException {
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setDriver(mockDriver);
- dataSourceProxy = new DataSourceProxy(dataSource);
+ dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
connectionProxy = new ConnectionProxy(dataSourceProxy, dataSource.getConnection().getConnection());
undoLogManager = new PolarDBXUndoLogManager();
tableMeta = new TableMeta();