From f7a449978ca66a52a5a67289843aa2ba4aedde5c Mon Sep 17 00:00:00 2001 From: mthomas Date: Thu, 5 Mar 2020 02:04:22 -0600 Subject: [PATCH 1/3] BAEL-2552 - Add controller and unit test showing how to set timeouts --- .../serverconfig/TimeoutController.java | 23 +++++ .../spring/serverconfig/TimeoutLiveTest.java | 88 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java create mode 100644 spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java b/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java new file mode 100644 index 0000000000..a4cd6bd6ba --- /dev/null +++ b/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java @@ -0,0 +1,23 @@ +package com.baeldung.spring.serverconfig; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/timeout") +public class TimeoutController { + + @GetMapping("/{timeout}") + private Mono timeout(@PathVariable int timeout) { + try { + Thread.sleep(timeout * 1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + return Mono.just("OK"); + } +} diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java new file mode 100644 index 0000000000..09d8032d41 --- /dev/null +++ b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java @@ -0,0 +1,88 @@ +package com.baeldung.spring.serverconfig; + +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.SSLException; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +import io.netty.channel.ChannelOption; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.handler.timeout.ReadTimeoutException; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; +import reactor.netty.http.client.HttpClient; +import reactor.netty.tcp.TcpClient; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@DirtiesContext +public class TimeoutLiveTest { + + private static final String BASE_URL = "https://localhost:8443"; + private static final int TIMEOUT_MILLIS = 2000; + + private WebTestClient webTestClient; + + @Before + public void setup() throws SSLException { + webTestClient = WebTestClient.bindToServer(getConnector()) + .baseUrl(BASE_URL) + .build(); + } + + @Test + public void shouldTimeout() { + try { + webTestClient.get() + .uri("/timeout/{timeout}", 3) + .exchange(); + Assert.fail(); + } catch (ReadTimeoutException ignore) { + } + } + + @Test + public void shouldNotTimeout() { + try { + WebTestClient.ResponseSpec response = webTestClient.get() + .uri("/timeout/{timeout}", 1) + .exchange(); + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("OK"); + } catch (ReadTimeoutException e) { + Assert.fail(); + } + } + + private ReactorClientHttpConnector getConnector() throws SSLException { + SslContext sslContext = SslContextBuilder + .forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE) + .build(); + + TcpClient tcpClient = TcpClient + .create() + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT_MILLIS) + .doOnConnected(connection -> { + connection.addHandlerLast(new ReadTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)); + connection.addHandlerLast(new WriteTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)); + }); + + HttpClient httpClient = HttpClient.from(tcpClient).secure(t -> t.sslContext(sslContext)); + return new ReactorClientHttpConnector(httpClient); + } +} From f37bb67f4c16635d2c50e21e89df76f0172e27c9 Mon Sep 17 00:00:00 2001 From: mthomas Date: Thu, 5 Mar 2020 11:47:04 -0600 Subject: [PATCH 2/3] BAEL-2552 - use JUnit @Rule --- .../spring/serverconfig/TimeoutLiveTest.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java index 09d8032d41..78e61dce5f 100644 --- a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java +++ b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java @@ -6,7 +6,9 @@ import javax.net.ssl.SSLException; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @@ -35,6 +37,9 @@ public class TimeoutLiveTest { private WebTestClient webTestClient; + @Rule + public ExpectedException exception = ExpectedException.none(); + @Before public void setup() throws SSLException { webTestClient = WebTestClient.bindToServer(getConnector()) @@ -44,28 +49,22 @@ public class TimeoutLiveTest { @Test public void shouldTimeout() { - try { - webTestClient.get() - .uri("/timeout/{timeout}", 3) - .exchange(); - Assert.fail(); - } catch (ReadTimeoutException ignore) { - } + exception.expect(ReadTimeoutException.class); + webTestClient.get() + .uri("/timeout/{timeout}", 3) + .exchange(); + Assert.fail(); } @Test public void shouldNotTimeout() { - try { - WebTestClient.ResponseSpec response = webTestClient.get() - .uri("/timeout/{timeout}", 1) - .exchange(); - response.expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo("OK"); - } catch (ReadTimeoutException e) { - Assert.fail(); - } + WebTestClient.ResponseSpec response = webTestClient.get() + .uri("/timeout/{timeout}", 1) + .exchange(); + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("OK"); } private ReactorClientHttpConnector getConnector() throws SSLException { From 50ea6a8d9add511ec0e03ab21b0ba2b0e3c21297 Mon Sep 17 00:00:00 2001 From: mthomas Date: Thu, 5 Mar 2020 12:13:08 -0600 Subject: [PATCH 3/3] BAEL-2552 - Remove unnecessary line --- .../java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java index 78e61dce5f..c53fd4fa80 100644 --- a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java +++ b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java @@ -4,7 +4,6 @@ import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLException; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -53,7 +52,6 @@ public class TimeoutLiveTest { webTestClient.get() .uri("/timeout/{timeout}", 3) .exchange(); - Assert.fail(); } @Test