Avoid blocking on a Mono indefinitely

Closes gh-15535
pull/16246/head
Andy Wilkinson 6 years ago
parent 6403ec6e1b
commit 0741c90489

@ -16,6 +16,8 @@
package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive; package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive;
import java.time.Duration;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
@ -63,7 +65,8 @@ public class CloudFoundryReactiveHealthEndpointWebExtensionTests {
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
CloudFoundryReactiveHealthEndpointWebExtension extension = context CloudFoundryReactiveHealthEndpointWebExtension extension = context
.getBean(CloudFoundryReactiveHealthEndpointWebExtension.class); .getBean(CloudFoundryReactiveHealthEndpointWebExtension.class);
assertThat(extension.health().block().getBody().getDetails()).isNotEmpty(); assertThat(extension.health().block(Duration.ofSeconds(30)).getBody()
.getDetails()).isNotEmpty();
}); });
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive; package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive;
import java.time.Duration;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -201,16 +202,17 @@ public class ReactiveCloudFoundryActuatorAutoConfigurationTests {
Boolean cfRequestMatches = filters.get(0) Boolean cfRequestMatches = filters.get(0)
.matches(MockServerWebExchange.from(MockServerHttpRequest .matches(MockServerWebExchange.from(MockServerHttpRequest
.get("/cloudfoundryapplication/my-path").build())) .get("/cloudfoundryapplication/my-path").build()))
.block(); .block(Duration.ofSeconds(30));
Boolean otherRequestMatches = filters.get(0) Boolean otherRequestMatches = filters.get(0)
.matches(MockServerWebExchange.from(MockServerHttpRequest .matches(MockServerWebExchange.from(MockServerHttpRequest
.get("/some-other-path").build())) .get("/some-other-path").build()))
.block(); .block(Duration.ofSeconds(30));
assertThat(cfRequestMatches).isTrue(); assertThat(cfRequestMatches).isTrue();
assertThat(otherRequestMatches).isFalse(); assertThat(otherRequestMatches).isFalse();
otherRequestMatches = filters.get(1).matches(MockServerWebExchange otherRequestMatches = filters.get(1)
.from(MockServerHttpRequest.get("/some-other-path").build())) .matches(MockServerWebExchange.from(MockServerHttpRequest
.block(); .get("/some-other-path").build()))
.block(Duration.ofSeconds(30));
assertThat(otherRequestMatches).isTrue(); assertThat(otherRequestMatches).isTrue();
}); });
@ -314,7 +316,7 @@ public class ReactiveCloudFoundryActuatorAutoConfigurationTests {
WebClient webClient = (WebClient) ReflectionTestUtils WebClient webClient = (WebClient) ReflectionTestUtils
.getField(interceptorSecurityService, "webClient"); .getField(interceptorSecurityService, "webClient");
webClient.get().uri("https://self-signed.badssl.com/").exchange() webClient.get().uri("https://self-signed.badssl.com/").exchange()
.block(); .block(Duration.ofSeconds(30));
}); });
} }
@ -337,7 +339,7 @@ public class ReactiveCloudFoundryActuatorAutoConfigurationTests {
.getField(interceptorSecurityService, "webClient"); .getField(interceptorSecurityService, "webClient");
this.thrown.expectCause(instanceOf(SSLException.class)); this.thrown.expectCause(instanceOf(SSLException.class));
webClient.get().uri("https://self-signed.badssl.com/").exchange() webClient.get().uri("https://self-signed.badssl.com/").exchange()
.block(); .block(Duration.ofSeconds(30));
}); });
} }

