diff --git a/common/src/test/java/org/apache/seata/common/io/FileLoaderTest.java b/common/src/test/java/org/apache/seata/common/io/FileLoaderTest.java
index 362500e1086..c57f034e43f 100644
--- a/common/src/test/java/org/apache/seata/common/io/FileLoaderTest.java
+++ b/common/src/test/java/org/apache/seata/common/io/FileLoaderTest.java
@@ -46,14 +46,16 @@ public void testLoadException() {
@Test
public void testLoadWhenDirectPath() throws Exception {
Path tempFile = Paths.get("direct-test-file.txt");
- Files.createFile(tempFile);
-
- File result = FileLoader.load("direct-test-file.txt");
-
- Assertions.assertNotNull(result);
- Assertions.assertTrue(result.exists());
-
Files.deleteIfExists(tempFile);
+ Files.createFile(tempFile);
+ try {
+ File result = FileLoader.load("direct-test-file.txt");
+
+ Assertions.assertNotNull(result);
+ Assertions.assertTrue(result.exists());
+ } finally {
+ Files.deleteIfExists(tempFile);
+ }
}
@Test
@@ -62,14 +64,16 @@ public void testLoadWhenSpecial() throws Exception {
String decodedName = "测试 文件.txt";
Path tempFile = Paths.get(decodedName);
- Files.createFile(tempFile);
-
- File result = FileLoader.load(encodedName);
-
- Assertions.assertNotNull(result);
- Assertions.assertTrue(result.exists());
-
Files.deleteIfExists(tempFile);
+ Files.createFile(tempFile);
+ try {
+ File result = FileLoader.load(encodedName);
+
+ Assertions.assertNotNull(result);
+ Assertions.assertTrue(result.exists());
+ } finally {
+ Files.deleteIfExists(tempFile);
+ }
}
@Test
diff --git a/compatible/pom.xml b/compatible/pom.xml
index 2ceb1ab96a0..84d6cdc118d 100644
--- a/compatible/pom.xml
+++ b/compatible/pom.xml
@@ -152,6 +152,14 @@
true
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ 4
+ true
+
+
diff --git a/core/pom.xml b/core/pom.xml
index e0b2395a499..24a761bac9e 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -134,6 +134,14 @@
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ 4
+ true
+
+
diff --git a/extensions/rpc/seata-http/src/test/java/org/apache/seata/integration/http/HttpTest.java b/extensions/rpc/seata-http/src/test/java/org/apache/seata/integration/http/HttpTest.java
index a31ffbabc30..a8367561706 100644
--- a/extensions/rpc/seata-http/src/test/java/org/apache/seata/integration/http/HttpTest.java
+++ b/extensions/rpc/seata-http/src/test/java/org/apache/seata/integration/http/HttpTest.java
@@ -27,6 +27,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
@@ -39,14 +40,24 @@
class HttpTest {
- private static final String HOST = "http://127.0.0.1:8081";
+ private static final int PORT = findAvailablePort();
+ private static final String HOST = "http://127.0.0.1:" + PORT;
private static final String TEST_EXCEPTION = "/testException";
private static final String GET_PATH = "/testGet";
private static final String POST_PATH = "/testPost";
- public static final String XID = "127.0.0.1:8081:87654321";
+ public static final String XID = "127.0.0.1:" + PORT + ":87654321";
private static final int PARAM_TYPE_MAP = 1;
private static final int PARAM_TYPE_BEAN = 2;
+ private static int findAvailablePort() {
+ try (ServerSocket socket = new ServerSocket(0)) {
+ socket.setReuseAddress(true);
+ return socket.getLocalPort();
+ } catch (IOException e) {
+ return 8081;
+ }
+ }
+
@Test
void testGetProviderXID() {
RootContext.bind(XID);
@@ -75,7 +86,7 @@ void testGetExceptionRemoveXID() {
}
public void providerStart() {
- new MockWebServer().start(8081);
+ new MockWebServer().start(PORT);
}
public static class Person {
diff --git a/mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java b/mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
index 7c0d75a9c1d..f958f68a9c9 100644
--- a/mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
+++ b/mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
@@ -69,32 +69,33 @@ public class MockCoordinator implements TCInboundHandler, TransactionMessageHand
protected static final Logger LOGGER = LoggerFactory.getLogger(MockCoordinator.class);
- RemotingServer remotingServer;
+ private static final String ALL_BEGIN_FAIL_XID = "0";
- private static MockCoordinator coordinator;
+ private RemotingServer remotingServer;
- private static String AllBeginFailXid = "0";
+ private final Map globalStatusMap;
+ private final Map expectedResultMap;
+ private final Map expectRetryTimesMap;
+ private final Map> branchMap;
- private Map globalStatusMap;
- private Map expectedResultMap;
- private Map expectRetryTimesMap;
- private Map> branchMap;
+ public MockCoordinator() {
+ this.globalStatusMap = new ConcurrentHashMap<>();
+ this.expectedResultMap = new ConcurrentHashMap<>();
+ this.expectRetryTimesMap = new ConcurrentHashMap<>();
+ this.branchMap = new ConcurrentHashMap<>();
+ }
- private MockCoordinator() {}
+ private static volatile MockCoordinator defaultInstance;
public static MockCoordinator getInstance() {
- if (coordinator == null) {
+ if (defaultInstance == null) {
synchronized (MockCoordinator.class) {
- if (coordinator == null) {
- coordinator = new MockCoordinator();
- coordinator.expectedResultMap = new ConcurrentHashMap<>();
- coordinator.globalStatusMap = new ConcurrentHashMap<>();
- coordinator.expectRetryTimesMap = new ConcurrentHashMap<>();
- coordinator.branchMap = new ConcurrentHashMap<>();
+ if (defaultInstance == null) {
+ defaultInstance = new MockCoordinator();
}
}
}
- return coordinator;
+ return defaultInstance;
}
@Override
@@ -155,7 +156,7 @@ private T handleException(
public GlobalBeginResponse handle(GlobalBeginRequest request, RpcContext rpcContext) {
GlobalBeginResponse response = new GlobalBeginResponse();
try {
- checkMockActionFail(AllBeginFailXid);
+ checkMockActionFail(ALL_BEGIN_FAIL_XID);
} catch (TransactionException e) {
return handleException(e, response, ResultCode.Failed, "MockBeginException");
}
@@ -220,7 +221,6 @@ public GlobalRollbackResponse handle(GlobalRollbackRequest request, RpcContext r
CallRm.branchRollback(remotingServer, branch);
IntStream.range(0, retry).forEach(i -> CallRm.branchRollback(remotingServer, branch));
if (Version.isV0(rpcContext.getVersion())) {
- // test MsgVersionHelper and skip
CallRm.deleteUndoLog(remotingServer, branch);
}
});
@@ -240,7 +240,6 @@ public BranchRegisterResponse handle(BranchRegisterRequest request, RpcContext r
MockBranchSession branchSession = new MockBranchSession(request.getBranchType());
String xid = request.getXid();
branchSession.setXid(xid);
- // branchSession.setTransactionId(request.getTransactionId());
branchSession.setBranchId(UUIDGenerator.generateUUID());
branchSession.setResourceId(request.getResourceId());
branchSession.setLockKey(request.getLockKey());
diff --git a/mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java b/mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
index cd6803faaf2..4ff00aba4bb 100644
--- a/mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
+++ b/mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
@@ -25,14 +25,14 @@
import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.config.ConfigurationCache;
import org.apache.seata.core.constants.ConfigurationKeys;
-import org.apache.seata.core.rpc.ShutdownHook;
import org.apache.seata.core.rpc.netty.NettyServerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import java.lang.management.ManagementFactory;
+import java.io.IOException;
+import java.net.ServerSocket;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -45,93 +45,191 @@ public class MockServer {
protected static final Logger LOGGER = LoggerFactory.getLogger(MockServer.class);
- private static ThreadPoolExecutor workingThreads;
- private static MockNettyRemotingServer nettyRemotingServer;
+ public static final int MOCK_DEFAULT_PORT = 10091;
+ public static final String MOCK_SEATA_PORT_KEY = "SEATA_MOCK_PORT";
- private static volatile boolean inited = false;
- private static volatile int actualPort;
+ private ThreadPoolExecutor workingThreads;
+ private MockNettyRemotingServer nettyRemotingServer;
+ private MockCoordinator coordinator;
+ private int port;
+ private volatile boolean started = false;
- public static final int MOCK_DEFAULT_PORT = 10091;
- public static String MOCK_SEATA_PORT_KEY = "SEATA_MOCK_PORT";
+ public MockServer() {}
/**
- * The entry point of application.
+ * Start this mock server instance on the specified port.
+ * If port is 0, a random available port will be assigned.
*
- * @param args the input arguments
+ * @param port the port to listen on, 0 for random port
*/
- public static void main(String[] args) {
- SpringApplication.run(MockServer.class, args);
- int port = NumberUtils.toInt(System.getenv(MOCK_SEATA_PORT_KEY), MOCK_DEFAULT_PORT);
+ public synchronized void start(int port) {
+ start(port, new MockCoordinator());
+ }
- if (args != null && args.length > 0) {
- try {
- port = Integer.parseInt(args[0]);
- } catch (NumberFormatException e) {
- LOGGER.error("Invalid port number provided, using default port: {}", port, e);
- }
+ /**
+ * Start this mock server instance on the specified port with the given coordinator.
+ *
+ * @param port the port to listen on, 0 for random port
+ * @param coordinator the mock coordinator to use
+ */
+ public synchronized void start(int port, MockCoordinator coordinator) {
+ if (started) {
+ return;
+ }
+ if (port == 0) {
+ port = findAvailablePort();
}
- start(port);
+ ConfigurationCache.clear();
+ System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
+ System.clearProperty("server.port");
+
+ workingThreads = ThreadPoolExecutorFactory.newThreadPoolExecutor(
+ "mockServerWorker",
+ 50,
+ 50,
+ 500,
+ TimeUnit.SECONDS,
+ new LinkedBlockingQueue<>(20000),
+ new ThreadPoolExecutor.CallerRunsPolicy());
+ NettyServerConfig config = new NettyServerConfig();
+ config.setServerListenPort(port);
+ nettyRemotingServer = new MockNettyRemotingServer(workingThreads, config);
+
+ XID.setIpAddress(NetUtil.getLocalIp());
+ XID.setPort(port);
+ Instance.getInstance().setTransaction(new Node.Endpoint(XID.getIpAddress(), XID.getPort(), "netty"));
+ UUIDGenerator.init(1L);
+
+ this.coordinator = coordinator;
+ coordinator.setRemotingServer(nettyRemotingServer);
+ nettyRemotingServer.setHandler(coordinator);
+ nettyRemotingServer.init();
+
+ this.port = port;
+ this.started = true;
+ LOGGER.info("MockServer started on port: {}", port);
+ }
+
+ /**
+ * Get the actual port this server is listening on.
+ *
+ * @return the listening port
+ */
+ public int getPort() {
+ return port;
}
- public static void start(int port) {
- if (!inited) {
+ /**
+ * Get the coordinator instance of this server.
+ *
+ * @return the mock coordinator
+ */
+ public MockCoordinator getCoordinator() {
+ return coordinator;
+ }
+
+ /**
+ * Get the netty remoting server instance.
+ *
+ * @return the mock netty remoting server
+ */
+ public MockNettyRemotingServer getNettyRemotingServer() {
+ return nettyRemotingServer;
+ }
+
+ /**
+ * Close this mock server instance.
+ */
+ public synchronized void close() {
+ if (started) {
+ started = false;
+ if (workingThreads != null) {
+ workingThreads.shutdown();
+ }
+ if (nettyRemotingServer != null) {
+ nettyRemotingServer.destroy();
+ }
+ }
+ }
+
+ // ==================== Static convenience methods for backward compatibility ====================
+
+ private static volatile MockServer defaultInstance;
+
+ /**
+ * Start the default (singleton) mock server on specified port.
+ * Retained for backward compatibility with existing tests.
+ *
+ * @param port the port to listen on
+ * @return the default MockServer instance
+ */
+ public static MockServer startDefault(int port) {
+ if (defaultInstance == null) {
synchronized (MockServer.class) {
- if (!inited) {
- ConfigurationCache.clear();
- // Clear the property for any of the supported events
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
- System.clearProperty("server.port");
- inited = true;
- workingThreads = ThreadPoolExecutorFactory.newThreadPoolExecutor(
- "ServerHandlerThread",
- 50,
- 50,
- 500,
- TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(20000),
- new ThreadPoolExecutor.CallerRunsPolicy());
- NettyServerConfig config = new NettyServerConfig();
- config.setServerListenPort(port);
- nettyRemotingServer = new MockNettyRemotingServer(workingThreads, config);
-
- // set registry
- XID.setIpAddress(NetUtil.getLocalIp());
- XID.setPort(port);
- // init snowflake for transactionId, branchId
- Instance.getInstance()
- .setTransaction(new Node.Endpoint(XID.getIpAddress(), XID.getPort(), "netty"));
- UUIDGenerator.init(1L);
-
- MockCoordinator coordinator = MockCoordinator.getInstance();
- coordinator.setRemotingServer(nettyRemotingServer);
- nettyRemotingServer.setHandler(coordinator);
- nettyRemotingServer.init();
- ShutdownHook.getInstance()
- .addDisposable(() -> LOGGER.info("system is closing , pid info: "
- + ManagementFactory.getRuntimeMXBean().getName()));
- LOGGER.info(
- "pid info: " + ManagementFactory.getRuntimeMXBean().getName());
- actualPort = port;
- LOGGER.info("MockServer started on port: {}", port);
+ if (defaultInstance == null) {
+ defaultInstance = new MockServer();
+ defaultInstance.start(port, MockCoordinator.getInstance());
}
}
}
+ return defaultInstance;
}
- public static int getPort() {
- return actualPort;
+ /**
+ * Get the default mock server instance.
+ *
+ * @return the default MockServer instance, or null if not started
+ */
+ public static MockServer getDefault() {
+ return defaultInstance;
}
- public static void close() {
- if (inited) {
+ /**
+ * Close the default (singleton) mock server.
+ */
+ public static void closeDefault() {
+ if (defaultInstance != null) {
synchronized (MockServer.class) {
- if (inited) {
- inited = false;
- workingThreads.shutdown();
- nettyRemotingServer.destroy();
+ if (defaultInstance != null) {
+ defaultInstance.close();
+ defaultInstance = null;
}
}
}
}
+
+ /**
+ * Find a random available port.
+ *
+ * @return available port number
+ */
+ public static int findAvailablePort() {
+ try (ServerSocket socket = new ServerSocket(0)) {
+ socket.setReuseAddress(true);
+ return socket.getLocalPort();
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to find available port", e);
+ }
+ }
+
+ /**
+ * The entry point of application (standalone deployment).
+ *
+ * @param args the input arguments
+ */
+ public static void main(String[] args) {
+ SpringApplication.run(MockServer.class, args);
+ int port = NumberUtils.toInt(System.getenv(MOCK_SEATA_PORT_KEY), MOCK_DEFAULT_PORT);
+
+ if (args != null && args.length > 0) {
+ try {
+ port = Integer.parseInt(args[0]);
+ } catch (NumberFormatException e) {
+ LOGGER.error("Invalid port number provided, using default port: {}", port, e);
+ }
+ }
+
+ startDefault(port);
+ }
}
diff --git a/rm-datasource/pom.xml b/rm-datasource/pom.xml
index c08172c2943..6259f2301e3 100644
--- a/rm-datasource/pom.xml
+++ b/rm-datasource/pom.xml
@@ -165,4 +165,17 @@
${project.version}
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ 4
+ true
+
+
+
+
diff --git a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/BaseH2Test.java b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/BaseH2Test.java
index c4b94e922aa..fdcaffccce0 100644
--- a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/BaseH2Test.java
+++ b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/BaseH2Test.java
@@ -27,7 +27,6 @@
import org.apache.seata.rm.datasource.sql.struct.TableRecords;
import org.apache.seata.sqlparser.struct.ColumnMeta;
import org.apache.seata.sqlparser.struct.TableMeta;
-import org.h2.store.fs.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
@@ -38,9 +37,12 @@
import java.sql.Statement;
import java.sql.Types;
import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
public abstract class BaseH2Test {
+ private static final AtomicInteger DB_COUNTER = new AtomicInteger(0);
+
static BasicDataSource dataSource = null;
static ConnectionProxy connection = null;
@@ -53,7 +55,7 @@ public abstract class BaseH2Test {
public static void start() throws SQLException {
dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.Driver");
- dataSource.setUrl("jdbc:h2:./db_store/test_undo");
+ dataSource.setUrl("jdbc:h2:mem:test_undo_" + DB_COUNTER.incrementAndGet() + ";DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
dataSourceProxy = DataSourceProxyTest.getDataSourceProxy(dataSource);
@@ -72,8 +74,6 @@ public static void stop() {
} catch (SQLException e) {
}
}
-
- FileUtils.deleteRecursive("db_store", true);
}
@BeforeEach
@@ -124,7 +124,7 @@ protected static TableMeta mockTableMeta() {
protected static Field addField(Row row, String name, int type, Object value) {
Field field = new Field(name, type, value);
- if (name.equalsIgnoreCase("id")) {
+ if ("id".equalsIgnoreCase(name)) {
field.setKeyType(KeyType.PRIMARY_KEY);
}
row.add(field);
diff --git a/test-suite/test-new-version/pom.xml b/test-suite/test-new-version/pom.xml
index d19007e030c..42aad7f5de9 100644
--- a/test-suite/test-new-version/pom.xml
+++ b/test-suite/test-new-version/pom.xml
@@ -45,7 +45,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2
+ 4
true
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/ChannelManagerTestHelper.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/ChannelManagerTestHelper.java
index 3a65fdcb6f6..a3238e5c793 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/ChannelManagerTestHelper.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/ChannelManagerTestHelper.java
@@ -17,7 +17,6 @@
package org.apache.seata.core.rpc.netty;
import io.netty.channel.Channel;
-import org.apache.seata.core.rpc.netty.mockserver.ProtocolTestConstants;
import java.util.concurrent.ConcurrentMap;
@@ -31,7 +30,8 @@ public static ConcurrentMap getChannelConcurrentMap(AbstractNet
}
public static Channel getChannel(TmNettyRemotingClient client) {
- return getChannelManager(client).acquireChannel(ProtocolTestConstants.MOCK_SERVER_ADDRESS);
+ String serverAddress = System.getProperty("service.mock.grouplist", "0.0.0.0:10091");
+ return getChannelManager(client).acquireChannel(serverAddress);
}
private static NettyClientChannelManager getChannelManager(AbstractNettyRemotingClient remotingClient) {
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/GrpcTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/GrpcTest.java
index afe3c35f236..71394d83bdd 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/GrpcTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/GrpcTest.java
@@ -20,13 +20,8 @@
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
-import org.apache.seata.common.ConfigurationKeys;
-import org.apache.seata.config.ConfigurationCache;
-import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.protocol.generated.GrpcMessageProto;
import org.apache.seata.core.protocol.generated.SeataServiceGrpc;
-import org.apache.seata.core.rpc.netty.RmNettyRemotingClient;
-import org.apache.seata.core.rpc.netty.TmNettyRemotingClient;
import org.apache.seata.core.rpc.netty.grpc.GrpcHeaderEnum;
import org.apache.seata.core.serializer.SerializerType;
import org.apache.seata.mockserver.MockServer;
@@ -44,17 +39,13 @@ public class GrpcTest {
private static SeataServiceGrpc.SeataServiceStub seataServiceStub;
+ private static MockServer mockServer;
+
@BeforeAll
public static void before() {
- ConfigurationFactory.reload();
- System.setProperty(
- ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(ProtocolTestConstants.MOCK_SERVER_PORT));
- ConfigurationCache.clear();
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
-
- channel = ManagedChannelBuilder.forAddress("127.0.0.1", ProtocolTestConstants.MOCK_SERVER_PORT)
+ mockServer = ProtocolTestConstants.initMockServer();
+
+ channel = ManagedChannelBuilder.forAddress("127.0.0.1", mockServer.getPort())
.usePlaintext()
.build();
seataServiceStub = SeataServiceGrpc.newStub(channel);
@@ -62,11 +53,10 @@ public static void before() {
@AfterAll
public static void after() {
- // MockServer.close();
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
- ConfigurationCache.clear();
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
+ if (channel != null) {
+ channel.shutdownNow();
+ }
+ ProtocolTestConstants.closeMockServer(mockServer);
}
private GrpcMessageProto getRegisterTMRequest() {
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockFastJson2Test.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockFastJson2Test.java
index ce0dd2a4625..8bd545e8801 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockFastJson2Test.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockFastJson2Test.java
@@ -18,14 +18,10 @@
import org.apache.seata.common.ConfigurationKeys;
import org.apache.seata.config.ConfigurationCache;
-import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.core.model.TransactionManager;
-import org.apache.seata.core.rpc.netty.RmNettyRemotingClient;
-import org.apache.seata.core.rpc.netty.TmNettyRemotingClient;
-import org.apache.seata.mockserver.MockCoordinator;
import org.apache.seata.mockserver.MockServer;
import org.apache.seata.rm.DefaultResourceManager;
import org.junit.jupiter.api.AfterAll;
@@ -44,25 +40,18 @@ public class MockFastJson2Test {
Logger logger = LoggerFactory.getLogger(MockFastJson2Test.class);
+ private static MockServer mockServer;
+
@BeforeAll
public static void before() {
- ConfigurationFactory.reload();
- System.setProperty(
- ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(ProtocolTestConstants.MOCK_SERVER_PORT));
- ConfigurationCache.clear();
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
+ mockServer = ProtocolTestConstants.initMockServer();
}
@AfterAll
public static void after() {
- // MockServer.close();
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
+ ProtocolTestConstants.closeMockServer(mockServer);
System.clearProperty(ConfigurationKeys.SERIALIZE_FOR_RPC);
ConfigurationCache.clear();
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
}
@Test
@@ -95,7 +84,7 @@ public void testRollbackRetry() throws TransactionException {
@Test
public void testTm() throws Exception {
- TmClientTest.testTm();
+ TmClientTest.testTm(mockServer.getCoordinator());
}
@Test
@@ -109,7 +98,7 @@ private String doTestCommit(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-commit", 60000);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus commit = tm.commit(xid);
Assertions.assertEquals(GlobalStatus.Committed, commit);
@@ -123,7 +112,7 @@ private String doTestRollback(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-rollback", 60000);
logger.info("doTestRollback xid:{}", xid);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus rollback = tm.rollback(xid);
Assertions.assertEquals(GlobalStatus.Rollbacked, rollback);
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockGrpcServerTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockGrpcServerTest.java
index 3afa8bff221..9ebf4f14778 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockGrpcServerTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockGrpcServerTest.java
@@ -18,15 +18,11 @@
import org.apache.seata.common.ConfigurationKeys;
import org.apache.seata.config.ConfigurationCache;
-import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.core.model.TransactionManager;
import org.apache.seata.core.protocol.Protocol;
-import org.apache.seata.core.rpc.netty.RmNettyRemotingClient;
-import org.apache.seata.core.rpc.netty.TmNettyRemotingClient;
-import org.apache.seata.mockserver.MockCoordinator;
import org.apache.seata.mockserver.MockServer;
import org.apache.seata.rm.DefaultResourceManager;
import org.junit.jupiter.api.AfterAll;
@@ -45,26 +41,19 @@ public class MockGrpcServerTest {
Logger logger = LoggerFactory.getLogger(MockGrpcServerTest.class);
+ private static MockServer mockServer;
+
@BeforeAll
public static void before() {
- ConfigurationFactory.reload();
- System.setProperty(
- ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(ProtocolTestConstants.MOCK_SERVER_PORT));
System.setProperty(ConfigurationKeys.TRANSPORT_PROTOCOL, Protocol.GRPC.value);
- ConfigurationCache.clear();
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
+ mockServer = ProtocolTestConstants.initMockServer();
}
@AfterAll
public static void after() {
- // MockServer.close();
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
+ ProtocolTestConstants.closeMockServer(mockServer);
System.clearProperty(ConfigurationKeys.TRANSPORT_PROTOCOL);
ConfigurationCache.clear();
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
}
@Test
@@ -101,7 +90,7 @@ private String doTestCommit(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-commit", 60000);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus commit = tm.commit(xid);
Assertions.assertEquals(GlobalStatus.Committed, commit);
@@ -115,7 +104,7 @@ private String doTestRollback(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-rollback", 60000);
logger.info("doTestRollback xid:{}", xid);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus rollback = tm.rollback(xid);
Assertions.assertEquals(GlobalStatus.Rollbacked, rollback);
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockServerTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockServerTest.java
index 1a5b5d7b694..d84fb25a7e6 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockServerTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/MockServerTest.java
@@ -16,16 +16,10 @@
*/
package org.apache.seata.core.rpc.netty.mockserver;
-import org.apache.seata.common.ConfigurationKeys;
-import org.apache.seata.config.ConfigurationCache;
-import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.core.model.TransactionManager;
-import org.apache.seata.core.rpc.netty.RmNettyRemotingClient;
-import org.apache.seata.core.rpc.netty.TmNettyRemotingClient;
-import org.apache.seata.mockserver.MockCoordinator;
import org.apache.seata.mockserver.MockServer;
import org.apache.seata.rm.DefaultResourceManager;
import org.junit.jupiter.api.AfterAll;
@@ -44,24 +38,16 @@ public class MockServerTest {
Logger logger = LoggerFactory.getLogger(MockServerTest.class);
+ private static MockServer mockServer;
+
@BeforeAll
public static void before() {
- ConfigurationFactory.reload();
- System.setProperty(
- ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(ProtocolTestConstants.MOCK_SERVER_PORT));
- ConfigurationCache.clear();
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
+ mockServer = ProtocolTestConstants.initMockServer();
}
@AfterAll
public static void after() {
- // MockServer.close();
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
- ConfigurationCache.clear();
- TmNettyRemotingClient.getInstance().destroy();
- RmNettyRemotingClient.getInstance().destroy();
+ ProtocolTestConstants.closeMockServer(mockServer);
}
@Test
@@ -94,7 +80,7 @@ public void testRollbackRetry() throws TransactionException {
@Test
public void testTm() throws Exception {
- TmClientTest.testTm();
+ TmClientTest.testTm(mockServer.getCoordinator());
}
@Test
@@ -108,7 +94,7 @@ private String doTestCommit(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-commit", 60000);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus commit = tm.commit(xid);
Assertions.assertEquals(GlobalStatus.Committed, commit);
@@ -122,7 +108,7 @@ private String doTestRollback(int times) throws TransactionException {
String xid = tm.begin(
ProtocolTestConstants.APPLICATION_ID, ProtocolTestConstants.SERVICE_GROUP, "test-rollback", 60000);
logger.info("doTestRollback xid:{}", xid);
- MockCoordinator.getInstance().setExpectedRetry(xid, times);
+ mockServer.getCoordinator().setExpectedRetry(xid, times);
Long branchId = rm.branchRegister(BranchType.TCC, RESOURCE_ID, "1", xid, "{\"mock\":\"mock\"}", "1");
GlobalStatus rollback = tm.rollback(xid);
Assertions.assertEquals(GlobalStatus.Rollbacked, rollback);
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/ProtocolTestConstants.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/ProtocolTestConstants.java
index 82edbf52784..d39662c1a11 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/ProtocolTestConstants.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/ProtocolTestConstants.java
@@ -16,10 +16,12 @@
*/
package org.apache.seata.core.rpc.netty.mockserver;
+import org.apache.seata.common.ConfigurationKeys;
import org.apache.seata.config.ConfigurationCache;
-
-import java.io.IOException;
-import java.net.ServerSocket;
+import org.apache.seata.config.ConfigurationFactory;
+import org.apache.seata.core.rpc.netty.RmNettyRemotingClient;
+import org.apache.seata.core.rpc.netty.TmNettyRemotingClient;
+import org.apache.seata.mockserver.MockServer;
/**
* Mock Constants
@@ -27,20 +29,41 @@
public class ProtocolTestConstants {
public static final String APPLICATION_ID = "mock_tx_app_id";
public static final String SERVICE_GROUP = "mock_tx_group";
- public static final int MOCK_SERVER_PORT = findAvailablePort();
- public static final String MOCK_SERVER_ADDRESS = "0.0.0.0:" + MOCK_SERVER_PORT;
- static {
- System.setProperty("service.mock.grouplist", "127.0.0.1:" + MOCK_SERVER_PORT);
+ /**
+ * Start an independent MockServer instance with a random port, configure
+ * system properties and clients to connect to it.
+ *
+ * @return the started MockServer instance
+ */
+ public static MockServer initMockServer() {
+ TmNettyRemotingClient.getInstance().destroy();
+ RmNettyRemotingClient.getInstance().destroy();
+
+ MockServer server = new MockServer();
+ server.start(0);
+ int port = server.getPort();
+
+ System.setProperty("service.mock.grouplist", "127.0.0.1:" + port);
+ System.setProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(port));
+ ConfigurationFactory.reload();
ConfigurationCache.clear();
+ return server;
}
- private static int findAvailablePort() {
- try (ServerSocket socket = new ServerSocket(0)) {
- socket.setReuseAddress(true);
- return socket.getLocalPort();
- } catch (IOException e) {
- throw new RuntimeException("Failed to allocate an available port", e);
+ /**
+ * Cleanup after tests: close the server, clear properties.
+ *
+ * @param server the MockServer instance to close
+ */
+ public static void closeMockServer(MockServer server) {
+ TmNettyRemotingClient.getInstance().destroy();
+ RmNettyRemotingClient.getInstance().destroy();
+ if (server != null) {
+ server.close();
}
+ System.clearProperty("service.mock.grouplist");
+ System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
+ ConfigurationCache.clear();
}
}
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/TmClientTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/TmClientTest.java
index 45412850c80..5442e889a91 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/TmClientTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/mockserver/TmClientTest.java
@@ -36,7 +36,7 @@ public class TmClientTest {
protected static final Logger LOGGER = LoggerFactory.getLogger(TmClientTest.class);
- public static void testTm() throws Exception {
+ public static void testTm(MockCoordinator coordinator) throws Exception {
TransactionManager tm = getTm();
// globalBegin:TYPE_GLOBAL_BEGIN = 1 , TYPE_GLOBAL_BEGIN_RESULT = 2
@@ -63,12 +63,10 @@ public static void testTm() throws Exception {
LOGGER.info("globalReport ok:" + globalReport);
Assertions.assertEquals(globalReport, GlobalStatus.Committed);
- MockCoordinator.getInstance().setExpectedResult(xid, ResultCode.Failed);
- // GlobalStatus globalReport2 = tm.globalReport(xid, GlobalStatus.Committed);
+ coordinator.setExpectedResult(xid, ResultCode.Failed);
GlobalStatus rollback2 = tm.rollback(xid);
LOGGER.info("globalRollback ok:" + rollback2);
- // TODO expected response fail , but DefaultTransactionManager ignore resultCode
}
@NotNull
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1SerializerTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1SerializerTest.java
index 284d7253aae..0c5fba113ce 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1SerializerTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1SerializerTest.java
@@ -45,11 +45,12 @@ public class ProtocolV1SerializerTest {
@Test
public void testAll() {
- ProtocolV1Server server = new ProtocolV1Server();
+ ProtocolV1Server server = new ProtocolV1Server(0);
ProtocolV1Client client = new ProtocolV1Client();
try {
server.start();
- client.connect("127.0.0.1", 8811, 500);
+ int port = server.getPort();
+ client.connect("127.0.0.1", port, 5000);
Assertions.assertTrue(client.channel.isActive());
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1Server.java b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1Server.java
index 962711ce238..d580f98933d 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1Server.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/core/rpc/netty/v1/ProtocolV1Server.java
@@ -21,7 +21,6 @@
import io.netty.channel.AdaptiveRecvByteBufAllocator;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
@@ -47,6 +46,16 @@ public class ProtocolV1Server {
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
+ public ProtocolV1Server() {}
+
+ public ProtocolV1Server(int port) {
+ this.port = port;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
public void start() {
bossGroup = createBossGroup();
@@ -75,16 +84,14 @@ protected void initChannel(Channel channel) throws Exception {
String host = "0.0.0.0";
ChannelFuture future = serverBootstrap.bind(new InetSocketAddress(host, port));
- ChannelFuture channelFuture = future.addListener((ChannelFutureListener) future1 -> {
- if (!future1.isSuccess()) {
- throw new RuntimeException("Server start fail !", future1.cause());
- }
- });
-
try {
- channelFuture.await(5000, TimeUnit.MILLISECONDS);
+ future.await(5000, TimeUnit.MILLISECONDS);
+ if (!future.isSuccess()) {
+ throw new RuntimeException("Server start fail!", future.cause());
+ }
+ this.port = ((InetSocketAddress) future.channel().localAddress()).getPort();
} catch (InterruptedException e) {
- e.printStackTrace();
+ throw new RuntimeException(e);
}
}
diff --git a/test-suite/test-new-version/src/test/java/org/apache/seata/integration/rocketmq/SeataMQProducerSendTest.java b/test-suite/test-new-version/src/test/java/org/apache/seata/integration/rocketmq/SeataMQProducerSendTest.java
index 2e92761f825..e1398ff4dd0 100644
--- a/test-suite/test-new-version/src/test/java/org/apache/seata/integration/rocketmq/SeataMQProducerSendTest.java
+++ b/test-suite/test-new-version/src/test/java/org/apache/seata/integration/rocketmq/SeataMQProducerSendTest.java
@@ -25,8 +25,6 @@
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
-import org.apache.seata.common.ConfigurationKeys;
-import org.apache.seata.config.ConfigurationCache;
import org.apache.seata.core.context.RootContext;
import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.TransactionManager;
@@ -58,22 +56,17 @@ public class SeataMQProducerSendTest {
private static final String NAME_SERVER = "127.0.0.1:9876";
private static SeataMQProducer producer;
+ private static MockServer mockServer;
@BeforeAll
public static void before() throws MQClientException {
- System.setProperty(
- ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL, String.valueOf(ProtocolTestConstants.MOCK_SERVER_PORT));
- ConfigurationCache.clear();
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
+ mockServer = ProtocolTestConstants.initMockServer();
producer = SeataMQProducerFactory.createSingle(NAME_SERVER, "test");
- // should start mq server here
}
@AfterAll
public static void after() {
- // MockServer.close();
- System.clearProperty(ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL);
- ConfigurationCache.clear();
+ ProtocolTestConstants.closeMockServer(mockServer);
producer.shutdown();
}
diff --git a/test-suite/test-old-version/src/test/java/io/seata/MockTest.java b/test-suite/test-old-version/src/test/java/io/seata/MockTest.java
index e18764a8e30..22491348623 100644
--- a/test-suite/test-old-version/src/test/java/io/seata/MockTest.java
+++ b/test-suite/test-old-version/src/test/java/io/seata/MockTest.java
@@ -52,12 +52,12 @@ public class MockTest {
@BeforeAll
public static void before() {
- MockServer.start(ProtocolTestConstants.MOCK_SERVER_PORT);
+ MockServer.startDefault(ProtocolTestConstants.MOCK_SERVER_PORT);
}
@AfterAll
public static void after() {
- MockServer.close();
+ MockServer.closeDefault();
TmRpcClient.getInstance().destroy();
RmRpcClient.getInstance().destroy();
}
diff --git a/test-suite/test-old-version/src/test/java/io/seata/core/rpc/netty/ProtocolTestConstants.java b/test-suite/test-old-version/src/test/java/io/seata/core/rpc/netty/ProtocolTestConstants.java
index f1c607ae400..ed62fdf59e2 100644
--- a/test-suite/test-old-version/src/test/java/io/seata/core/rpc/netty/ProtocolTestConstants.java
+++ b/test-suite/test-old-version/src/test/java/io/seata/core/rpc/netty/ProtocolTestConstants.java
@@ -16,11 +16,17 @@
*/
package io.seata.core.rpc.netty;
+import org.apache.seata.mockserver.MockServer;
+
/**
* Mock Constants
**/
public class ProtocolTestConstants {
public static final String APPLICATION_ID = "mock_tx_app_id_061";
public static final String SERVICE_GROUP = "mock_tx_group";
- public static final int MOCK_SERVER_PORT = 8077;
+ public static final int MOCK_SERVER_PORT = MockServer.findAvailablePort();
+
+ static {
+ System.setProperty("service.mock.grouplist", "127.0.0.1:" + MOCK_SERVER_PORT);
+ }
}