Skip to content

Commit f3f926d

Browse files
committed
test(sse): pin non-idempotent write retry semantics
1 parent ac9f67d commit f3f926d

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

‎src/test/java/io/github/easy4j/hermes/api/sse/SseLifecycleContractTest.java‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,4 +446,53 @@ void repeatedTextWithDifferentServerEventIdsIsPreservedAcrossReattach() throws E
446446
}
447447
}
448448

449+
450+
@Test
451+
void chatTransportFailureDoesNotReplayWithoutVerifiedIdempotency() throws Exception {
452+
try (MockWebServer server = new MockWebServer()) {
453+
server.enqueue(new MockResponse()
454+
.setResponseCode(500)
455+
.setBody("failure"));
456+
server.enqueue(new MockResponse()
457+
.setResponseCode(200)
458+
.setHeader("Content-Type", "text/event-stream")
459+
.setBody("data: [DONE]\n\n"));
460+
server.start();
461+
462+
HermesHttpClientConfig config = new HermesHttpClientConfig()
463+
.setEndpointPolicy(io.github.easy4j.hermes.security.EndpointPolicy
464+
.trustedLocal("127.0.0.1", server.getPort()))
465+
.setBaseUrl("http://127.0.0.1:" + server.getPort());
466+
config.setStreamReconnectMaxAttempts(3);
467+
config.setStreamReconnectInitialDelayMillis(1);
468+
config.setStreamReconnectMaxDelayMillis(1);
469+
470+
ChatRequest request = new ChatRequest();
471+
request.setMessages(Collections.singletonList(
472+
new ChatRequest.Message("user", "hello")));
473+
474+
try (HermesSseClient sse = new HermesSseClient(config, null, null)) {
475+
CountDownLatch failed = new CountDownLatch(1);
476+
AtomicReference<Throwable> failure = new AtomicReference<>();
477+
SseSubscription subscription = sse.subscribeChat(
478+
request, ignored -> { }, () -> { }, error -> {
479+
failure.set(error);
480+
failed.countDown();
481+
});
482+
483+
assertTrue(failed.await(3, TimeUnit.SECONDS));
484+
assertNotNull(failure.get());
485+
486+
long deadline = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(250);
487+
while (server.getRequestCount() < 2 && System.nanoTime() < deadline) {
488+
Thread.yield();
489+
}
490+
491+
assertFalse(subscription.isActive());
492+
assertEquals(1, server.getRequestCount(),
493+
"agent-creation writes must not replay without verified idempotency");
494+
}
495+
}
496+
}
497+
449498
}

0 commit comments

Comments
 (0)