Files
spring-boot-rest/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java

89 lines
3.0 KiB
Java

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);
}
}