@ -17,6 +17,7 @@
package org.springframework.boot.actuate.autoconfigure.health; package org.springframework.boot.actuate.autoconfigure.health;
import java.security.Principal; import java.security.Principal;
import java.time.Duration;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -97,8 +98,8 @@ public class ReactiveHealthEndpointWebExtensionTests {
SecurityContext securityContext = mock(SecurityContext.class); SecurityContext securityContext = mock(SecurityContext.class);
given(securityContext.getPrincipal()) given(securityContext.getPrincipal())
.willReturn(mock(Principal.class)); .willReturn(mock(Principal.class));
Health extensionHealth = extension.health(securityContext).block() Health extensionHealth = extension.health(securityContext)
.getBody(); .block(Duration.ofSeconds(30)).getBody();
assertThat(endpointHealth.getDetails()) assertThat(endpointHealth.getDetails())
.containsOnlyKeys("application", "first", "second"); .containsOnlyKeys("application", "first", "second");
assertThat(extensionHealth.getDetails()) assertThat(extensionHealth.getDetails())
@ -111,8 +112,8 @@ public class ReactiveHealthEndpointWebExtensionTests {
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
ReactiveHealthEndpointWebExtension extension = context ReactiveHealthEndpointWebExtension extension = context
.getBean(ReactiveHealthEndpointWebExtension.class); .getBean(ReactiveHealthEndpointWebExtension.class);
assertThat(extension.health(mock(SecurityContext.class)).block().getBody() assertThat(extension.health(mock(SecurityContext.class))
.getDetails()).isEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails()).isEmpty();
}); });
} }
@ -123,8 +124,8 @@ public class ReactiveHealthEndpointWebExtensionTests {
.getBean(ReactiveHealthEndpointWebExtension.class); .getBean(ReactiveHealthEndpointWebExtension.class);
SecurityContext securityContext = mock(SecurityContext.class); SecurityContext securityContext = mock(SecurityContext.class);
given(securityContext.getPrincipal()).willReturn(mock(Principal.class)); given(securityContext.getPrincipal()).willReturn(mock(Principal.class));
assertThat(extension.health(securityContext).block().getBody().getDetails()) assertThat(extension.health(securityContext).block(Duration.ofSeconds(30))
.isEmpty(); .getBody().getDetails()).isEmpty();
}); });
} }
@ -139,8 +140,9 @@ public class ReactiveHealthEndpointWebExtensionTests {
SecurityContext securityContext = mock(SecurityContext.class); SecurityContext securityContext = mock(SecurityContext.class);
given(securityContext.getPrincipal()) given(securityContext.getPrincipal())
.willReturn(mock(Principal.class)); .willReturn(mock(Principal.class));
assertThat(extension.health(securityContext).block().getBody() assertThat(extension.health(securityContext)
.getDetails()).isNotEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails())
.isNotEmpty();
}); });
} }
@ -151,8 +153,8 @@ public class ReactiveHealthEndpointWebExtensionTests {
.run((context) -> { .run((context) -> {
ReactiveHealthEndpointWebExtension extension = context ReactiveHealthEndpointWebExtension extension = context
.getBean(ReactiveHealthEndpointWebExtension.class); .getBean(ReactiveHealthEndpointWebExtension.class);
assertThat(extension.health(null).block().getBody().getDetails()) assertThat(extension.health(null).block(Duration.ofSeconds(30))
.isNotEmpty(); .getBody().getDetails()).isNotEmpty();
}); });
} }
@ -164,8 +166,9 @@ public class ReactiveHealthEndpointWebExtensionTests {
ReactiveHealthEndpointWebExtension extension = context ReactiveHealthEndpointWebExtension extension = context
.getBean(ReactiveHealthEndpointWebExtension.class); .getBean(ReactiveHealthEndpointWebExtension.class);
SecurityContext securityContext = mock(SecurityContext.class); SecurityContext securityContext = mock(SecurityContext.class);
assertThat(extension.health(securityContext).block().getBody() assertThat(extension.health(securityContext)
.getDetails()).isEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails())
.isEmpty();
}); });
} }
@ -180,8 +183,9 @@ public class ReactiveHealthEndpointWebExtensionTests {
given(securityContext.getPrincipal()) given(securityContext.getPrincipal())
.willReturn(mock(Principal.class)); .willReturn(mock(Principal.class));
given(securityContext.isUserInRole("ACTUATOR")).willReturn(false); given(securityContext.isUserInRole("ACTUATOR")).willReturn(false);
assertThat(extension.health(securityContext).block().getBody() assertThat(extension.health(securityContext)
.getDetails()).isEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails())
.isEmpty();
}); });
} }
@ -196,8 +200,9 @@ public class ReactiveHealthEndpointWebExtensionTests {
given(securityContext.getPrincipal()) given(securityContext.getPrincipal())
.willReturn(mock(Principal.class)); .willReturn(mock(Principal.class));
given(securityContext.isUserInRole("ACTUATOR")).willReturn(true); given(securityContext.isUserInRole("ACTUATOR")).willReturn(true);
assertThat(extension.health(securityContext).block().getBody() assertThat(extension.health(securityContext)
.getDetails()).isNotEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails())
.isNotEmpty();
}); });
} }
@ -212,8 +217,9 @@ public class ReactiveHealthEndpointWebExtensionTests {
given(securityContext.getPrincipal()) given(securityContext.getPrincipal())
.willReturn(mock(Principal.class)); .willReturn(mock(Principal.class));
given(securityContext.isUserInRole("ADMIN")).willReturn(true); given(securityContext.isUserInRole("ADMIN")).willReturn(true);
assertThat(extension.health(securityContext).block().getBody() assertThat(extension.health(securityContext)
.getDetails()).isNotEmpty(); .block(Duration.ofSeconds(30)).getBody().getDetails())
.isNotEmpty();
}); });
} }

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.autoconfigure.security.reactive; package org.springframework.boot.actuate.autoconfigure.security.reactive;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -250,8 +251,8 @@ public class EndpointRequestTests {
} }
private void matches(ServerWebExchange exchange) { private void matches(ServerWebExchange exchange) {
assertThat(this.matcher.matches(exchange).block().isMatch()) assertThat(this.matcher.matches(exchange).block(Duration.ofSeconds(30))
.as("Matches " + getRequestPath(exchange)).isTrue(); .isMatch()).as("Matches " + getRequestPath(exchange)).isTrue();
} }
void doesNotMatch(String path) { void doesNotMatch(String path) {
@ -262,8 +263,9 @@ public class EndpointRequestTests {
} }
private void doesNotMatch(ServerWebExchange exchange) { private void doesNotMatch(ServerWebExchange exchange) {
assertThat(this.matcher.matches(exchange).block().isMatch()) assertThat(this.matcher.matches(exchange).block(Duration.ofSeconds(30))
.as("Does not match " + getRequestPath(exchange)).isFalse(); .isMatch()).as("Does not match " + getRequestPath(exchange))
.isFalse();
} }
private TestHttpWebHandlerAdapter webHandler() { private TestHttpWebHandlerAdapter webHandler() {

@ -16,6 +16,7 @@
package org.springframework.boot.actuate.endpoint.web.reactive; package org.springframework.boot.actuate.endpoint.web.reactive;
import java.time.Duration;
import java.util.Arrays; import java.util.Arrays;
import org.junit.Rule; import org.junit.Rule;
@ -99,7 +100,8 @@ public class ControllerEndpointHandlerMappingTests {
private Object getHandler(ControllerEndpointHandlerMapping mapping, HttpMethod method, private Object getHandler(ControllerEndpointHandlerMapping mapping, HttpMethod method,
String requestURI) { String requestURI) {
return mapping.getHandler(exchange(method, requestURI)).block(); return mapping.getHandler(exchange(method, requestURI))
.block(Duration.ofSeconds(30));
} }
private ControllerEndpointHandlerMapping createMapping(String prefix, private ControllerEndpointHandlerMapping createMapping(String prefix,

@ -16,6 +16,8 @@
package org.springframework.boot.actuate.metrics.web.reactive.server; package org.springframework.boot.actuate.metrics.web.reactive.server;
import java.time.Duration;
import io.micrometer.core.instrument.MockClock; import io.micrometer.core.instrument.MockClock;
import io.micrometer.core.instrument.simple.SimpleConfig; import io.micrometer.core.instrument.simple.SimpleConfig;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
@ -58,7 +60,7 @@ public class MetricsWebFilterTests {
this.webFilter this.webFilter
.filter(exchange, .filter(exchange,
(serverWebExchange) -> exchange.getResponse().setComplete()) (serverWebExchange) -> exchange.getResponse().setComplete())
.block(); .block(Duration.ofSeconds(30));
assertMetricsContainsTag("uri", "/projects/{project}"); assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "200"); assertMetricsContainsTag("status", "200");
} }
@ -74,7 +76,7 @@ public class MetricsWebFilterTests {
.onErrorResume((t) -> { .onErrorResume((t) -> {
exchange.getResponse().setStatusCodeValue(500); exchange.getResponse().setStatusCodeValue(500);
return exchange.getResponse().setComplete(); return exchange.getResponse().setComplete();
}).block(); }).block(Duration.ofSeconds(30));
assertMetricsContainsTag("uri", "/projects/{project}"); assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "500"); assertMetricsContainsTag("status", "500");
assertMetricsContainsTag("exception", "IllegalStateException"); assertMetricsContainsTag("exception", "IllegalStateException");
@ -91,7 +93,7 @@ public class MetricsWebFilterTests {
.onErrorResume((t) -> { .onErrorResume((t) -> {
exchange.getResponse().setStatusCodeValue(500); exchange.getResponse().setStatusCodeValue(500);
return exchange.getResponse().setComplete(); return exchange.getResponse().setComplete();
}).block(); }).block(Duration.ofSeconds(30));
assertMetricsContainsTag("uri", "/projects/{project}"); assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "500"); assertMetricsContainsTag("status", "500");
assertMetricsContainsTag("exception", anonymous.getClass().getName()); assertMetricsContainsTag("exception", anonymous.getClass().getName());
@ -105,7 +107,7 @@ public class MetricsWebFilterTests {
exchange.getResponse().setStatusCodeValue(500); exchange.getResponse().setStatusCodeValue(500);
return exchange.getResponse().setComplete() return exchange.getResponse().setComplete()
.then(Mono.error(new IllegalStateException("test error"))); .then(Mono.error(new IllegalStateException("test error")));
}).onErrorResume((t) -> Mono.empty()).block(); }).onErrorResume((t) -> Mono.empty()).block(Duration.ofSeconds(30));
assertMetricsContainsTag("uri", "/projects/{project}"); assertMetricsContainsTag("uri", "/projects/{project}");
assertMetricsContainsTag("status", "500"); assertMetricsContainsTag("status", "500");
} }

