commit
8ed0b1a231
|
@ -328,7 +328,7 @@ class TomcatServletWebServerFactoryTests extends AbstractServletWebServerFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void startupFailureDoesNotResultInUnstoppedThreadsBeingReported(CapturedOutput output) throws IOException {
|
void startupFailureDoesNotResultInUnstoppedThreadsBeingReported(CapturedOutput output) throws Exception {
|
||||||
super.portClashOfPrimaryConnectorResultsInPortInUseException();
|
super.portClashOfPrimaryConnectorResultsInPortInUseException();
|
||||||
assertThat(output).doesNotContain("appears to have started a thread named [main]");
|
assertThat(output).doesNotContain("appears to have started a thread named [main]");
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
|
||||||
import java.security.KeyStore;
|
import java.security.KeyStore;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import javax.net.ssl.KeyManagerFactory;
|
import javax.net.ssl.KeyManagerFactory;
|
||||||
import javax.net.ssl.SSLException;
|
import javax.net.ssl.SSLException;
|
||||||
|
@ -87,12 +88,15 @@ public abstract class AbstractReactiveWebServerFactoryTests {
|
||||||
protected abstract AbstractReactiveWebServerFactory getFactory();
|
protected abstract AbstractReactiveWebServerFactory getFactory();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void specificPort() {
|
void specificPort() throws Exception {
|
||||||
AbstractReactiveWebServerFactory factory = getFactory();
|
AbstractReactiveWebServerFactory factory = getFactory();
|
||||||
int specificPort = SocketUtils.findAvailableTcpPort(41000);
|
int specificPort = doWithRetry(() -> {
|
||||||
factory.setPort(specificPort);
|
int port = SocketUtils.findAvailableTcpPort(41000);
|
||||||
this.webServer = factory.getWebServer(new EchoHandler());
|
factory.setPort(port);
|
||||||
this.webServer.start();
|
this.webServer = factory.getWebServer(new EchoHandler());
|
||||||
|
this.webServer.start();
|
||||||
|
return port;
|
||||||
|
});
|
||||||
Mono<String> result = getWebClient().build().post().uri("/test").contentType(MediaType.TEXT_PLAIN)
|
Mono<String> result = getWebClient().build().post().uri("/test").contentType(MediaType.TEXT_PLAIN)
|
||||||
.body(BodyInserters.fromValue("Hello World")).exchange()
|
.body(BodyInserters.fromValue("Hello World")).exchange()
|
||||||
.flatMap((response) -> response.bodyToMono(String.class));
|
.flatMap((response) -> response.bodyToMono(String.class));
|
||||||
|
@ -108,6 +112,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
|
||||||
@Test
|
@Test
|
||||||
void basicSslFromFileSystem() {
|
void basicSslFromFileSystem() {
|
||||||
testBasicSslWithKeyStore("src/test/resources/test.jks", "password");
|
testBasicSslWithKeyStore("src/test/resources/test.jks", "password");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void testBasicSslWithKeyStore(String keyStore, String keyPassword) {
|
protected final void testBasicSslWithKeyStore(String keyStore, String keyPassword) {
|
||||||
|
@ -329,6 +334,19 @@ public abstract class AbstractReactiveWebServerFactoryTests {
|
||||||
assertThat(body).isEqualTo("https");
|
assertThat(body).isEqualTo("https");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private <T> T doWithRetry(Callable<T> action) throws Exception {
|
||||||
|
Exception lastFailure = null;
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
try {
|
||||||
|
return action.call();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
lastFailure = ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Action was not successful in 10 attempts", lastFailure);
|
||||||
|
}
|
||||||
|
|
||||||
protected static class EchoHandler implements HttpHandler {
|
protected static class EchoHandler implements HttpHandler {
|
||||||
|
|
||||||
public EchoHandler() {
|
public EchoHandler() {
|
||||||
|
|
|
@ -44,6 +44,7 @@ import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
@ -246,10 +247,13 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||||
@Test
|
@Test
|
||||||
void specificPort() throws Exception {
|
void specificPort() throws Exception {
|
||||||
AbstractServletWebServerFactory factory = getFactory();
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
int specificPort = SocketUtils.findAvailableTcpPort(41000);
|
int specificPort = doWithRetry(() -> {
|
||||||
factory.setPort(specificPort);
|
int port = SocketUtils.findAvailableTcpPort(41000);
|
||||||
this.webServer = factory.getWebServer(exampleServletRegistration());
|
factory.setPort(port);
|
||||||
this.webServer.start();
|
this.webServer = factory.getWebServer(exampleServletRegistration());
|
||||||
|
this.webServer.start();
|
||||||
|
return port;
|
||||||
|
});
|
||||||
assertThat(getResponse("http://localhost:" + specificPort + "/hello")).isEqualTo("Hello World");
|
assertThat(getResponse("http://localhost:" + specificPort + "/hello")).isEqualTo("Hello World");
|
||||||
assertThat(this.webServer.getPort()).isEqualTo(specificPort);
|
assertThat(this.webServer.getPort()).isEqualTo(specificPort);
|
||||||
}
|
}
|
||||||
|
@ -823,7 +827,7 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
protected void portClashOfPrimaryConnectorResultsInPortInUseException() throws IOException {
|
protected void portClashOfPrimaryConnectorResultsInPortInUseException() throws Exception {
|
||||||
doWithBlockedPort((port) -> {
|
doWithBlockedPort((port) -> {
|
||||||
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
|
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
|
||||||
AbstractServletWebServerFactory factory = getFactory();
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
|
@ -835,7 +839,7 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void portClashOfSecondaryConnectorResultsInPortInUseException() throws IOException {
|
void portClashOfSecondaryConnectorResultsInPortInUseException() throws Exception {
|
||||||
doWithBlockedPort((port) -> {
|
doWithBlockedPort((port) -> {
|
||||||
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
|
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
|
||||||
AbstractServletWebServerFactory factory = getFactory();
|
AbstractServletWebServerFactory factory = getFactory();
|
||||||
|
@ -1131,19 +1135,28 @@ public abstract class AbstractServletWebServerFactoryTests {
|
||||||
return bean;
|
return bean;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void doWithBlockedPort(BlockedPortAction action) throws IOException {
|
private <T> T doWithRetry(Callable<T> action) throws Exception {
|
||||||
int port = SocketUtils.findAvailableTcpPort(40000);
|
Exception lastFailure = null;
|
||||||
ServerSocket serverSocket = new ServerSocket();
|
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
try {
|
try {
|
||||||
serverSocket.bind(new InetSocketAddress(port));
|
return action.call();
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
|
lastFailure = ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
throw new IllegalStateException("Action was not successful in 10 attempts", lastFailure);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void doWithBlockedPort(BlockedPortAction action) throws Exception {
|
||||||
|
ServerSocket serverSocket = new ServerSocket();
|
||||||
|
int blockedPort = doWithRetry(() -> {
|
||||||
|
int port = SocketUtils.findAvailableTcpPort(40000);
|
||||||
|
serverSocket.bind(new InetSocketAddress(port));
|
||||||
|
return port;
|
||||||
|
});
|
||||||
try {
|
try {
|
||||||
action.run(port);
|
action.run(blockedPort);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
serverSocket.close();
|
serverSocket.close();
|
||||||
|
|
Loading…
Reference in New Issue