Skip to content

Commit 1adb96c

Browse files
authored
fix: Ensure messageId is required for a Message. Allow the messageId to be randomly generated if not set when using the Message.Builder (#261)
# Description Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [x] Follow the [`CONTRIBUTING` Guide](../CONTRIBUTING.md). - [x] Make your Pull Request title in the <https://www.conventionalcommits.org/> specification. - Important Prefixes for [release-please](https://github.com/googleapis/release-please): - `fix:` which represents bug fixes, and correlates to a [SemVer](https://semver.org/) patch. - `feat:` represents a new feature, and correlates to a SemVer minor. - `feat!:`, or `fix!:`, `refactor!:`, etc., which represent a breaking change (indicated by the `!`) and will result in a SemVer major. - [x] Ensure the tests pass - [x] Appropriate READMEs were updated (if necessary) Fixes #<issue_number_goes_here> 🦕
1 parent 6ceb364 commit 1adb96c

File tree

4 files changed

+36
-19
lines changed

4 files changed

+36
-19
lines changed

server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.a2a.server.agentexecution;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertNotNull;
46
import static org.junit.jupiter.api.Assertions.assertNull;
57
import static org.junit.jupiter.api.Assertions.assertThrows;
68
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -23,8 +25,6 @@
2325

2426
public class RequestContextTest {
2527

26-
private static final String MESSAGE_ID = "123";
27-
2828
@Test
2929
public void testInitWithoutParams() {
3030
RequestContext context = new RequestContext(null, null, null, null, null, null);
@@ -37,7 +37,7 @@ public void testInitWithoutParams() {
3737

3838
@Test
3939
public void testInitWithParamsNoIds() {
40-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
40+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
4141
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
4242

4343
UUID taskId = UUID.fromString("00000000-0000-0000-0000-000000000001");
@@ -61,7 +61,7 @@ public void testInitWithParamsNoIds() {
6161
@Test
6262
public void testInitWithTaskId() {
6363
String taskId = "task-123";
64-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(taskId).build();
64+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(taskId).build();
6565
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
6666

6767
RequestContext context = new RequestContext(mockParams, taskId, null, null, null, null);
@@ -73,7 +73,7 @@ public void testInitWithTaskId() {
7373
@Test
7474
public void testInitWithContextId() {
7575
String contextId = "context-456";
76-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).contextId(contextId).build();
76+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).contextId(contextId).build();
7777
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
7878
RequestContext context = new RequestContext(mockParams, null, contextId, null, null, null);
7979

@@ -85,7 +85,7 @@ public void testInitWithContextId() {
8585
public void testInitWithBothIds() {
8686
String taskId = "task-123";
8787
String contextId = "context-456";
88-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(taskId).contextId(contextId).build();
88+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(taskId).contextId(contextId).build();
8989
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
9090
RequestContext context = new RequestContext(mockParams, taskId, contextId, null, null, null);
9191

@@ -97,7 +97,7 @@ public void testInitWithBothIds() {
9797

9898
@Test
9999
public void testInitWithTask() {
100-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
100+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
101101
var mockTask = new Task.Builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build();
102102
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
103103

@@ -132,7 +132,7 @@ public void testAttachRelatedTask() {
132132
@Test
133133
public void testCheckOrGenerateTaskIdWithExistingTaskId() {
134134
String existingId = "existing-task-id";
135-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(existingId).build();
135+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId(existingId).build();
136136
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
137137

138138
RequestContext context = new RequestContext(mockParams, null, null, null, null, null);
@@ -145,7 +145,7 @@ public void testCheckOrGenerateTaskIdWithExistingTaskId() {
145145
public void testCheckOrGenerateContextIdWithExistingContextId() {
146146
String existingId = "existing-context-id";
147147

148-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).contextId(existingId).build();
148+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).contextId(existingId).build();
149149
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
150150

151151
RequestContext context = new RequestContext(mockParams, null, null, null, null, null);
@@ -156,7 +156,7 @@ public void testCheckOrGenerateContextIdWithExistingContextId() {
156156

157157
@Test
158158
public void testInitRaisesErrorOnTaskIdMismatch() {
159-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").build();
159+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").build();
160160
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
161161
var mockTask = new Task.Builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build();
162162

@@ -168,7 +168,7 @@ public void testInitRaisesErrorOnTaskIdMismatch() {
168168

169169
@Test
170170
public void testInitRaisesErrorOnContextIdMismatch() {
171-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
171+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
172172
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
173173
var mockTask = new Task.Builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build();
174174

@@ -200,7 +200,7 @@ public void testMessagePropertyWithoutParams() {
200200

201201
@Test
202202
public void testMessagePropertyWithParams() {
203-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
203+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
204204
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
205205

206206
RequestContext context = new RequestContext(mockParams, null, null, null, null, null);
@@ -212,7 +212,7 @@ public void testInitWithExistingIdsInMessage() {
212212
String existingTaskId = "existing-task-id";
213213
String existingContextId = "existing-context-id";
214214

215-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart("")))
215+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart("")))
216216
.taskId(existingTaskId).contextId(existingContextId).build();
217217
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
218218

@@ -224,7 +224,7 @@ public void testInitWithExistingIdsInMessage() {
224224

225225
@Test
226226
public void testInitWithTaskIdAndExistingTaskIdMatch() {
227-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
227+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
228228
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
229229
var mockTask = new Task.Builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build();
230230

@@ -237,7 +237,7 @@ public void testInitWithTaskIdAndExistingTaskIdMatch() {
237237

238238
@Test
239239
public void testInitWithContextIdAndExistingContextIdMatch() {
240-
var mockMessage = new Message.Builder().messageId(MESSAGE_ID).role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
240+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).taskId("task-123").contextId("context-456").build();
241241
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
242242
var mockTask = new Task.Builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build();
243243

@@ -247,4 +247,23 @@ public void testInitWithContextIdAndExistingContextIdMatch() {
247247
assertEquals(mockTask.getContextId(), context.getContextId());
248248
assertEquals(mockTask, context.getTask());
249249
}
250+
251+
@Test
252+
void testMessageBuilderGeneratesId() {
253+
var mockMessage = new Message.Builder().role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
254+
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
255+
256+
RequestContext context = new RequestContext(mockParams, null, null, null, null, null);
257+
assertNotNull(mockMessage.getMessageId());
258+
assertFalse(mockMessage.getMessageId().isEmpty());
259+
}
260+
261+
@Test
262+
void testMessageBuilderUsesProvidedId() {
263+
var mockMessage = new Message.Builder().messageId("123").role(Message.Role.USER).parts(List.of(new TextPart(""))).build();
264+
var mockParams = new MessageSendParams.Builder().message(mockMessage).build();
265+
266+
RequestContext context = new RequestContext(mockParams, null, null, null, null, null);
267+
assertEquals("123", mockMessage.getMessageId());
268+
}
250269
}

server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@
2525
public class TaskUpdaterTest {
2626
public static final String TEST_TASK_ID = "test-task-id";
2727
public static final String TEST_TASK_CONTEXT_ID = "test-task-context-id";
28-
private static final String TEST_MESSAGE_ID = "123";
2928

3029
private static final Message SAMPLE_MESSAGE = new Message.Builder()
31-
.messageId(TEST_MESSAGE_ID)
3230
.taskId(TEST_TASK_ID)
3331
.contextId(TEST_TASK_CONTEXT_ID)
3432
.parts(new TextPart("Test message"))

spec/src/main/java/io/a2a/spec/Message.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ public Builder metadata(Map<String, Object> metadata) {
187187
}
188188

189189
public Message build() {
190-
return new Message(role, parts, messageId, contextId, taskId, referenceTaskIds, metadata);
190+
return new Message(role, parts, messageId == null ? UUID.randomUUID().toString() : messageId,
191+
contextId, taskId, referenceTaskIds, metadata);
191192
}
192193
}
193194
}

transport/jsonrpc/src/test/java/io/a2a/transport/jsonrpc/handler/JSONRPCHandlerTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,6 @@ public void testOnResubscribeExistingTaskSuccess() {
718718

719719
// We need to send some events in order for those to end up in the queue
720720
Message message = new Message.Builder()
721-
.messageId("123")
722721
.taskId(MINIMAL_TASK.getId())
723722
.contextId(MINIMAL_TASK.getContextId())
724723
.role(Message.Role.AGENT)

0 commit comments

Comments
 (0)