@ -18,6 +18,7 @@ package org.springframework.boot.actuate.trace.http.reactive;
import java.io.IOException; import java.io.IOException;
import java.security.Principal; import java.security.Principal;
import java.time.Duration;
import java.util.EnumSet; import java.util.EnumSet;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -68,7 +69,7 @@ public class HttpTraceWebFilterTests {
return Mono.empty(); return Mono.empty();
} }
}).block(); }).block(Duration.ofSeconds(30));
assertThat(this.repository.findAll()).hasSize(1); assertThat(this.repository.findAll()).hasSize(1);
} }
@ -82,11 +83,12 @@ public class HttpTraceWebFilterTests {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange) { public Mono<Void> filter(ServerWebExchange exchange) {
exchange.getSession().block().getAttributes().put("a", "alpha"); exchange.getSession().block(Duration.ofSeconds(30))
.getAttributes().put("a", "alpha");
return Mono.empty(); return Mono.empty();
} }
}).block(); }).block(Duration.ofSeconds(30));
assertThat(this.repository.findAll()).hasSize(1); assertThat(this.repository.findAll()).hasSize(1);
Session session = this.repository.findAll().get(0).getSession(); Session session = this.repository.findAll().get(0).getSession();
assertThat(session).isNotNull(); assertThat(session).isNotNull();
@ -103,11 +105,11 @@ public class HttpTraceWebFilterTests {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange) { public Mono<Void> filter(ServerWebExchange exchange) {
exchange.getSession().block(); exchange.getSession().block(Duration.ofSeconds(30));
return Mono.empty(); return Mono.empty();
} }
}).block(); }).block(Duration.ofSeconds(30));
assertThat(this.repository.findAll()).hasSize(1); assertThat(this.repository.findAll()).hasSize(1);
Session session = this.repository.findAll().get(0).getSession(); Session session = this.repository.findAll().get(0).getSession();
assertThat(session).isNull(); assertThat(session).isNull();
@ -129,11 +131,12 @@ public class HttpTraceWebFilterTests {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange) { public Mono<Void> filter(ServerWebExchange exchange) {
exchange.getSession().block().getAttributes().put("a", "alpha"); exchange.getSession().block(Duration.ofSeconds(30)).getAttributes()
.put("a", "alpha");
return Mono.empty(); return Mono.empty();
} }
}).block(); }).block(Duration.ofSeconds(30));
assertThat(this.repository.findAll()).hasSize(1); assertThat(this.repository.findAll()).hasSize(1);
org.springframework.boot.actuate.trace.http.HttpTrace.Principal tracedPrincipal = this.repository org.springframework.boot.actuate.trace.http.HttpTrace.Principal tracedPrincipal = this.repository
.findAll().get(0).getPrincipal(); .findAll().get(0).getPrincipal();
@ -155,7 +158,7 @@ public class HttpTraceWebFilterTests {
return Mono.error(new RuntimeException()); return Mono.error(new RuntimeException());
} }
}).block(); }).block(Duration.ofSeconds(30));
fail(); fail();
} }
catch (Exception ex) { catch (Exception ex) {

@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.freemarker; package org.springframework.boot.autoconfigure.freemarker;
import java.io.StringWriter; import java.io.StringWriter;
import java.time.Duration;
import java.util.Locale; import java.util.Locale;
import org.junit.Test; import org.junit.Test;
@ -60,7 +61,8 @@ public class FreeMarkerAutoConfigurationReactiveIntegrationTests {
public void defaultViewResolution() { public void defaultViewResolution() {
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
MockServerWebExchange exchange = render(context, "home"); MockServerWebExchange exchange = render(context, "home");
String result = exchange.getResponse().getBodyAsString().block(); String result = exchange.getResponse().getBodyAsString()
.block(Duration.ofSeconds(30));
assertThat(result).contains("home"); assertThat(result).contains("home");
assertThat(exchange.getResponse().getHeaders().getContentType()) assertThat(exchange.getResponse().getHeaders().getContentType())
.isEqualTo(MediaType.TEXT_HTML); .isEqualTo(MediaType.TEXT_HTML);
@ -72,7 +74,8 @@ public class FreeMarkerAutoConfigurationReactiveIntegrationTests {
this.contextRunner.withPropertyValues("spring.freemarker.prefix:prefix/") this.contextRunner.withPropertyValues("spring.freemarker.prefix:prefix/")
.run((context) -> { .run((context) -> {
MockServerWebExchange exchange = render(context, "prefixed"); MockServerWebExchange exchange = render(context, "prefixed");
String result = exchange.getResponse().getBodyAsString().block(); String result = exchange.getResponse().getBodyAsString()
.block(Duration.ofSeconds(30));
assertThat(result).contains("prefixed"); assertThat(result).contains("prefixed");
}); });
} }
@ -82,7 +85,8 @@ public class FreeMarkerAutoConfigurationReactiveIntegrationTests {
this.contextRunner.withPropertyValues("spring.freemarker.suffix:.freemarker") this.contextRunner.withPropertyValues("spring.freemarker.suffix:.freemarker")
.run((context) -> { .run((context) -> {
MockServerWebExchange exchange = render(context, "suffixed"); MockServerWebExchange exchange = render(context, "suffixed");
String result = exchange.getResponse().getBodyAsString().block(); String result = exchange.getResponse().getBodyAsString()
.block(Duration.ofSeconds(30));
assertThat(result).contains("suffixed"); assertThat(result).contains("suffixed");
}); });
} }
@ -93,7 +97,8 @@ public class FreeMarkerAutoConfigurationReactiveIntegrationTests {
"spring.freemarker.templateLoaderPath:classpath:/custom-templates/") "spring.freemarker.templateLoaderPath:classpath:/custom-templates/")
.run((context) -> { .run((context) -> {
MockServerWebExchange exchange = render(context, "custom"); MockServerWebExchange exchange = render(context, "custom");
String result = exchange.getResponse().getBodyAsString().block(); String result = exchange.getResponse().getBodyAsString()
.block(Duration.ofSeconds(30));
assertThat(result).contains("custom"); assertThat(result).contains("custom");
}); });
} }
@ -128,7 +133,8 @@ public class FreeMarkerAutoConfigurationReactiveIntegrationTests {
Mono<View> view = resolver.resolveViewName(viewName, Locale.UK); Mono<View> view = resolver.resolveViewName(viewName, Locale.UK);
MockServerWebExchange exchange = MockServerWebExchange MockServerWebExchange exchange = MockServerWebExchange
.from(MockServerHttpRequest.get("/path")); .from(MockServerHttpRequest.get("/path"));
view.flatMap((v) -> v.render(null, MediaType.TEXT_HTML, exchange)).block(); view.flatMap((v) -> v.render(null, MediaType.TEXT_HTML, exchange))
.block(Duration.ofSeconds(30));
return exchange; return exchange;
} }

