CB-577: model async question ownership race
CI / build (pull_request) Successful in 1m29s
CI / contract (pull_request) Failing after 0s

This commit is contained in:
Dai Ha
2026-08-15 06:24:05 +02:00
parent 927e0151d4
commit 74b0087ebb
@@ -701,23 +701,21 @@ class MessageServiceTest {
void asyncQuestionBelongsToTheTaskThatOwnsItsForwardWaiter() throws Exception {
String first = messages.sendAsync(T, "first task");
awaitWaiting();
String second = messages.sendAsync(T, "second task");
// Model the resolveQuestion/markAsyncQuestion race: another accepted task reached the target set.
Field tasksField = MessageService.class.getDeclaredField("tasks");
tasksField.setAccessible(true);
Map<String, Object> tasks = (Map<String, Object>) tasksField.get(messages);
Field byTargetField = MessageService.class.getDeclaredField("asyncTasksByTarget");
byTargetField.setAccessible(true);
Map<String, Set<Object>> byTarget = (Map<String, Set<Object>>) byTargetField.get(messages);
Set<Object> targetTasks = byTarget.get(T);
Class<?> taskClass = Class.forName(MessageService.class.getName() + "$Task");
var constructor = taskClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
targetTasks.clear();
targetTasks.add(tasks.get(second));
targetTasks.add(constructor.newInstance(T));
CompletableFuture<MessageService.AskResult> ask =
CompletableFuture.supplyAsync(() -> messages.ask(T, "which config?", 5000));
assertEquals(MessageService.Phase.ASKING, awaitTicketPhase(first, MessageService.Phase.ASKING).phase());
assertEquals(MessageService.Phase.PENDING, messages.poll(second).phase());
MessageService.TaskView asking = messages.poll(first);
CompletableFuture<MessageService.Reply> answer = CompletableFuture.supplyAsync(