From 8018da1a42240061bfa273a074736effbf3207ae Mon Sep 17 00:00:00 2001 From: jrhee17 Date: Sat, 6 Nov 2021 17:29:17 +0900 Subject: [PATCH] add a failing test --- .../client/ClientMaxConnectionAgeTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/core/src/test/java/com/linecorp/armeria/client/ClientMaxConnectionAgeTest.java b/core/src/test/java/com/linecorp/armeria/client/ClientMaxConnectionAgeTest.java index 3fe5232009f..df67e9a5a5f 100644 --- a/core/src/test/java/com/linecorp/armeria/client/ClientMaxConnectionAgeTest.java +++ b/core/src/test/java/com/linecorp/armeria/client/ClientMaxConnectionAgeTest.java @@ -18,10 +18,12 @@ import static com.linecorp.armeria.common.HttpStatus.OK; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Awaitility.await; import java.net.InetSocketAddress; import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.concurrent.atomic.AtomicInteger; import org.hamcrest.Matchers; @@ -35,6 +37,8 @@ import com.linecorp.armeria.common.SessionProtocol; import com.linecorp.armeria.common.metric.MoreMeters; import com.linecorp.armeria.server.ServerBuilder; +import com.linecorp.armeria.server.annotation.Get; +import com.linecorp.armeria.server.annotation.Param; import com.linecorp.armeria.testing.junit5.server.ServerExtension; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; @@ -54,6 +58,14 @@ protected void configure(ServerBuilder sb) { sb.idleTimeoutMillis(0); sb.requestTimeoutMillis(0); sb.service("/", (ctx, req) -> HttpResponse.of(OK)); + sb.annotatedService("/delayed", new Object() { + + @Get + public HttpResponse delayed(@Param("seconds") String seconds) { + return HttpResponse.delayed( + HttpResponse.of(200), Duration.of(Long.valueOf(seconds), ChronoUnit.SECONDS)); + } + }); } @Override @@ -160,4 +172,48 @@ void shouldCloseIdleConnectionByMaxConnectionAge(SessionProtocol protocol) { await().untilAtomic(closed, Matchers.is(1)); } } + + @EnumSource(value = SessionProtocol.class, names = "PROXY", mode = Mode.EXCLUDE) + @ParameterizedTest + void shouldCloseLongRequestsByMaxConnectionAge(SessionProtocol protocol) throws Exception { + try (ClientFactory factory = ClientFactory.builder() + .connectionPoolListener(connectionPoolListener) + .idleTimeoutMillis(0) + .maxConnectionAgeMillis(MAX_CONNECTION_AGE) + .tlsNoVerify() + .build()) { + final WebClient client = WebClient.builder(server.uri(protocol)) + .factory(factory) + .responseTimeoutMillis(0) + .build(); + + assertThat(client.get("/delayed?seconds=4").aggregate().join().status()).isEqualTo(OK); + + await().untilAtomic(opened, Matchers.is(1)); + await().untilAtomic(closed, Matchers.is(1)); + } + } + + @EnumSource(value = SessionProtocol.class, names = "PROXY", mode = Mode.EXCLUDE) + @ParameterizedTest + void shouldCloseTimeoutLongRequestsByMaxConnectionAge(SessionProtocol protocol) throws Exception { + try (ClientFactory factory = ClientFactory.builder() + .connectionPoolListener(connectionPoolListener) + .idleTimeoutMillis(0) + .maxConnectionAgeMillis(MAX_CONNECTION_AGE) + .tlsNoVerify() + .build()) { + final long responseTimeoutMillis = MAX_CONNECTION_AGE + 1000; + final WebClient client = WebClient.builder(server.uri(protocol)) + .factory(factory) + .responseTimeoutMillis(responseTimeoutMillis) + .build(); + + assertThatThrownBy(() -> client.get("/delayed?seconds=10").aggregate().join().status()) + .hasRootCauseInstanceOf(ResponseTimeoutException.class); + + await().untilAtomic(opened, Matchers.is(1)); + await().untilAtomic(closed, Matchers.is(1)); + } + } }