@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.security.reactive; package org.springframework.boot.autoconfigure.security.reactive;
import java.time.Duration;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -55,8 +57,8 @@ public class ReactiveUserDetailsServiceAutoConfigurationTests {
.run((context) -> { .run((context) -> {
ReactiveUserDetailsService userDetailsService = context ReactiveUserDetailsService userDetailsService = context
.getBean(ReactiveUserDetailsService.class); .getBean(ReactiveUserDetailsService.class);
assertThat(userDetailsService.findByUsername("user").block()) assertThat(userDetailsService.findByUsername("user")
.isNotNull(); .block(Duration.ofSeconds(30))).isNotNull();
}); });
} }
@ -67,12 +69,12 @@ public class ReactiveUserDetailsServiceAutoConfigurationTests {
.run((context) -> { .run((context) -> {
ReactiveUserDetailsService userDetailsService = context ReactiveUserDetailsService userDetailsService = context
.getBean(ReactiveUserDetailsService.class); .getBean(ReactiveUserDetailsService.class);
assertThat(userDetailsService.findByUsername("user").block()) assertThat(userDetailsService.findByUsername("user")
.isNull(); .block(Duration.ofSeconds(30))).isNull();
assertThat(userDetailsService.findByUsername("foo").block()) assertThat(userDetailsService.findByUsername("foo")
.isNotNull(); .block(Duration.ofSeconds(30))).isNotNull();
assertThat(userDetailsService.findByUsername("admin").block()) assertThat(userDetailsService.findByUsername("admin")
.isNotNull(); .block(Duration.ofSeconds(30))).isNotNull();
}); });
} }
@ -93,8 +95,8 @@ public class ReactiveUserDetailsServiceAutoConfigurationTests {
.run(((context) -> { .run(((context) -> {
MapReactiveUserDetailsService userDetailsService = context MapReactiveUserDetailsService userDetailsService = context
.getBean(MapReactiveUserDetailsService.class); .getBean(MapReactiveUserDetailsService.class);
String password = userDetailsService.findByUsername("user").block() String password = userDetailsService.findByUsername("user")
.getPassword(); .block(Duration.ofSeconds(30)).getPassword();
assertThat(password).startsWith("{noop}"); assertThat(password).startsWith("{noop}");
})); }));
} }
@ -122,8 +124,8 @@ public class ReactiveUserDetailsServiceAutoConfigurationTests {
.run(((context) -> { .run(((context) -> {
MapReactiveUserDetailsService userDetailsService = context MapReactiveUserDetailsService userDetailsService = context
.getBean(MapReactiveUserDetailsService.class); .getBean(MapReactiveUserDetailsService.class);
String password = userDetailsService.findByUsername("user").block() String password = userDetailsService.findByUsername("user")
.getPassword(); .block(Duration.ofSeconds(30)).getPassword();
assertThat(password).isEqualTo(expectedPassword); assertThat(password).isEqualTo(expectedPassword);
})); }));
} }

