Skip to content

Commit 6701c7f

Browse files
committed
test(acp): add lifecycle RED cases
1 parent 336182b commit 6701c7f

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

‎src/test/java/io/github/easy4j/kimi/acp/KimiAcpClientE2ETest.java‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.nio.file.Paths;
2525
import java.util.ArrayList;
2626
import java.util.List;
27+
import java.util.concurrent.CompletableFuture;
28+
import java.util.concurrent.TimeUnit;
2729

2830
import org.junit.jupiter.api.Test;
2931

@@ -51,6 +53,15 @@ private static KimiAcpConfig config() {
5153
return config;
5254
}
5355

56+
private static KimiAcpConfig config(String... modes) {
57+
KimiAcpConfig config = config();
58+
String[] args = new String[modes.length + 1];
59+
args[0] = FAKE_AGENT;
60+
System.arraycopy(modes, 0, args, 1, modes.length);
61+
config.setAcpArgs(args);
62+
return config;
63+
}
64+
5465
@Test
5566
void shouldConnectAndInitialize() {
5667
try (KimiAcpClient client = new KimiAcpClient(config())) {
@@ -148,4 +159,40 @@ void shouldTimeoutPromptWhenAgentNeverAnswers() throws Exception {
148159
assertThrows(KimiException.class, client::connect);
149160
client.close();
150161
}
162+
163+
@Test
164+
void shouldRejectSecondActivePromptOnSameSession() throws Exception {
165+
KimiAcpConfig config = config("--slow-prompt");
166+
config.setReadTimeoutMillis(5_000);
167+
try (KimiAcpClient client = new KimiAcpClient(config)) {
168+
client.connect();
169+
String sessionId = client.newSession("/tmp");
170+
171+
CompletableFuture<KimiAcpTurnResult> first = client.promptAsync(sessionId, "first", null);
172+
173+
assertThrows(KimiException.class,
174+
() -> client.promptAsync(sessionId, "second", null),
175+
"a second active turn must not overwrite the first session stream");
176+
177+
assertEquals("end_turn", first.get(5, TimeUnit.SECONDS).getStopReason());
178+
}
179+
}
180+
181+
@Test
182+
void shouldKeepTransportUsableWhenDeltaCallbackThrows() {
183+
KimiAcpConfig config = config();
184+
config.setReadTimeoutMillis(750);
185+
try (KimiAcpClient client = new KimiAcpClient(config)) {
186+
client.connect();
187+
String sessionId = client.newSession("/tmp");
188+
189+
assertThrows(KimiException.class,
190+
() -> client.prompt(sessionId, "callback failure", delta -> {
191+
throw new IllegalStateException("listener boom");
192+
}));
193+
194+
assertNotNull(client.listSessions(),
195+
"a user callback failure must not terminate the ACP reader transport");
196+
}
197+
}
151198
}

0 commit comments

Comments
 (0)