Fix tests by restarting the container in each test

The reason is that the server performs shutdown after SSE connection is
closed.
This commit is contained in:
Dariusz Jędrzejczyk 2024-12-17 15:33:41 +01:00
commit 8b2ce26e8a
No known key found for this signature in database
GPG key ID: FD786A4E2335C448
7 changed files with 49 additions and 20 deletions

View file

@ -55,9 +55,13 @@ public abstract class AbstractMcpAsyncClientTests {
abstract protected void createMcpTransport(); abstract protected void createMcpTransport();
abstract protected void onStart();
abstract protected void onClose();
@BeforeEach @BeforeEach
void setUp() { void setUp() {
onStart();
createMcpTransport(); createMcpTransport();
assertThatCode(() -> { assertThatCode(() -> {
@ -72,6 +76,7 @@ public abstract class AbstractMcpAsyncClientTests {
assertThatCode(() -> mcpAsyncClient.closeGracefully().block(Duration.ofSeconds(10))) assertThatCode(() -> mcpAsyncClient.closeGracefully().block(Duration.ofSeconds(10)))
.doesNotThrowAnyException(); .doesNotThrowAnyException();
} }
onClose();
} }
@Test @Test

View file

@ -55,8 +55,13 @@ public abstract class AbstractMcpSyncClientTests {
abstract protected void createMcpTransport(); abstract protected void createMcpTransport();
abstract protected void onStart();
abstract protected void onClose();
@BeforeEach @BeforeEach
void setUp() { void setUp() {
onStart();
createMcpTransport(); createMcpTransport();
assertThatCode(() -> { assertThatCode(() -> {
@ -70,6 +75,7 @@ public abstract class AbstractMcpSyncClientTests {
if (mcpSyncClient != null) { if (mcpSyncClient != null) {
assertThatCode(() -> mcpSyncClient.close()).doesNotThrowAnyException(); assertThatCode(() -> mcpSyncClient.close()).doesNotThrowAnyException();
} }
onClose();
} }
@Test @Test

View file

@ -16,8 +16,6 @@
package org.springframework.ai.mcp.client.sse; package org.springframework.ai.mcp.client.sse;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.Timeout;
import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.Wait;
@ -38,7 +36,7 @@ class SseMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image // Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource") @SuppressWarnings("resource")
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1") GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String())) .withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001) .withExposedPorts(3001)
.waitingFor(Wait.forHttp("/").forStatusCode(404)); .waitingFor(Wait.forHttp("/").forStatusCode(404));
@ -48,15 +46,15 @@ class SseMcpAsyncClientTests extends AbstractMcpAsyncClientTests {
this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host)); this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host));
} }
@BeforeAll @Override
static void beforeAll() { protected void onStart() {
container.start(); container.start();
int port = container.getMappedPort(3001); int port = container.getMappedPort(3001);
host = "http://" + container.getHost() + ":" + port; host = "http://" + container.getHost() + ":" + port;
} }
@AfterAll @Override
public static void cleanup() { public void onClose() {
container.stop(); container.stop();
} }

View file

@ -16,8 +16,8 @@
package org.springframework.ai.mcp.client.sse; package org.springframework.ai.mcp.client.sse;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.Timeout;
import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.Wait;
@ -38,7 +38,7 @@ class SseMcpSyncClientTests extends AbstractMcpSyncClientTests {
// Uses the https://github.com/tzolov/mcp-everything-server-docker-image // Uses the https://github.com/tzolov/mcp-everything-server-docker-image
@SuppressWarnings("resource") @SuppressWarnings("resource")
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1") GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String())) .withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001) .withExposedPorts(3001)
.waitingFor(Wait.forHttp("/").forStatusCode(404)); .waitingFor(Wait.forHttp("/").forStatusCode(404));
@ -48,15 +48,15 @@ class SseMcpSyncClientTests extends AbstractMcpSyncClientTests {
this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host)); this.mcpTransport = new SseServerTransport(WebClient.builder().baseUrl(host));
} }
@BeforeAll @Override
static void beforeAll() { protected void onStart() {
container.start(); container.start();
int port = container.getMappedPort(3001); int port = container.getMappedPort(3001);
host = "http://" + container.getHost() + ":" + port; host = "http://" + container.getHost() + ":" + port;
} }
@AfterAll @Override
public static void cleanup() { protected void onClose() {
container.stop(); container.stop();
} }

View file

@ -51,7 +51,7 @@ class SseServerTransportTests {
static String host = "http://localhost:3001"; static String host = "http://localhost:3001";
@SuppressWarnings("resource") @SuppressWarnings("resource")
static GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1") GenericContainer<?> container = new GenericContainer<>("docker.io/tzolov/mcp-everything-server:v1")
.withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String())) .withLogConsumer(outputFrame -> System.out.println(outputFrame.getUtf8String()))
.withExposedPorts(3001) .withExposedPorts(3001)
.waitingFor(Wait.forHttp("/").forStatusCode(404)); .waitingFor(Wait.forHttp("/").forStatusCode(404));
@ -98,8 +98,7 @@ class SseServerTransportTests {
} }
@BeforeAll void startContainer() {
static void beforeAll() {
container.start(); container.start();
int port = container.getMappedPort(3001); int port = container.getMappedPort(3001);
host = "http://" + container.getHost() + ":" + port; host = "http://" + container.getHost() + ":" + port;
@ -107,6 +106,7 @@ class SseServerTransportTests {
@BeforeEach @BeforeEach
void setUp() { void setUp() {
startContainer();
webClientBuilder = WebClient.builder().baseUrl(host); webClientBuilder = WebClient.builder().baseUrl(host);
objectMapper = new ObjectMapper(); objectMapper = new ObjectMapper();
transport = new TestSseServerTransport(webClientBuilder, objectMapper); transport = new TestSseServerTransport(webClientBuilder, objectMapper);
@ -117,10 +117,10 @@ class SseServerTransportTests {
if (transport != null) { if (transport != null) {
assertThatCode(() -> transport.closeGracefully().block(Duration.ofSeconds(10))).doesNotThrowAnyException(); assertThatCode(() -> transport.closeGracefully().block(Duration.ofSeconds(10))).doesNotThrowAnyException();
} }
cleanup();
} }
@AfterAll void cleanup() {
static void cleanup() {
container.stop(); container.stop();
} }

View file

@ -37,4 +37,14 @@ class McpAsyncClientTests extends AbstractMcpAsyncClientTests {
this.mcpTransport = new StdioServerTransport(stdioParams); this.mcpTransport = new StdioServerTransport(stdioParams);
} }
@Override
protected void onStart() {
}
@Override
protected void onClose() {
}
} }

View file

@ -37,4 +37,14 @@ class McpSyncClientTests extends AbstractMcpSyncClientTests {
this.mcpTransport = new StdioServerTransport(stdioParams); this.mcpTransport = new StdioServerTransport(stdioParams);
} }
@Override
protected void onStart() {
}
@Override
protected void onClose() {
}
} }