@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.security.reactive; package org.springframework.boot.autoconfigure.security.reactive;
import java.time.Duration;
import org.assertj.core.api.AssertDelegateTarget; import org.assertj.core.api.AssertDelegateTarget;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@ -116,8 +118,8 @@ public class StaticResourceRequestTests {
} }
private void matches(ServerWebExchange exchange) { private void matches(ServerWebExchange exchange) {
assertThat(this.matcher.matches(exchange).block().isMatch()) assertThat(this.matcher.matches(exchange).block(Duration.ofSeconds(30))
.as("Matches " + getRequestPath(exchange)).isTrue(); .isMatch()).as("Matches " + getRequestPath(exchange)).isTrue();
} }
void doesNotMatch(String path) { void doesNotMatch(String path) {
@ -128,8 +130,9 @@ public class StaticResourceRequestTests {
} }
private void doesNotMatch(ServerWebExchange exchange) { private void doesNotMatch(ServerWebExchange exchange) {
assertThat(this.matcher.matches(exchange).block().isMatch()) assertThat(this.matcher.matches(exchange).block(Duration.ofSeconds(30))
.as("Does not match " + getRequestPath(exchange)).isFalse(); .isMatch()).as("Does not match " + getRequestPath(exchange))
.isFalse();
} }
private TestHttpWebHandlerAdapter webHandler() { private TestHttpWebHandlerAdapter webHandler() {

@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.web.reactive.function.client; package org.springframework.boot.autoconfigure.web.reactive.function.client;
import java.net.URI; import java.net.URI;
import java.time.Duration;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -108,8 +109,10 @@ public class WebClientAutoConfigurationTests {
secondBuilder.clientConnector(secondConnector) secondBuilder.clientConnector(secondConnector)
.baseUrl("http://second.example.org"); .baseUrl("http://second.example.org");
assertThat(firstBuilder).isNotEqualTo(secondBuilder); assertThat(firstBuilder).isNotEqualTo(secondBuilder);
firstBuilder.build().get().uri("/foo").exchange().block(); firstBuilder.build().get().uri("/foo").exchange()
secondBuilder.build().get().uri("/foo").exchange().block(); .block(Duration.ofSeconds(30));
secondBuilder.build().get().uri("/foo").exchange()
.block(Duration.ofSeconds(30));
verify(firstConnector).connect(eq(HttpMethod.GET), verify(firstConnector).connect(eq(HttpMethod.GET),
eq(URI.create("http://first.example.org/foo")), any()); eq(URI.create("http://first.example.org/foo")), any());
verify(secondConnector).connect(eq(HttpMethod.GET), verify(secondConnector).connect(eq(HttpMethod.GET),

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,8 @@
package org.springframework.boot.test.autoconfigure.data.mongo; package org.springframework.boot.test.autoconfigure.data.mongo;
import java.time.Duration;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -44,10 +46,11 @@ public class DataMongoTestReactiveIntegrationTests {
public void testRepository() { public void testRepository() {
ExampleDocument exampleDocument = new ExampleDocument(); ExampleDocument exampleDocument = new ExampleDocument();
exampleDocument.setText("Look, new @DataMongoTest!"); exampleDocument.setText("Look, new @DataMongoTest!");
exampleDocument = this.exampleRepository.save(exampleDocument).block(); exampleDocument = this.exampleRepository.save(exampleDocument)
.block(Duration.ofSeconds(30));
assertThat(exampleDocument.getId()).isNotNull(); assertThat(exampleDocument.getId()).isNotNull();
assertThat(this.mongoTemplate.collectionExists("exampleDocuments").block()) assertThat(this.mongoTemplate.collectionExists("exampleDocuments")
.isTrue(); .block(Duration.ofSeconds(30))).isTrue();
} }
} }

@ -19,6 +19,7 @@ package org.springframework.boot.web.embedded.undertow;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.time.Duration;
import java.util.Arrays; import java.util.Arrays;
import io.undertow.Undertow; import io.undertow.Undertow;
@ -114,7 +115,7 @@ public class UndertowReactiveWebServerFactoryTests
Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN) Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello World")).exchange() .body(BodyInserters.fromObject("Hello World")).exchange()
.flatMap((response) -> response.bodyToMono(String.class)); .flatMap((response) -> response.bodyToMono(String.class));
assertThat(result.block()).isEqualTo("Hello World"); assertThat(result.block(Duration.ofSeconds(30))).isEqualTo("Hello World");
File accessLog = new File(accessLogDirectory, expectedFile); File accessLog = new File(accessLogDirectory, expectedFile);
awaitFile(accessLog); awaitFile(accessLog);
assertThat(accessLogDirectory.listFiles()).contains(accessLog); assertThat(accessLogDirectory.listFiles()).contains(accessLog);

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,8 @@
package org.springframework.boot.web.reactive.result.view; package org.springframework.boot.web.reactive.result.view;
import java.time.Duration;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -46,12 +48,15 @@ public class MustacheViewResolverTests {
@Test @Test
public void resolveNonExistent() { public void resolveNonExistent() {
assertThat(this.resolver.resolveViewName("bar", null).block()).isNull(); assertThat(
this.resolver.resolveViewName("bar", null).block(Duration.ofSeconds(30)))
.isNull();
} }
@Test @Test
public void resolveExisting() { public void resolveExisting() {
assertThat(this.resolver.resolveViewName("template", null).block()).isNotNull(); assertThat(this.resolver.resolveViewName("template", null)
.block(Duration.ofSeconds(30))).isNotNull();
} }
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,6 +17,7 @@
package org.springframework.boot.web.reactive.result.view; package org.springframework.boot.web.reactive.result.view;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Collections; import java.util.Collections;
import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Mustache;
@ -59,9 +60,9 @@ public class MustacheViewTests {
view.setCharset(StandardCharsets.UTF_8.displayName()); view.setCharset(StandardCharsets.UTF_8.displayName());
view.setApplicationContext(this.context); view.setApplicationContext(this.context);
view.render(Collections.singletonMap("World", "Spring"), MediaType.TEXT_HTML, view.render(Collections.singletonMap("World", "Spring"), MediaType.TEXT_HTML,
this.exchange).block(); this.exchange).block(Duration.ofSeconds(30));
assertThat(this.exchange.getResponse().getBodyAsString().block()) assertThat(this.exchange.getResponse().getBodyAsString()
.isEqualTo("Hello Spring"); .block(Duration.ofSeconds(30))).isEqualTo("Hello Spring");
} }
} }

@ -102,7 +102,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
.contentType(MediaType.TEXT_PLAIN) .contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello World")).exchange() .body(BodyInserters.fromObject("Hello World")).exchange()
.flatMap((response) -> response.bodyToMono(String.class)); .flatMap((response) -> response.bodyToMono(String.class));
assertThat(result.block()).isEqualTo("Hello World"); assertThat(result.block(Duration.ofSeconds(30))).isEqualTo("Hello World");
assertThat(this.webServer.getPort()).isEqualTo(specificPort); assertThat(this.webServer.getPort()).isEqualTo(specificPort);
} }
@ -131,7 +131,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN) Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello World")).exchange() .body(BodyInserters.fromObject("Hello World")).exchange()
.flatMap((response) -> response.bodyToMono(String.class)); .flatMap((response) -> response.bodyToMono(String.class));
assertThat(result.block()).isEqualTo("Hello World"); assertThat(result.block(Duration.ofSeconds(30))).isEqualTo("Hello World");
} }
protected ReactorClientHttpConnector buildTrustAllSslConnector() { protected ReactorClientHttpConnector buildTrustAllSslConnector() {
@ -187,7 +187,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN) Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello World")).exchange() .body(BodyInserters.fromObject("Hello World")).exchange()
.flatMap((response) -> response.bodyToMono(String.class)); .flatMap((response) -> response.bodyToMono(String.class));
assertThat(result.block()).isEqualTo("Hello World"); assertThat(result.block(Duration.ofSeconds(30))).isEqualTo("Hello World");
} }
@Test @Test
@ -245,7 +245,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
public void compressionOfResponseToGetRequest() { public void compressionOfResponseToGetRequest() {
WebClient client = prepareCompressionTest(); WebClient client = prepareCompressionTest();
ResponseEntity<Void> response = client.get().exchange() ResponseEntity<Void> response = client.get().exchange()
.flatMap((res) -> res.toEntity(Void.class)).block(); .flatMap((res) -> res.toEntity(Void.class)).block(Duration.ofSeconds(30));
assertResponseIsCompressed(response); assertResponseIsCompressed(response);
} }
@ -253,7 +253,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
public void compressionOfResponseToPostRequest() { public void compressionOfResponseToPostRequest() {
WebClient client = prepareCompressionTest(); WebClient client = prepareCompressionTest();
ResponseEntity<Void> response = client.post().exchange() ResponseEntity<Void> response = client.post().exchange()
.flatMap((res) -> res.toEntity(Void.class)).block(); .flatMap((res) -> res.toEntity(Void.class)).block(Duration.ofSeconds(30));
assertResponseIsCompressed(response); assertResponseIsCompressed(response);
} }
@ -264,7 +264,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
compression.setMinResponseSize(3001); compression.setMinResponseSize(3001);
WebClient client = prepareCompressionTest(compression); WebClient client = prepareCompressionTest(compression);
ResponseEntity<Void> response = client.get().exchange() ResponseEntity<Void> response = client.get().exchange()
.flatMap((res) -> res.toEntity(Void.class)).block(); .flatMap((res) -> res.toEntity(Void.class)).block(Duration.ofSeconds(30));
assertResponseIsNotCompressed(response); assertResponseIsNotCompressed(response);
} }
@ -274,7 +274,7 @@ public abstract class AbstractReactiveWebServerFactoryTests {
compression.setMimeTypes(new String[] { "application/json" }); compression.setMimeTypes(new String[] { "application/json" });
WebClient client = prepareCompressionTest(compression); WebClient client = prepareCompressionTest(compression);
ResponseEntity<Void> response = client.get().exchange() ResponseEntity<Void> response = client.get().exchange()
.flatMap((res) -> res.toEntity(Void.class)).block(); .flatMap((res) -> res.toEntity(Void.class)).block(Duration.ofSeconds(30));
assertResponseIsNotCompressed(response); assertResponseIsNotCompressed(response);
} }
@ -285,7 +285,8 @@ public abstract class AbstractReactiveWebServerFactoryTests {
compression.setExcludedUserAgents(new String[] { "testUserAgent" }); compression.setExcludedUserAgents(new String[] { "testUserAgent" });
WebClient client = prepareCompressionTest(compression); WebClient client = prepareCompressionTest(compression);
ResponseEntity<Void> response = client.get().header("User-Agent", "testUserAgent") ResponseEntity<Void> response = client.get().header("User-Agent", "testUserAgent")
.exchange().flatMap((res) -> res.toEntity(Void.class)).block(); .exchange().flatMap((res) -> res.toEntity(Void.class))
.block(Duration.ofSeconds(30));
assertResponseIsNotCompressed(response); assertResponseIsNotCompressed(response);
} }

