From 910cd9c8b119fc869841046655019bb37e96a2c1 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Nov 2026 02:46:46 +0000 Subject: [PATCH] fix(compat): match Java 25 context events by input CI run 41759271776 read the second call's userIntent from events.get(0). EventQueue sends on concurrent workers, so capture order is not call order. Match both multi-call context tests by msg and cover reversed delivery without changing production behavior or the matrix. --- .../sdk/ported/ContextParametersTest.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java b/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java index 8a59b32..d93cdac 100644 --- a/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java +++ b/src/test/java/com/agentcat/sdk/ported/ContextParametersTest.java @@ -54,6 +54,21 @@ private static McpSchema.Tool simpleTool(String name) { return McpSchema.Tool.builder(name, Map.of("type", "object", "properties", Map.of())).build(); } + private static PublishEventRequest eventForMessage(List events, String message) { + // EventQueue workers can publish calls in a different order from invocation. + return events.stream() + .filter(event -> "echo".equals(event.getResourceName())) + .filter(event -> { + Map parameters = (Map) event.getParameters(); + Map request = (Map) parameters.get("request"); + Map params = (Map) request.get("params"); + Map arguments = (Map) params.get("arguments"); + return message.equals(arguments.get("msg")); + }) + .findFirst() + .orElseThrow(() -> new AssertionError("No echo event for msg: " + message)); + } + private McpTestContext setupEchoServer(AgentCatOptions opts) throws Exception { var transport = HttpServletStreamableServerTransportProvider.builder().build(); McpSyncServer server = McpServer.sync(transport) @@ -75,6 +90,25 @@ private McpTestContext setupEchoServer(AgentCatOptions opts) throws Exception { return ctx; } + @Test + void findsEchoEventsByMessageInEitherArrivalOrder() { + PublishEventRequest noContext = new PublishEventRequest() + .resourceName("echo") + .parameters(Map.of("request", Map.of("params", Map.of( + "arguments", Map.of("msg", "no context"))))); + PublishEventRequest withContext = new PublishEventRequest() + .resourceName("echo") + .parameters(Map.of("request", Map.of("params", Map.of( + "arguments", Map.of("msg", "with context"))))) + .userIntent("Listing todos to check current status"); + + for (List events : List.of( + List.of(noContext, withContext), List.of(withContext, noContext))) { + assertSame(noContext, eventForMessage(events, "no context")); + assertSame(withContext, eventForMessage(events, "with context")); + } + } + // ───────────────────────────────────────────────────────────────────────── // addContextParameterToTools — unit tests // ───────────────────────────────────────────────────────────────────────── @@ -213,7 +247,10 @@ void worksWithToolsThatHaveContextParameter() throws Exception { List events = capture.getEvents(); assertTrue(events.size() >= 2, "both tool calls must produce events"); - PublishEventRequest lastEvent = events.get(1); + PublishEventRequest firstEvent = eventForMessage(events, "first"); + assertEquals("Creating initial data", firstEvent.getUserIntent(), + "context from first call must be captured as userIntent"); + PublishEventRequest lastEvent = eventForMessage(events, "second"); assertEquals(completionContext, lastEvent.getUserIntent(), "context from second call must be captured as userIntent"); } @@ -246,12 +283,12 @@ void capturesUserIntentOnlyWhenContextProvided() throws Exception { assertTrue(events.size() >= 2); // First call: no userIntent - PublishEventRequest noCtxEvent = events.get(0); + PublishEventRequest noCtxEvent = eventForMessage(events, "no context"); assertNull(noCtxEvent.getUserIntent(), "userIntent must be null when no context is provided"); // Second call: userIntent set - PublishEventRequest withCtxEvent = events.get(1); + PublishEventRequest withCtxEvent = eventForMessage(events, "with context"); assertEquals("Listing todos to check current status", withCtxEvent.getUserIntent(), "userIntent must equal the context argument"); }