diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/HttpHandlerConnector.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/HttpHandlerConnector.java index 563d8291c192..792e3c530786 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/HttpHandlerConnector.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/HttpHandlerConnector.java @@ -25,6 +25,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.MonoProcessor; +import reactor.core.scheduler.Schedulers; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpCookie; @@ -75,6 +76,13 @@ public HttpHandlerConnector(HttpHandler handler) { public Mono connect(HttpMethod httpMethod, URI uri, Function> requestCallback) { + return Mono.defer(() -> doConnect(httpMethod, uri, requestCallback)) + .subscribeOn(Schedulers.parallel()); + } + + private Mono doConnect( + HttpMethod httpMethod, URI uri, Function> requestCallback) { + MonoProcessor result = MonoProcessor.create(); MockClientHttpRequest mockClientRequest = new MockClientHttpRequest(httpMethod, uri); diff --git a/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java b/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java index 9bad3a3359c4..83a2e4c251bc 100644 --- a/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; @@ -51,7 +52,7 @@ public class HttpHandlerConnectorTests { @Test - public void adaptRequest() throws Exception { + public void adaptRequest() { TestHttpHandler handler = new TestHttpHandler(response -> { response.setStatusCode(HttpStatus.OK); @@ -79,7 +80,7 @@ public void adaptRequest() throws Exception { } @Test - public void adaptResponse() throws Exception { + public void adaptResponse() { ResponseCookie cookie = ResponseCookie.from("custom-cookie", "c0").build(); @@ -104,6 +105,22 @@ public void adaptResponse() throws Exception { assertThat(DataBufferTestUtils.dumpString(buffer, UTF_8)).isEqualTo("Custom body"); } + @Test // gh-23936 + public void handlerOnNonBlockingThread() { + + TestHttpHandler handler = new TestHttpHandler(response -> { + + assertThat(Schedulers.isInNonBlockingThread()).isTrue(); + + response.setStatusCode(HttpStatus.OK); + return response.setComplete(); + }); + + new HttpHandlerConnector(handler) + .connect(HttpMethod.POST, URI.create("/path"), request -> request.writeWith(Mono.empty())) + .block(Duration.ofSeconds(5)); + } + private DataBuffer toDataBuffer(String body) { return new DefaultDataBufferFactory().wrap(body.getBytes(UTF_8)); }