Add nullability annotations to tests in module/spring-boot-http-client
See gh-47263
This commit is contained in:
parent
f59fc4020a
commit
2ca6703f55
|
@ -44,5 +44,11 @@ dependencies {
|
||||||
testImplementation("org.springframework:spring-webflux")
|
testImplementation("org.springframework:spring-webflux")
|
||||||
testImplementation("io.micrometer:micrometer-observation-test")
|
testImplementation("io.micrometer:micrometer-observation-test")
|
||||||
|
|
||||||
|
testCompileOnly("com.google.code.findbugs:jsr305:3.0.2")
|
||||||
|
|
||||||
testRuntimeOnly("ch.qos.logback:logback-classic")
|
testRuntimeOnly("ch.qos.logback:logback-classic")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.named("compileTestJava") {
|
||||||
|
options.nullability.checking = "tests"
|
||||||
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import jakarta.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServlet;
|
import jakarta.servlet.http.HttpServlet;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
@ -168,7 +169,7 @@ abstract class AbstractClientHttpRequestFactoryBuilderTests<T extends ClientHttp
|
||||||
testRedirect(settings, HttpMethod.valueOf(httpMethod), ALWAYS_FOUND);
|
testRedirect(settings, HttpMethod.valueOf(httpMethod), ALWAYS_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void testRedirect(ClientHttpRequestFactorySettings settings, HttpMethod httpMethod,
|
protected final void testRedirect(@Nullable ClientHttpRequestFactorySettings settings, HttpMethod httpMethod,
|
||||||
Function<HttpMethod, HttpStatus> expectedStatusForMethod) throws URISyntaxException, IOException {
|
Function<HttpMethod, HttpStatus> expectedStatusForMethod) throws URISyntaxException, IOException {
|
||||||
HttpStatus expectedStatus = expectedStatusForMethod.apply(httpMethod);
|
HttpStatus expectedStatus = expectedStatusForMethod.apply(httpMethod);
|
||||||
TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0);
|
TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0);
|
||||||
|
|
|
@ -129,6 +129,7 @@ class ClientHttpRequestFactoryBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@SuppressWarnings("NullAway") // Test null check
|
||||||
void ofWithSupplierWhenSupplierIsNullThrowsException() {
|
void ofWithSupplierWhenSupplierIsNullThrowsException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ClientHttpRequestFactoryBuilder.of((Supplier<ClientHttpRequestFactory>) null))
|
.isThrownBy(() -> ClientHttpRequestFactoryBuilder.of((Supplier<ClientHttpRequestFactory>) null))
|
||||||
|
|
|
@ -103,7 +103,9 @@ class HttpComponentsClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
|
||||||
return (long) ReflectionTestUtils.getField(requestFactory, "connectTimeout");
|
Object field = ReflectionTestUtils.getField(requestFactory, "connectTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return (long) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -111,9 +113,11 @@ class HttpComponentsClientHttpRequestFactoryBuilderTests
|
||||||
protected long readTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(HttpComponentsClientHttpRequestFactory requestFactory) {
|
||||||
HttpClient httpClient = requestFactory.getHttpClient();
|
HttpClient httpClient = requestFactory.getHttpClient();
|
||||||
Object connectionManager = ReflectionTestUtils.getField(httpClient, "connManager");
|
Object connectionManager = ReflectionTestUtils.getField(httpClient, "connManager");
|
||||||
SocketConfig socketConfig = ((Resolver<HttpRoute, SocketConfig>) ReflectionTestUtils.getField(connectionManager,
|
assertThat(connectionManager).isNotNull();
|
||||||
"socketConfigResolver"))
|
Resolver<HttpRoute, SocketConfig> socketConfigResolver = (Resolver<HttpRoute, SocketConfig>) ReflectionTestUtils
|
||||||
.resolve(null);
|
.getField(connectionManager, "socketConfigResolver");
|
||||||
|
assertThat(socketConfigResolver).isNotNull();
|
||||||
|
SocketConfig socketConfig = socketConfigResolver.resolve(null);
|
||||||
return socketConfig.getSoTimeout().toMilliseconds();
|
return socketConfig.getSoTimeout().toMilliseconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ class JdkClientHttpRequestFactoryBuilderTests
|
||||||
Executor executor = new SimpleAsyncTaskExecutor();
|
Executor executor = new SimpleAsyncTaskExecutor();
|
||||||
JdkClientHttpRequestFactory factory = ClientHttpRequestFactoryBuilder.jdk().withExecutor(executor).build();
|
JdkClientHttpRequestFactory factory = ClientHttpRequestFactoryBuilder.jdk().withExecutor(executor).build();
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(factory, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(factory, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
assertThat(httpClient.executor()).containsSame(executor);
|
assertThat(httpClient.executor()).containsSame(executor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,12 +71,14 @@ class JdkClientHttpRequestFactoryBuilderTests
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(JdkClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(JdkClientHttpRequestFactory requestFactory) {
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
return httpClient.connectTimeout().get().toMillis();
|
return httpClient.connectTimeout().get().toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(JdkClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(JdkClientHttpRequestFactory requestFactory) {
|
||||||
Duration readTimeout = (Duration) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
Duration readTimeout = (Duration) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
||||||
|
assertThat(readTimeout).isNotNull();
|
||||||
return readTimeout.toMillis();
|
return readTimeout.toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,12 +77,16 @@ class JettyClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(JettyClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(JettyClientHttpRequestFactory requestFactory) {
|
||||||
return ((HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient")).getConnectTimeout();
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
|
return httpClient.getConnectTimeout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(JettyClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(JettyClientHttpRequestFactory requestFactory) {
|
||||||
return (long) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
Object field = ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return (long) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TestHttpClientTransport extends HttpClientTransportOverHTTP {
|
static class TestHttpClientTransport extends HttpClientTransportOverHTTP {
|
||||||
|
|
|
@ -100,14 +100,18 @@ class ReactorClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(ReactorClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(ReactorClientHttpRequestFactory requestFactory) {
|
||||||
return (int) ((HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient")).configuration()
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
||||||
.options()
|
assertThat(httpClient).isNotNull();
|
||||||
.get(ChannelOption.CONNECT_TIMEOUT_MILLIS);
|
Object connectTimeout = httpClient.configuration().options().get(ChannelOption.CONNECT_TIMEOUT_MILLIS);
|
||||||
|
assertThat(connectTimeout).isNotNull();
|
||||||
|
return (int) connectTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(ReactorClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(ReactorClientHttpRequestFactory requestFactory) {
|
||||||
return ((Duration) ReflectionTestUtils.getField(requestFactory, "readTimeout")).toMillis();
|
Duration readTimeout = (Duration) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
||||||
|
assertThat(readTimeout).isNotNull();
|
||||||
|
return readTimeout.toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.net.URI;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
import org.eclipse.jetty.client.HttpClient;
|
import org.eclipse.jetty.client.HttpClient;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
|
@ -179,12 +180,16 @@ class ReflectiveComponentsClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(ClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(ClientHttpRequestFactory requestFactory) {
|
||||||
return ((HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient")).getConnectTimeout();
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(requestFactory, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
|
return httpClient.getConnectTimeout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(ClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(ClientHttpRequestFactory requestFactory) {
|
||||||
return (long) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
Object field = ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return (long) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TestClientHttpRequestFactory implements ClientHttpRequestFactory {
|
public static class TestClientHttpRequestFactory implements ClientHttpRequestFactory {
|
||||||
|
@ -244,9 +249,9 @@ class ReflectiveComponentsClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
private int connectTimeout;
|
private int connectTimeout;
|
||||||
|
|
||||||
private Duration readTimeoutDuration;
|
private @Nullable Duration readTimeoutDuration;
|
||||||
|
|
||||||
private Duration connectTimeoutDuration;
|
private @Nullable Duration connectTimeoutDuration;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) {
|
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) {
|
||||||
|
@ -261,11 +266,11 @@ class ReflectiveComponentsClientHttpRequestFactoryBuilderTests
|
||||||
this.readTimeout = timeout;
|
this.readTimeout = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConnectTimeout(Duration timeout) {
|
public void setConnectTimeout(@Nullable Duration timeout) {
|
||||||
this.connectTimeoutDuration = timeout;
|
this.connectTimeoutDuration = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setReadTimeout(Duration timeout) {
|
public void setReadTimeout(@Nullable Duration timeout) {
|
||||||
this.readTimeoutDuration = timeout;
|
this.readTimeoutDuration = timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||||
import org.springframework.test.util.ReflectionTestUtils;
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,12 +42,16 @@ class SimpleClientHttpRequestFactoryBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(SimpleClientHttpRequestFactory requestFactory) {
|
protected long connectTimeout(SimpleClientHttpRequestFactory requestFactory) {
|
||||||
return (int) ReflectionTestUtils.getField(requestFactory, "connectTimeout");
|
Object field = ReflectionTestUtils.getField(requestFactory, "connectTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return (int) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(SimpleClientHttpRequestFactory requestFactory) {
|
protected long readTimeout(SimpleClientHttpRequestFactory requestFactory) {
|
||||||
return (int) ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
Object field = ReflectionTestUtils.getField(requestFactory, "readTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return (int) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.springframework.boot.http.client.JdkClientHttpRequestFactoryBuilder;
|
||||||
import org.springframework.boot.http.client.JettyClientHttpRequestFactoryBuilder;
|
import org.springframework.boot.http.client.JettyClientHttpRequestFactoryBuilder;
|
||||||
import org.springframework.boot.http.client.ReactorClientHttpRequestFactoryBuilder;
|
import org.springframework.boot.http.client.ReactorClientHttpRequestFactoryBuilder;
|
||||||
import org.springframework.boot.http.client.SimpleClientHttpRequestFactoryBuilder;
|
import org.springframework.boot.http.client.SimpleClientHttpRequestFactoryBuilder;
|
||||||
|
import org.springframework.boot.ssl.SslBundle;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||||
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
|
||||||
|
@ -81,7 +82,9 @@ class HttpClientAutoConfigurationTests {
|
||||||
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
||||||
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
||||||
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
||||||
assertThat(settings.sslBundle().getKey().getAlias()).isEqualTo("alias1");
|
SslBundle sslBundle = settings.sslBundle();
|
||||||
|
assertThat(sslBundle).isNotNull();
|
||||||
|
assertThat(sslBundle.getKey().getAlias()).isEqualTo("alias1");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +98,9 @@ class HttpClientAutoConfigurationTests {
|
||||||
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
||||||
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
||||||
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
||||||
assertThat(settings.sslBundle().getKey().getAlias()).isEqualTo("alias1");
|
SslBundle sslBundle = settings.sslBundle();
|
||||||
|
assertThat(sslBundle).isNotNull();
|
||||||
|
assertThat(sslBundle.getKey().getAlias()).isEqualTo("alias1");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +163,7 @@ class HttpClientAutoConfigurationTests {
|
||||||
.run((context) -> {
|
.run((context) -> {
|
||||||
ClientHttpRequestFactory factory = context.getBean(ClientHttpRequestFactoryBuilder.class).build();
|
ClientHttpRequestFactory factory = context.getBean(ClientHttpRequestFactoryBuilder.class).build();
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(factory, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(factory, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
assertThat(httpClient.executor()).containsInstanceOf(VirtualThreadTaskExecutor.class);
|
assertThat(httpClient.executor()).containsInstanceOf(VirtualThreadTaskExecutor.class);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ class PropertiesApiVersionInserterTests {
|
||||||
@Test
|
@Test
|
||||||
void getWhenNoPropertiesAndDelegateUsesDelegate() throws Exception {
|
void getWhenNoPropertiesAndDelegateUsesDelegate() throws Exception {
|
||||||
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(ApiVersionInserter.useQueryParam("v"), null);
|
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(ApiVersionInserter.useQueryParam("v"), null);
|
||||||
|
assertThat(inserter).isNotNull();
|
||||||
URI uri = new URI("https://example.com");
|
URI uri = new URI("https://example.com");
|
||||||
assertThat(inserter.insertVersion("123", uri)).hasToString("https://example.com?v=123");
|
assertThat(inserter.insertVersion("123", uri)).hasToString("https://example.com?v=123");
|
||||||
}
|
}
|
||||||
|
@ -63,13 +64,16 @@ class PropertiesApiVersionInserterTests {
|
||||||
properties2.getInsert().setPathSegment(1);
|
properties2.getInsert().setPathSegment(1);
|
||||||
properties2.getInsert().setMediaTypeParameter("mtp");
|
properties2.getInsert().setMediaTypeParameter("mtp");
|
||||||
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(null, null, properties1, properties2);
|
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(null, null, properties1, properties2);
|
||||||
|
assertThat(inserter).isNotNull();
|
||||||
URI uri = new URI("https://example.com/foo/bar");
|
URI uri = new URI("https://example.com/foo/bar");
|
||||||
assertThat(inserter.insertVersion("123", uri)).hasToString("https://example.com/foo/123/bar?v1=123&v2=123");
|
assertThat(inserter.insertVersion("123", uri)).hasToString("https://example.com/foo/123/bar?v1=123&v2=123");
|
||||||
HttpHeaders headers = new HttpHeaders();
|
HttpHeaders headers = new HttpHeaders();
|
||||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||||
inserter.insertVersion("123", headers);
|
inserter.insertVersion("123", headers);
|
||||||
assertThat(headers.get("x-test")).containsExactly("123");
|
assertThat(headers.get("x-test")).containsExactly("123");
|
||||||
assertThat(headers.getContentType().getParameters()).containsEntry("mtp", "123");
|
MediaType contentType = headers.getContentType();
|
||||||
|
assertThat(contentType).isNotNull();
|
||||||
|
assertThat(contentType.getParameters()).containsEntry("mtp", "123");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -78,6 +82,7 @@ class PropertiesApiVersionInserterTests {
|
||||||
ApiversionProperties properties = new ApiversionProperties();
|
ApiversionProperties properties = new ApiversionProperties();
|
||||||
properties.getInsert().setQueryParameter("v");
|
properties.getInsert().setQueryParameter("v");
|
||||||
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(delegate, null, properties);
|
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(delegate, null, properties);
|
||||||
|
assertThat(inserter).isNotNull();
|
||||||
assertThat(inserter.insertVersion("123", new URI("https://example.com")))
|
assertThat(inserter.insertVersion("123", new URI("https://example.com")))
|
||||||
.hasToString("https://example.com?d=123&v=123");
|
.hasToString("https://example.com?d=123&v=123");
|
||||||
}
|
}
|
||||||
|
@ -88,6 +93,7 @@ class PropertiesApiVersionInserterTests {
|
||||||
properties1.getInsert().setQueryParameter("v");
|
properties1.getInsert().setQueryParameter("v");
|
||||||
ApiVersionFormatter formatter = (version) -> String.valueOf(version).toUpperCase(Locale.ROOT);
|
ApiVersionFormatter formatter = (version) -> String.valueOf(version).toUpperCase(Locale.ROOT);
|
||||||
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(null, formatter, properties1);
|
ApiVersionInserter inserter = PropertiesApiVersionInserter.get(null, formatter, properties1);
|
||||||
|
assertThat(inserter).isNotNull();
|
||||||
URI uri = new URI("https://example.com");
|
URI uri = new URI("https://example.com");
|
||||||
assertThat(inserter.insertVersion("latest", uri)).hasToString("https://example.com?v=LATEST");
|
assertThat(inserter.insertVersion("latest", uri)).hasToString("https://example.com?v=LATEST");
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings
|
||||||
import org.springframework.boot.http.client.reactive.JdkClientHttpConnectorBuilder;
|
import org.springframework.boot.http.client.reactive.JdkClientHttpConnectorBuilder;
|
||||||
import org.springframework.boot.http.client.reactive.JettyClientHttpConnectorBuilder;
|
import org.springframework.boot.http.client.reactive.JettyClientHttpConnectorBuilder;
|
||||||
import org.springframework.boot.http.client.reactive.ReactorClientHttpConnectorBuilder;
|
import org.springframework.boot.http.client.reactive.ReactorClientHttpConnectorBuilder;
|
||||||
|
import org.springframework.boot.ssl.SslBundle;
|
||||||
import org.springframework.boot.test.context.FilteredClassLoader;
|
import org.springframework.boot.test.context.FilteredClassLoader;
|
||||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
@ -160,7 +161,9 @@ class ClientHttpConnectorAutoConfigurationTests {
|
||||||
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
assertThat(settings.redirects()).isEqualTo(HttpRedirects.DONT_FOLLOW);
|
||||||
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(10));
|
||||||
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(20));
|
||||||
assertThat(settings.sslBundle().getKey().getAlias()).isEqualTo("alias1");
|
SslBundle sslBundle = settings.sslBundle();
|
||||||
|
assertThat(sslBundle).isNotNull();
|
||||||
|
assertThat(sslBundle.getKey().getAlias()).isEqualTo("alias1");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,6 +187,7 @@ class ClientHttpConnectorAutoConfigurationTests {
|
||||||
ClientHttpConnector connector = context.getBean(ClientHttpConnectorBuilder.class).build();
|
ClientHttpConnector connector = context.getBean(ClientHttpConnectorBuilder.class).build();
|
||||||
java.net.http.HttpClient httpClient = (java.net.http.HttpClient) ReflectionTestUtils.getField(connector,
|
java.net.http.HttpClient httpClient = (java.net.http.HttpClient) ReflectionTestUtils.getField(connector,
|
||||||
"httpClient");
|
"httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
assertThat(httpClient.executor()).containsInstanceOf(VirtualThreadTaskExecutor.class);
|
assertThat(httpClient.executor()).containsInstanceOf(VirtualThreadTaskExecutor.class);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import jakarta.servlet.ServletException;
|
||||||
import jakarta.servlet.http.HttpServlet;
|
import jakarta.servlet.http.HttpServlet;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
@ -172,7 +173,7 @@ abstract class AbstractClientHttpConnectorBuilderTests<T extends ClientHttpConne
|
||||||
testRedirect(settings, HttpMethod.valueOf(httpMethod), ALWAYS_FOUND);
|
testRedirect(settings, HttpMethod.valueOf(httpMethod), ALWAYS_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void testRedirect(ClientHttpConnectorSettings settings, HttpMethod httpMethod,
|
protected final void testRedirect(@Nullable ClientHttpConnectorSettings settings, HttpMethod httpMethod,
|
||||||
Function<HttpMethod, HttpStatus> expectedStatusForMethod) throws URISyntaxException {
|
Function<HttpMethod, HttpStatus> expectedStatusForMethod) throws URISyntaxException {
|
||||||
HttpStatus expectedStatus = expectedStatusForMethod.apply(httpMethod);
|
HttpStatus expectedStatus = expectedStatusForMethod.apply(httpMethod);
|
||||||
TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0);
|
TomcatServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(0);
|
||||||
|
@ -204,7 +205,9 @@ abstract class AbstractClientHttpConnectorBuilderTests<T extends ClientHttpConne
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClientResponse getResponse(ClientHttpConnector connector, ClientRequest request) {
|
private ClientResponse getResponse(ClientHttpConnector connector, ClientRequest request) {
|
||||||
return ExchangeFunctions.create(connector).exchange(request).block();
|
ClientResponse response = ExchangeFunctions.create(connector).exchange(request).block();
|
||||||
|
assertThat(response).isNotNull();
|
||||||
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ssl ssl(String... ciphers) {
|
private Ssl ssl(String... ciphers) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
|
||||||
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
|
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
|
||||||
import org.apache.hc.core5.function.Resolver;
|
import org.apache.hc.core5.function.Resolver;
|
||||||
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
|
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
|
||||||
|
import org.jspecify.annotations.Nullable;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.http.client.HttpComponentsHttpAsyncClientBuilder;
|
import org.springframework.boot.http.client.HttpComponentsHttpAsyncClientBuilder;
|
||||||
|
@ -83,7 +84,7 @@ class HttpComponentsClientHttpConnectorBuilderTests
|
||||||
void withTlsSocketStrategyFactory() {
|
void withTlsSocketStrategyFactory() {
|
||||||
ClientHttpConnectorSettings settings = ClientHttpConnectorSettings.ofSslBundle(sslBundle());
|
ClientHttpConnectorSettings settings = ClientHttpConnectorSettings.ofSslBundle(sslBundle());
|
||||||
List<SslBundle> bundles = new ArrayList<>();
|
List<SslBundle> bundles = new ArrayList<>();
|
||||||
Function<SslBundle, TlsStrategy> tlsSocketStrategyFactory = (bundle) -> {
|
Function<@Nullable SslBundle, @Nullable TlsStrategy> tlsSocketStrategyFactory = (bundle) -> {
|
||||||
bundles.add(bundle);
|
bundles.add(bundle);
|
||||||
return (sessionLayer, host, localAddress, remoteAddress, attachment, handshakeTimeout) -> false;
|
return (sessionLayer, host, localAddress, remoteAddress, attachment, handshakeTimeout) -> false;
|
||||||
};
|
};
|
||||||
|
@ -115,10 +116,13 @@ class HttpComponentsClientHttpConnectorBuilderTests
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private ConnectionConfig getConnectorConfig(HttpComponentsClientHttpConnector connector) {
|
private ConnectionConfig getConnectorConfig(HttpComponentsClientHttpConnector connector) {
|
||||||
HttpAsyncClient httpClient = (HttpAsyncClient) ReflectionTestUtils.getField(connector, "client");
|
HttpAsyncClient httpClient = (HttpAsyncClient) ReflectionTestUtils.getField(connector, "client");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
Object manager = ReflectionTestUtils.getField(httpClient, "manager");
|
Object manager = ReflectionTestUtils.getField(httpClient, "manager");
|
||||||
ConnectionConfig connectorConfig = ((Resolver<HttpRoute, ConnectionConfig>) ReflectionTestUtils
|
assertThat(manager).isNotNull();
|
||||||
.getField(manager, "connectionConfigResolver")).resolve(null);
|
Resolver<HttpRoute, ConnectionConfig> connectionConfigResolver = (Resolver<HttpRoute, ConnectionConfig>) ReflectionTestUtils
|
||||||
return connectorConfig;
|
.getField(manager, "connectionConfigResolver");
|
||||||
|
assertThat(connectionConfigResolver).isNotNull();
|
||||||
|
return connectionConfigResolver.resolve(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ class JdkClientHttpConnectorBuilderTests extends AbstractClientHttpConnectorBuil
|
||||||
Executor executor = new SimpleAsyncTaskExecutor();
|
Executor executor = new SimpleAsyncTaskExecutor();
|
||||||
JdkClientHttpConnector connector = ClientHttpConnectorBuilder.jdk().withExecutor(executor).build();
|
JdkClientHttpConnector connector = ClientHttpConnectorBuilder.jdk().withExecutor(executor).build();
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
assertThat(httpClient.executor()).containsSame(executor);
|
assertThat(httpClient.executor()).containsSame(executor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,12 +71,14 @@ class JdkClientHttpConnectorBuilderTests extends AbstractClientHttpConnectorBuil
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(JdkClientHttpConnector connector) {
|
protected long connectTimeout(JdkClientHttpConnector connector) {
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
return httpClient.connectTimeout().get().toMillis();
|
return httpClient.connectTimeout().get().toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(JdkClientHttpConnector connector) {
|
protected long readTimeout(JdkClientHttpConnector connector) {
|
||||||
Duration readTimeout = (Duration) ReflectionTestUtils.getField(connector, "readTimeout");
|
Duration readTimeout = (Duration) ReflectionTestUtils.getField(connector, "readTimeout");
|
||||||
|
assertThat(readTimeout).isNotNull();
|
||||||
return readTimeout.toMillis();
|
return readTimeout.toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,13 +78,18 @@ class JettyClientHttpConnectorBuilderTests extends AbstractClientHttpConnectorBu
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(JettyClientHttpConnector connector) {
|
protected long connectTimeout(JettyClientHttpConnector connector) {
|
||||||
return ((HttpClient) ReflectionTestUtils.getField(connector, "httpClient")).getConnectTimeout();
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
|
assertThat(httpClient).isNotNull();
|
||||||
|
return httpClient.getConnectTimeout();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(JettyClientHttpConnector connector) {
|
protected long readTimeout(JettyClientHttpConnector connector) {
|
||||||
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
return ((Duration) ReflectionTestUtils.getField(httpClient, "readTimeout")).toMillis();
|
assertThat(httpClient).isNotNull();
|
||||||
|
Object field = ReflectionTestUtils.getField(httpClient, "readTimeout");
|
||||||
|
assertThat(field).isNotNull();
|
||||||
|
return ((Duration) field).toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TestHttpClientTransport extends HttpClientTransportOverHTTP {
|
static class TestHttpClientTransport extends HttpClientTransportOverHTTP {
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.boot.http.client.reactive;
|
package org.springframework.boot.http.client.reactive;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
@ -99,16 +100,20 @@ class ReactorClientHttpConnectorBuilderTests
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long connectTimeout(ReactorClientHttpConnector connector) {
|
protected long connectTimeout(ReactorClientHttpConnector connector) {
|
||||||
return (int) ((HttpClient) ReflectionTestUtils.getField(connector, "httpClient")).configuration()
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
.options()
|
assertThat(httpClient).isNotNull();
|
||||||
.get(ChannelOption.CONNECT_TIMEOUT_MILLIS);
|
Object connectTimeout = httpClient.configuration().options().get(ChannelOption.CONNECT_TIMEOUT_MILLIS);
|
||||||
|
assertThat(connectTimeout).isNotNull();
|
||||||
|
return (int) connectTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected long readTimeout(ReactorClientHttpConnector connector) {
|
protected long readTimeout(ReactorClientHttpConnector connector) {
|
||||||
return (int) ((HttpClient) ReflectionTestUtils.getField(connector, "httpClient")).configuration()
|
HttpClient httpClient = (HttpClient) ReflectionTestUtils.getField(connector, "httpClient");
|
||||||
.responseTimeout()
|
assertThat(httpClient).isNotNull();
|
||||||
.toMillis();
|
Duration responseTimeout = httpClient.configuration().responseTimeout();
|
||||||
|
assertThat(responseTimeout).isNotNull();
|
||||||
|
return (int) responseTimeout.toMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue