Skip to content

Commit 26b771e

Browse files
committed
Move QueueManager interactions to REST
1 parent c510b62 commit 26b771e

File tree

3 files changed

+84
-11
lines changed

3 files changed

+84
-11
lines changed

reference-impl/src/test/java/io/a2a/server/apps/quarkus/A2ATestRoutes.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@
99

1010
import io.a2a.server.apps.common.TestUtilsBean;
1111
import io.a2a.spec.Task;
12+
import io.a2a.spec.TaskArtifactUpdateEvent;
13+
import io.a2a.spec.TaskStatusUpdateEvent;
1214
import io.a2a.util.Utils;
1315
import io.quarkus.vertx.web.Body;
1416
import io.quarkus.vertx.web.Param;
1517
import io.quarkus.vertx.web.Route;
1618
import io.vertx.ext.web.RoutingContext;
1719

20+
/**
21+
* Exposes the {@link TestUtilsBean} via REST using Quarkus Reactive Routes
22+
*/
1823
@Singleton
1924
public class A2ATestRoutes {
2025
@Inject
@@ -73,6 +78,46 @@ public void deleteTask(@Param String taskId, RoutingContext rc) {
7378
}
7479
}
7580

81+
@Route(path = "test/queue/ensure/:taskId", methods = {Route.HttpMethod.POST})
82+
public void ensureTaskQueue(@Param String taskId, RoutingContext rc) {
83+
try {
84+
testUtilsBean.ensureQueue(taskId);
85+
rc.response()
86+
.setStatusCode(200)
87+
.end();
88+
} catch (Throwable t) {
89+
errorResponse(t, rc);
90+
}
91+
}
92+
93+
@Route(path = "test/queue/enqueueTaskStatusUpdateEvent/:taskId", methods = {Route.HttpMethod.POST})
94+
public void enqueueTaskStatusUpdateEvent(@Param String taskId, @Body String body, RoutingContext rc) {
95+
96+
try {
97+
TaskStatusUpdateEvent event = Utils.OBJECT_MAPPER.readValue(body, TaskStatusUpdateEvent.class);
98+
testUtilsBean.enqueueEvent(taskId, event);
99+
rc.response()
100+
.setStatusCode(200)
101+
.end();
102+
} catch (Throwable t) {
103+
errorResponse(t, rc);
104+
}
105+
}
106+
107+
@Route(path = "test/queue/enqueueTaskArtifactUpdateEvent/:taskId", methods = {Route.HttpMethod.POST})
108+
public void enqueueTaskArtifactUpdateEvent(@Param String taskId, @Body String body, RoutingContext rc) {
109+
110+
try {
111+
TaskArtifactUpdateEvent event = Utils.OBJECT_MAPPER.readValue(body, TaskArtifactUpdateEvent.class);
112+
testUtilsBean.enqueueEvent(taskId, event);
113+
rc.response()
114+
.setStatusCode(200)
115+
.end();
116+
} catch (Throwable t) {
117+
errorResponse(t, rc);
118+
}
119+
}
120+
76121
private void errorResponse(Throwable t, RoutingContext rc) {
77122
rc.response()
78123
.setStatusCode(200)

reference-impl/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AServerTest.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,10 @@
1010
@QuarkusTest
1111
public class QuarkusA2AServerTest extends AbstractA2AServerTest {
1212

13-
@Inject
14-
InMemoryQueueManager queueManager;
15-
1613
public QuarkusA2AServerTest() {
1714
super(8081);
1815
}
1916

20-
@Override
21-
protected InMemoryQueueManager getQueueManager() {
22-
return queueManager;
23-
}
24-
2517
@Override
2618
protected void setStreamingSubscribedRunnable(Runnable runnable) {
2719
A2AServerRoutes.setStreamingMultiSseSupportSubscribedRunnable(runnable);

tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ public void testResubscribeExistingTaskSuccess() throws Exception {
630630
// attempting to send a streaming message instead of explicitly calling queueManager#createOrTap
631631
// does not work because after the message is sent, the queue becomes null but task resubscription
632632
// requires the queue to still be active
633-
getQueueManager().createOrTap(MINIMAL_TASK.getId());
633+
ensureQueueForTask(MINIMAL_TASK.getId());
634634

635635
CountDownLatch taskResubscriptionRequestSent = new CountDownLatch(1);
636636
CountDownLatch taskResubscriptionResponseReceived = new CountDownLatch(2);
@@ -701,7 +701,7 @@ public void testResubscribeExistingTaskSuccess() throws Exception {
701701
.build());
702702

703703
for (Event event : events) {
704-
getQueueManager().get(MINIMAL_TASK.getId()).enqueueEvent(event);
704+
enqueueEventOnServer(event);
705705
}
706706
} catch (InterruptedException e) {
707707
Thread.currentThread().interrupt();
@@ -941,7 +941,43 @@ protected void deleteTaskInTaskStore(String taskId) throws Exception {
941941
}
942942
}
943943

944-
protected abstract InMemoryQueueManager getQueueManager();
944+
protected void ensureQueueForTask(String taskId) throws Exception {
945+
HttpClient client = HttpClient.newBuilder()
946+
.version(HttpClient.Version.HTTP_2)
947+
.build();
948+
HttpRequest request = HttpRequest.newBuilder()
949+
.uri(URI.create("http://localhost:" + serverPort + "/test/queue/ensure/" + taskId))
950+
.POST(HttpRequest.BodyPublishers.noBody())
951+
.build();
952+
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
953+
if (response.statusCode() != 200) {
954+
throw new RuntimeException(response.statusCode() + ": Deleting task failed!" + response.body());
955+
}
956+
}
957+
958+
protected void enqueueEventOnServer(Event event) throws Exception {
959+
String path = null;
960+
if (event instanceof TaskArtifactUpdateEvent e) {
961+
path = "test/queue/enqueueTaskArtifactUpdateEvent/" + e.getTaskId();
962+
} else if (event instanceof TaskStatusUpdateEvent e) {
963+
path = "test/queue/enqueueTaskStatusUpdateEvent/" + e.getTaskId();
964+
} else {
965+
throw new RuntimeException("Unknown event type " + event.getClass() + ". If you need the ability to" +
966+
" handle more types, please add the REST endpoints.");
967+
}
968+
HttpClient client = HttpClient.newBuilder()
969+
.version(HttpClient.Version.HTTP_2)
970+
.build();
971+
HttpRequest request = HttpRequest.newBuilder()
972+
.uri(URI.create("http://localhost:" + serverPort + "/" + path))
973+
.POST(HttpRequest.BodyPublishers.ofString(Utils.OBJECT_MAPPER.writeValueAsString(event)))
974+
.build();
975+
976+
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
977+
if (response.statusCode() != 200) {
978+
throw new RuntimeException(response.statusCode() + ": Deleting task failed!" + response.body());
979+
}
980+
}
945981

946982
protected abstract void setStreamingSubscribedRunnable(Runnable runnable);
947983

0 commit comments

Comments
 (0)