@ -16,6 +16,7 @@
package sample.session; package sample.session;
import java.time.Duration;
import java.util.Base64; import java.util.Base64;
import org.junit.Test; import org.junit.Test;
@ -52,17 +53,19 @@ public class SampleSessionWebFluxApplicationTests {
WebClient webClient = this.webClientBuilder WebClient webClient = this.webClientBuilder
.baseUrl("http://localhost:" + this.port + "/").build(); .baseUrl("http://localhost:" + this.port + "/").build();
ClientResponse response = webClient.get().header("Authorization", getBasicAuth()) ClientResponse response = webClient.get().header("Authorization", getBasicAuth())
.exchange().block(); .exchange().block(Duration.ofSeconds(30));
assertThat(response.statusCode()).isEqualTo(HttpStatus.OK); assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
ResponseCookie sessionCookie = response.cookies().getFirst("SESSION"); ResponseCookie sessionCookie = response.cookies().getFirst("SESSION");
String sessionId = response.bodyToMono(String.class).block(); String sessionId = response.bodyToMono(String.class)
.block(Duration.ofSeconds(30));
response = webClient.get().cookie("SESSION", sessionCookie.getValue()).exchange() response = webClient.get().cookie("SESSION", sessionCookie.getValue()).exchange()
.block(); .block(Duration.ofSeconds(30));
assertThat(response.statusCode()).isEqualTo(HttpStatus.OK); assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.bodyToMono(String.class).block()).isEqualTo(sessionId); assertThat(response.bodyToMono(String.class).block(Duration.ofSeconds(30)))
.isEqualTo(sessionId);
Thread.sleep(2000); Thread.sleep(2000);
response = webClient.get().cookie("SESSION", sessionCookie.getValue()).exchange() response = webClient.get().cookie("SESSION", sessionCookie.getValue()).exchange()
.block(); .block(Duration.ofSeconds(30));
assertThat(response.statusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); assertThat(response.statusCode()).isEqualTo(HttpStatus.UNAUTHORIZED);
} }

Loading…
Cancel
Save