From bd2125b2b3849d67460bb2eb0d4aac1b4bc2067c Mon Sep 17 00:00:00 2001 From: Gyuhyeok99 Date: Wed, 14 Jan 2026 11:52:13 +0900 Subject: [PATCH] s2a: Improve S2AStubTest clarity and performance Rename send_receiveOkStatus to test successful response handling using FakeWriter instead of timing out with a real connection. Add send_withUnavailableService_throwsDeadlineExceeded test with a 1-second deadline to verify timeout behavior without the 20-second wait. --- .../grpc/s2a/internal/handshaker/S2AStub.java | 16 ++++++++- .../s2a/internal/handshaker/S2AStubTest.java | 33 ++++++++++++++----- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/s2a/src/main/java/io/grpc/s2a/internal/handshaker/S2AStub.java b/s2a/src/main/java/io/grpc/s2a/internal/handshaker/S2AStub.java index fe2ec388fe4..37236f26f4b 100644 --- a/s2a/src/main/java/io/grpc/s2a/internal/handshaker/S2AStub.java +++ b/s2a/src/main/java/io/grpc/s2a/internal/handshaker/S2AStub.java @@ -43,6 +43,7 @@ public class S2AStub implements AutoCloseable { private final BlockingQueue responses = new ArrayBlockingQueue<>(10); private S2AServiceGrpc.S2AServiceStub serviceStub; private StreamObserver writer; + private long deadlineSeconds = HANDSHAKE_RPC_DEADLINE_SECS; private boolean doneReading = false; private boolean doneWriting = false; private boolean isClosed = false; @@ -53,6 +54,14 @@ public static S2AStub newInstance(S2AServiceGrpc.S2AServiceStub serviceStub) { return new S2AStub(serviceStub); } + @VisibleForTesting + static S2AStub newInstanceWithDeadline( + S2AServiceGrpc.S2AServiceStub serviceStub, long deadlineSeconds) { + checkNotNull(serviceStub); + checkArgument(deadlineSeconds > 0); + return new S2AStub(serviceStub, deadlineSeconds); + } + @VisibleForTesting static S2AStub newInstanceForTesting(StreamObserver writer) { checkNotNull(writer); @@ -63,6 +72,11 @@ private S2AStub(S2AServiceGrpc.S2AServiceStub serviceStub) { this.serviceStub = serviceStub; } + private S2AStub(S2AServiceGrpc.S2AServiceStub serviceStub, long deadlineSeconds) { + this.serviceStub = serviceStub; + this.deadlineSeconds = deadlineSeconds; + } + private S2AStub(StreamObserver writer) { this.writer = writer; } @@ -154,7 +168,7 @@ private void createWriterIfNull() { writer = serviceStub .withWaitForReady() - .withDeadlineAfter(HANDSHAKE_RPC_DEADLINE_SECS, SECONDS) + .withDeadlineAfter(deadlineSeconds, SECONDS) .setUpSession(reader); } } diff --git a/s2a/src/test/java/io/grpc/s2a/internal/handshaker/S2AStubTest.java b/s2a/src/test/java/io/grpc/s2a/internal/handshaker/S2AStubTest.java index 713984c361d..2c7a7dd8405 100644 --- a/s2a/src/test/java/io/grpc/s2a/internal/handshaker/S2AStubTest.java +++ b/s2a/src/test/java/io/grpc/s2a/internal/handshaker/S2AStubTest.java @@ -61,17 +61,17 @@ public void setUp() { @Test public void send_receiveOkStatus() throws Exception { - ObjectPool channelPool = - SharedResourcePool.forResource( - S2AHandshakerServiceChannel.getChannelResource( - S2A_ADDRESS, InsecureChannelCredentials.create())); - S2AServiceGrpc.S2AServiceStub serviceStub = S2AServiceGrpc.newStub(channelPool.getObject()); - S2AStub newStub = S2AStub.newInstance(serviceStub); + SessionReq req = + SessionReq.newBuilder() + .setGetTlsConfigurationReq( + GetTlsConfigurationReq.newBuilder() + .setConnectionSide(ConnectionSide.CONNECTION_SIDE_CLIENT)) + .build(); - IOException expected = - assertThrows(IOException.class, () -> newStub.send(SessionReq.getDefaultInstance())); + SessionResp resp = stub.send(req); - assertThat(expected).hasMessageThat().contains("DEADLINE_EXCEEDED"); + assertThat(resp.hasGetTlsConfigurationResp()).isTrue(); + assertThat(resp.getGetTlsConfigurationResp().hasClientTlsConfiguration()).isTrue(); } @Test @@ -233,6 +233,21 @@ public void send_afterEarlyClose_receivesClosedException() throws InterruptedExc assertThat(expected).hasMessageThat().contains("Stream to the S2A is closed."); } + @Test + public void send_withUnavailableService_throwsDeadlineExceeded() throws Exception { + ObjectPool channelPool = + SharedResourcePool.forResource( + S2AHandshakerServiceChannel.getChannelResource( + S2A_ADDRESS, InsecureChannelCredentials.create())); + S2AServiceGrpc.S2AServiceStub serviceStub = S2AServiceGrpc.newStub(channelPool.getObject()); + S2AStub newStub = S2AStub.newInstanceWithDeadline(serviceStub, 1); + + IOException expected = + assertThrows(IOException.class, () -> newStub.send(SessionReq.getDefaultInstance())); + + assertThat(expected).hasMessageThat().contains("DEADLINE_EXCEEDED"); + } + @Test public void send_failToWrite() throws Exception { FailWriter failWriter = new FailWriter();