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