Merge branch '2.2.x'

Closes gh-19418
This commit is contained in:
Andy Wilkinson 2019-12-20 15:28:40 +00:00
commit 07857f7f24
3 changed files with 49 additions and 18 deletions

View File

@ -328,7 +328,7 @@ class TomcatServletWebServerFactoryTests extends AbstractServletWebServerFactory
}
@Test
void startupFailureDoesNotResultInUnstoppedThreadsBeingReported(CapturedOutput output) throws IOException {
void startupFailureDoesNotResultInUnstoppedThreadsBeingReported(CapturedOutput output) throws Exception {
super.portClashOfPrimaryConnectorResultsInPortInUseException();
assertThat(output).doesNotContain("appears to have started a thread named [main]");
}

View File

@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.time.Duration;
import java.util.Arrays;
import java.util.concurrent.Callable;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLException;
@ -87,12 +88,15 @@ public abstract class AbstractReactiveWebServerFactoryTests {
protected abstract AbstractReactiveWebServerFactory getFactory();
@Test
void specificPort() {
void specificPort() throws Exception {
AbstractReactiveWebServerFactory factory = getFactory();
int specificPort = SocketUtils.findAvailableTcpPort(41000);
factory.setPort(specificPort);
this.webServer = factory.getWebServer(new EchoHandler());
this.webServer.start();
int specificPort = doWithRetry(() -> {
int port = SocketUtils.findAvailableTcpPort(41000);
factory.setPort(port);
this.webServer = factory.getWebServer(new EchoHandler());
this.webServer.start();
return port;
});
Mono<String> result = getWebClient().build().post().uri("/test").contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromValue("Hello World")).exchange()
.flatMap((response) -> response.bodyToMono(String.class));
@ -108,6 +112,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
@Test
void basicSslFromFileSystem() {
testBasicSslWithKeyStore("src/test/resources/test.jks", "password");
}
protected final void testBasicSslWithKeyStore(String keyStore, String keyPassword) {
@ -329,6 +334,19 @@ public abstract class AbstractReactiveWebServerFactoryTests {
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 {
public EchoHandler() {

View File

@ -44,6 +44,7 @@ import java.util.EnumSet;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.zip.GZIPInputStream;
@ -246,10 +247,13 @@ public abstract class AbstractServletWebServerFactoryTests {
@Test
void specificPort() throws Exception {
AbstractServletWebServerFactory factory = getFactory();
int specificPort = SocketUtils.findAvailableTcpPort(41000);
factory.setPort(specificPort);
this.webServer = factory.getWebServer(exampleServletRegistration());
this.webServer.start();
int specificPort = doWithRetry(() -> {
int port = SocketUtils.findAvailableTcpPort(41000);
factory.setPort(port);
this.webServer = factory.getWebServer(exampleServletRegistration());
this.webServer.start();
return port;
});
assertThat(getResponse("http://localhost:" + specificPort + "/hello")).isEqualTo("Hello World");
assertThat(this.webServer.getPort()).isEqualTo(specificPort);
}
@ -823,7 +827,7 @@ public abstract class AbstractServletWebServerFactoryTests {
}
@Test
protected void portClashOfPrimaryConnectorResultsInPortInUseException() throws IOException {
protected void portClashOfPrimaryConnectorResultsInPortInUseException() throws Exception {
doWithBlockedPort((port) -> {
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
AbstractServletWebServerFactory factory = getFactory();
@ -835,7 +839,7 @@ public abstract class AbstractServletWebServerFactoryTests {
}
@Test
void portClashOfSecondaryConnectorResultsInPortInUseException() throws IOException {
void portClashOfSecondaryConnectorResultsInPortInUseException() throws Exception {
doWithBlockedPort((port) -> {
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
AbstractServletWebServerFactory factory = getFactory();
@ -1131,19 +1135,28 @@ public abstract class AbstractServletWebServerFactoryTests {
return bean;
}
protected final void doWithBlockedPort(BlockedPortAction action) throws IOException {
int port = SocketUtils.findAvailableTcpPort(40000);
ServerSocket serverSocket = new ServerSocket();
private <T> T doWithRetry(Callable<T> action) throws Exception {
Exception lastFailure = null;
for (int i = 0; i < 10; i++) {
try {
serverSocket.bind(new InetSocketAddress(port));
break;
return action.call();
}
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 {
action.run(port);
action.run(blockedPort);
}
finally {
serverSocket.close();