Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public void testA2AClientResubscribeToTask() throws Exception {
assertEquals("artifact-1", artifact.artifactId());
assertEquals("joke", artifact.name());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public void testA2AClientSendMessage() throws Exception {
assertEquals("joke", artifact.name());
assertEquals(1, artifact.parts().size());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
assertTrue(task.metadata().isEmpty());
}
Expand Down Expand Up @@ -172,7 +172,7 @@ public void testA2AClientSendMessageWithMessageResponse() throws Exception {
Message agentMessage = (Message) result;
assertEquals(Message.Role.AGENT, agentMessage.role());
Part<?> part = agentMessage.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
assertEquals("msg-456", agentMessage.messageId());
}
Expand Down Expand Up @@ -243,7 +243,7 @@ public void testA2AClientGetTask() throws Exception {
assertEquals(1, artifact.parts().size());
assertEquals("artifact-1", artifact.artifactId());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
assertTrue(task.metadata().isEmpty());
List<Message> history = task.history();
Expand All @@ -255,15 +255,15 @@ public void testA2AClientGetTask() throws Exception {
assertNotNull(parts);
assertEquals(3, parts.size());
part = parts.get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("tell me a joke", ((TextPart)part).text());
part = parts.get(1);
assertEquals(Part.Kind.FILE, part.getKind());
assertTrue(part instanceof FilePart);
FileContent filePart = ((FilePart) part).file();
assertEquals("file:///path/to/file.txt", ((FileWithUri) filePart).uri());
assertEquals("text/plain", filePart.mimeType());
part = parts.get(2);
assertEquals(Part.Kind.FILE, part.getKind());
assertTrue(part instanceof FilePart);
filePart = ((FilePart) part).file();
assertEquals("aGVsbG8=", ((FileWithBytes) filePart).bytes());
assertEquals("hello.txt", filePart.name());
Expand Down Expand Up @@ -558,7 +558,7 @@ public void testA2AClientSendMessageWithFilePart() throws Exception {
assertEquals("image-analysis", artifact.name());
assertEquals(1, artifact.parts().size());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("This is an image of a cat sitting on a windowsill.", ((TextPart) part).text());
assertFalse(task.metadata().isEmpty());
assertEquals(1, task.metadata().size());
Expand Down Expand Up @@ -618,7 +618,7 @@ public void testA2AClientSendMessageWithDataPart() throws Exception {
assertEquals("data-analysis", artifact.name());
assertEquals(1, artifact.parts().size());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Processed weather data: Temperature is 25.5°C, humidity is 60.2% in San Francisco.", ((TextPart) part).text());
assertTrue(task.metadata().isEmpty());
}
Expand Down Expand Up @@ -676,7 +676,7 @@ public void testA2AClientSendMessageWithMixedParts() throws Exception {
assertEquals("mixed-analysis", artifact.name());
assertEquals(1, artifact.parts().size());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof TextPart);
assertEquals("Analyzed chart image and data: Bar chart showing quarterly data with values [10, 20, 30, 40].", ((TextPart) part).text());
assertTrue(task.metadata().isEmpty());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public void testOnEventWithTaskArtifactUpdateEventEvent() throws Exception {
Artifact artifact = taskArtifactUpdateEvent.artifact();
assertEquals("artifact-1", artifact.artifactId());
assertEquals(1, artifact.parts().size());
assertEquals(Part.Kind.TEXT, artifact.parts().get(0).getKind());
assertTrue(artifact.parts().get(0) instanceof TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
import io.a2a.spec.MessageSendConfiguration;
import io.a2a.spec.MessageSendParams;
import io.a2a.spec.Part;
import io.a2a.spec.Part.Kind;
import io.a2a.spec.PushNotificationConfig;
import io.a2a.spec.StreamingEventKind;
import io.a2a.spec.Task;
Expand Down Expand Up @@ -148,7 +147,7 @@ public void testSendMessage() throws Exception {
assertEquals("message-1234", history.messageId());
assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", history.taskId());
assertEquals(1, history.parts().size());
assertEquals(Kind.TEXT, history.parts().get(0).getKind());
assertTrue(history.parts().get(0) instanceof io.a2a.spec.TextPart);
assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text());
assertNull(task.metadata());
assertNull(history.referenceTaskIds());
Expand Down Expand Up @@ -210,22 +209,22 @@ public void testGetTask() throws Exception {
assertEquals("artifact-1", artifact.artifactId());
assertNull(artifact.name());
assertEquals(false, artifact.parts().isEmpty());
assertEquals(Kind.TEXT, artifact.parts().get(0).getKind());
assertTrue(artifact.parts().get(0) instanceof io.a2a.spec.TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text());
assertEquals(1, task.history().size());
Message history = task.history().get(0);
assertEquals("message", history.kind());
assertEquals(Message.Role.USER, history.role());
assertEquals("message-123", history.messageId());
assertEquals(3, history.parts().size());
assertEquals(Kind.TEXT, history.parts().get(0).getKind());
assertTrue(history.parts().get(0) instanceof io.a2a.spec.TextPart);
assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text());
assertEquals(Kind.FILE, history.parts().get(1).getKind());
assertTrue(history.parts().get(1) instanceof FilePart);
FilePart part = (FilePart) history.parts().get(1);
assertEquals("text/plain", part.file().mimeType());
assertEquals("file:///path/to/file.txt", ((FileWithUri) part.file()).uri());
part = (FilePart) history.parts().get(2);
assertEquals(Kind.FILE, part.getKind());
assertTrue(part instanceof FilePart);
assertEquals("text/plain", part.file().mimeType());
assertEquals("aGVsbG8=", ((FileWithBytes) part.file()).bytes());
assertNull(history.metadata());
Expand Down Expand Up @@ -448,7 +447,7 @@ public void testResubscribe() throws Exception {
assertEquals("artifact-1", artifact.artifactId());
assertEquals("joke", artifact.name());
Part<?> part = artifact.parts().get(0);
assertEquals(Part.Kind.TEXT, part.getKind());
assertTrue(part instanceof io.a2a.spec.TextPart);
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ private String getLastTextPart(Message message) throws JSONRPCError {
return "";
}
Part<?> part = message.parts().get(message.parts().size() - 1);
if (part.getKind() == Part.Kind.TEXT) {
if (part instanceof TextPart) {
return ((TextPart) part).text();
}
throw new InvalidRequestError("Last part is not text");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void testTaskSerialization() throws JsonProcessingException {

// Test serialization as Event
String json = JsonUtil.toJson(originalTask);
assertTrue(json.contains("\"kind\":\"task\""), "JSON should contain task kind");
assertTrue(json.contains("\"task\""), "JSON should contain task wrapper");
assertTrue(json.contains("\"id\":\"test-task-123\""), "JSON should contain task ID");

// Test deserialization back to StreamingEventKind
Expand Down Expand Up @@ -84,7 +84,7 @@ public void testMessageSerialization() throws JsonProcessingException {

// Test serialization as Event
String json = JsonUtil.toJson(originalMessage);
assertTrue(json.contains("\"kind\":\"message\""), "JSON should contain message kind");
assertTrue(json.contains("\"message\""), "JSON should contain message wrapper");
assertTrue(json.contains("\"taskId\":\"test-task-789\""), "JSON should contain task ID");

// Test deserialization back to StreamingEventKind
Expand Down Expand Up @@ -115,7 +115,7 @@ public void testTaskStatusUpdateEventSerialization() throws JsonProcessingExcept

// Test serialization as Event
String json = JsonUtil.toJson((Event) originalEvent);
assertTrue(json.contains("\"kind\":\"status-update\""), "JSON should contain status-update kind");
assertTrue(json.contains("\"statusUpdate\""), "JSON should contain statusUpdate wrapper");
assertTrue(json.contains("\"taskId\":\"test-task-abc\""), "JSON should contain task ID");
assertTrue(json.contains("\"final\":true"), "JSON should contain final flag");

Expand Down Expand Up @@ -148,7 +148,7 @@ public void testTaskArtifactUpdateEventSerialization() throws JsonProcessingExce

// Test serialization as Event
String json = JsonUtil.toJson((Event) originalEvent);
assertTrue(json.contains("\"kind\":\"artifact-update\""), "JSON should contain artifact-update kind");
assertTrue(json.contains("\"artifactUpdate\""), "JSON should contain artifactUpdate wrapper");
assertTrue(json.contains("\"taskId\":\"test-task-xyz\""), "JSON should contain task ID");
assertTrue(json.contains("\"test-artifact-123\""), "JSON should contain artifact ID");

Expand Down Expand Up @@ -216,7 +216,7 @@ public void testReplicatedEventWithStreamingEventSerialization() throws JsonProc
String json = JsonUtil.toJson(originalReplicatedEvent);
assertTrue(json.contains("\"taskId\":\"replicated-test-task\""), "JSON should contain task ID");
assertTrue(json.contains("\"event\""), "JSON should contain event field");
assertTrue(json.contains("\"kind\":\"status-update\""), "JSON should contain the event kind");
assertTrue(json.contains("\"statusUpdate\""), "JSON should contain the event type wrapper");
assertFalse(json.contains("\"error\""), "JSON should not contain error field");

// Deserialize the ReplicatedEventQueueItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ void testReplicatedEventJsonSerialization() throws Exception {
assertNotNull(json);
assertTrue(json.contains("json-test-task"));
assertTrue(json.contains("\"event\":{"));
assertTrue(json.contains("\"kind\":\"status-update\""));
assertTrue(json.contains("\"statusUpdate\""));

// Deserialize back
ReplicatedEventQueueItem deserialized = JsonUtil.fromJson(json, ReplicatedEventQueueItem.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public void testA2AMessageReplicatedToKafka() throws Exception {
assertEquals(contextId, statusUpdateEvent.contextId(), "Event context ID should match original context ID");
assertEquals(TaskState.SUBMITTED, statusUpdateEvent.status().state(), "Event should show SUBMITTED state");
assertFalse(statusUpdateEvent.isFinal(), "Event should show final:false");
assertEquals("status-update", statusUpdateEvent.kind(), "Event should indicate status-update type");
assertEquals(TaskStatusUpdateEvent.STREAMING_EVENT_ID, statusUpdateEvent.kind(), "Event should indicate status-update type");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private String getLastTextPart(Message message) throws JSONRPCError {
throw new InvalidRequestError("No parts in message");
}
Part<?> part = message.parts().get(message.parts().size() - 1);
if (part.getKind() == Part.Kind.TEXT) {
if (part instanceof TextPart) {
return ((TextPart) part).text();
}
throw new InvalidRequestError("Last part is not text");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC

private String getLastTextPart(Message message) throws JSONRPCError {
Part<?> part = message.parts().get(message.parts().size() - 1);
if (part.getKind() == Part.Kind.TEXT) {
if (part instanceof TextPart) {
return ((TextPart) part).text();
}
throw new InvalidRequestError("No parts");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ private String getMessageText(Message message, String delimiter) {

private List<String> getTextParts(List<Part<?>> parts) {
return parts.stream()
.filter(part -> part.getKind() == Part.Kind.TEXT)
.filter(part -> part instanceof TextPart)
.map(part -> (TextPart) part)
.map(TextPart::text)
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,15 @@ public class EventConsumerTest {
{
"id": "123",
"contextId": "session-xyz",
"status": {"state": "submitted"},
"kind": "task"
"status": {"state": "submitted"}
}
""";

private static final String MESSAGE_PAYLOAD = """
{
"role": "agent",
"parts": [{"kind": "text", "text": "test message"}],
"messageId": "111",
"kind": "message"
"parts": [{"text": "test message"}],
"messageId": "111"
}
""";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,15 @@ public class EventQueueTest {
{
"id": "123",
"contextId": "session-xyz",
"status": {"state": "submitted"},
"kind": "task"
"status": {"state": "submitted"}
}
""";

private static final String MESSAGE_PAYLOAD = """
{
"role": "agent",
"parts": [{"kind": "text", "text": "test message"}],
"messageId": "111",
"kind": "message"
"parts": [{"text": "test message"}],
"messageId": "111"
}
""";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ public class InMemoryTaskStoreTest {
{
"id": "task-abc",
"contextId" : "session-xyz",
"status": {"state": "submitted"},
"kind": "task"
"status": {"state": "submitted"}
}""";

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ public class TaskManagerTest {
{
"id": "task-abc",
"contextId" : "session-xyz",
"status": {"state": "submitted"},
"kind": "task"
"status": {"state": "submitted"}
}""";

Task minimalTask;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,22 @@ default io.a2a.grpc.StreamResponse toProto(StreamingEventKind domain) {
return null;
}

if (domain instanceof Task task) {
return io.a2a.grpc.StreamResponse.newBuilder()
.setTask(TaskMapper.INSTANCE.toProto(task))
return switch (domain.kind()) {
case Task.STREAMING_EVENT_ID -> io.a2a.grpc.StreamResponse.newBuilder()
.setTask(TaskMapper.INSTANCE.toProto((Task) domain))
.build();
} else if (domain instanceof Message message) {
return io.a2a.grpc.StreamResponse.newBuilder()
.setMsg(MessageMapper.INSTANCE.toProto(message))
case Message.STREAMING_EVENT_ID -> io.a2a.grpc.StreamResponse.newBuilder()
.setMsg(MessageMapper.INSTANCE.toProto((Message) domain))
.build();
} else if (domain instanceof TaskStatusUpdateEvent statusUpdate) {
return io.a2a.grpc.StreamResponse.newBuilder()
.setStatusUpdate(TaskStatusUpdateEventMapper.INSTANCE.toProto(statusUpdate))
case TaskStatusUpdateEvent.STREAMING_EVENT_ID -> io.a2a.grpc.StreamResponse.newBuilder()
.setStatusUpdate(TaskStatusUpdateEventMapper.INSTANCE.toProto((TaskStatusUpdateEvent) domain))
.build();
} else if (domain instanceof TaskArtifactUpdateEvent artifactUpdate) {
return io.a2a.grpc.StreamResponse.newBuilder()
.setArtifactUpdate(TaskArtifactUpdateEventMapper.INSTANCE.toProto(artifactUpdate))
case TaskArtifactUpdateEvent.STREAMING_EVENT_ID -> io.a2a.grpc.StreamResponse.newBuilder()
.setArtifactUpdate(TaskArtifactUpdateEventMapper.INSTANCE.toProto((TaskArtifactUpdateEvent) domain))
.build();
}

throw new IllegalArgumentException("Unknown StreamingEventKind type: " + domain.getClass().getName());
default ->
throw new IllegalArgumentException("Unknown StreamingEventKind type: " + domain.getClass().getName());
};
}

/**
Expand Down
Loading