@@ -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