From 74b0087ebb54ceaa926a005a0f6af09f64945711 Mon Sep 17 00:00:00 2001 From: Dai Ha Date: Sat, 15 Aug 2026 06:24:05 +0200 Subject: [PATCH] CB-577: model async question ownership race --- .../java/dev/ltms/bridged/msg/MessageServiceTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/bridged/src/test/java/dev/ltms/bridged/msg/MessageServiceTest.java b/bridged/src/test/java/dev/ltms/bridged/msg/MessageServiceTest.java index c14001b..a72804e 100644 --- a/bridged/src/test/java/dev/ltms/bridged/msg/MessageServiceTest.java +++ b/bridged/src/test/java/dev/ltms/bridged/msg/MessageServiceTest.java @@ -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 tasks = (Map) tasksField.get(messages); Field byTargetField = MessageService.class.getDeclaredField("asyncTasksByTarget"); byTargetField.setAccessible(true); Map> byTarget = (Map>) byTargetField.get(messages); Set 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 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 answer = CompletableFuture.supplyAsync(