From a16309edb10087bc61c343def7d52338c2cfe2cf Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 25 Apr 2025 18:00:45 +0200 Subject: [PATCH 1/4] Add autoconfiguration tests. Signed-off-by: Olga Maciaszek-Sharma --- ...atewayServerMvcAutoConfigurationTests.java | 140 ++++++++++-------- 1 file changed, 81 insertions(+), 59 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java index 917c0a5425..efa084f148 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java @@ -1,6 +1,5 @@ /* - * Copyright 2013-2024 the original author or authors. - * + * Copyright 2013-2025 * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -34,6 +33,7 @@ import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; import org.springframework.boot.http.client.ClientHttpRequestFactorySettings; import org.springframework.boot.http.client.SimpleClientHttpRequestFactoryBuilder; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.gateway.server.mvc.filter.FilterAutoConfiguration; import org.springframework.cloud.gateway.server.mvc.filter.FormFilter; @@ -47,6 +47,7 @@ import org.springframework.cloud.gateway.server.mvc.filter.XForwardedRequestHeadersFilter; import org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctionAutoConfiguration; import org.springframework.cloud.gateway.server.mvc.predicate.PredicateAutoConfiguration; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.context.ConfigurableApplicationContext; import static org.assertj.core.api.Assertions.assertThat; @@ -76,7 +77,7 @@ public class GatewayServerMvcAutoConfigurationTests { fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== -----END CERTIFICATE----- - """; + """; private static final String key = """ -----BEGIN PRIVATE KEY----- @@ -112,44 +113,44 @@ public class GatewayServerMvcAutoConfigurationTests { @Test void filterEnabledPropertiesWork() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, - HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, - HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, - RestClientAutoConfiguration.class, SslAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", - "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", - "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") - .run(context -> { - assertThat(context).doesNotHaveBean(FormFilter.class); - assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHttp2StatusResponseHeadersFilter.class); - assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); - assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.class); - }); + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", + "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", + "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") + .run(context -> { + assertThat(context).doesNotHaveBean(FormFilter.class); + assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHttp2StatusResponseHeadersFilter.class); + assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); + assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.class); + }); } @DisabledForJreRange(min = JRE.JAVA_23) @Test void gatewayHttpClientPropertiesWork() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", - "spring.cloud.gateway.mvc.http-client.connect-timeout=1s", - "spring.cloud.gateway.mvc.http-client.read-timeout=2s", - "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle", - "spring.cloud.gateway.mvc.http-client.type=autodetect", - "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, - "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) - .run(); + .properties("spring.main.web-application-type=none", + "spring.cloud.gateway.mvc.http-client.connect-timeout=1s", + "spring.cloud.gateway.mvc.http-client.read-timeout=2s", + "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle", + "spring.cloud.gateway.mvc.http-client.type=autodetect", + "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, + "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) + .run(); ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); HttpClientProperties properties = context.getBean(HttpClientProperties.class); assertThat(properties.getConnectTimeout()).hasSeconds(1); @@ -165,39 +166,60 @@ void gatewayHttpClientPropertiesWork() { @Test void bootHttpClientPropertiesWork() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, - HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, - HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, - RestClientAutoConfiguration.class, SslAutoConfiguration.class)) - .withPropertyValues("spring.http.client.connect-timeout=1s", "spring.http.client.read-timeout=2s", - "spring.http.client.ssl.bundle=mybundle", - "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, - "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) - .run(context -> { - assertThat(context).hasSingleBean(ClientHttpRequestFactorySettings.class) - .hasSingleBean(HttpClientProperties.class); - HttpClientProperties httpClient = context.getBean(HttpClientProperties.class); - assertThat(httpClient.getConnectTimeout()).hasSeconds(1); - assertThat(httpClient.getReadTimeout()).hasSeconds(2); - assertThat(httpClient.getSsl().getBundle()).isEqualTo("mybundle"); - assertThat(httpClient.getFactory()).isNull(); - ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); - assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(2)); - assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(1)); - assertThat(settings.sslBundle()).isNotNull(); - // cant test redirects because EnvironmentPostProcessor is not run - }); + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withPropertyValues("spring.http.client.connect-timeout=1s", "spring.http.client.read-timeout=2s", + "spring.http.client.ssl.bundle=mybundle", + "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, + "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) + .run(context -> { + assertThat(context).hasSingleBean(ClientHttpRequestFactorySettings.class) + .hasSingleBean(HttpClientProperties.class); + HttpClientProperties httpClient = context.getBean(HttpClientProperties.class); + assertThat(httpClient.getConnectTimeout()).hasSeconds(1); + assertThat(httpClient.getReadTimeout()).hasSeconds(2); + assertThat(httpClient.getSsl().getBundle()).isEqualTo("mybundle"); + assertThat(httpClient.getFactory()).isNull(); + ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); + assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(2)); + assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(1)); + assertThat(settings.sslBundle()).isNotNull(); + // cant test redirects because EnvironmentPostProcessor is not run + }); } @Test void settingHttpClientFactoryWorks() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", "spring.http.client.factory=simple") - .run(); + .properties("spring.main.web-application-type=none", "spring.http.client.factory=simple") + .run(); ClientHttpRequestFactoryBuilder builder = context.getBean(ClientHttpRequestFactoryBuilder.class); assertThat(builder).isInstanceOf(SimpleClientHttpRequestFactoryBuilder.class); } + @Test + void loadBalancerFunctionHandlerAdded() { + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class)) + .run(context -> assertThat(context).hasBean("lbHandlerFunctionDefinition")); + } + + @Test + void loadBalancerFunctionHandlerNotAddedWhenNoLoadBalancerClientOnClasspath() { + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class)) + .withClassLoader(new FilteredClassLoader(LoadBalancerClient.class)) + .run(context -> assertThat(context).doesNotHaveBean("lbHandlerFunctionDefinition")); + } + @SpringBootConfiguration @EnableAutoConfiguration static class TestConfig { From e21dce1cf63d6b1385f7761e4b589a7574d2fe3f Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 25 Apr 2025 18:25:01 +0200 Subject: [PATCH 2/4] Add integration test. Signed-off-by: Olga Maciaszek-Sharma --- ...ServerMvcLoadBalancerIntegrationTests.java | 62 +++++++++++++++++++ .../src/test/resources/application-lb.yml | 11 ++++ 2 files changed, 73 insertions(+) create mode 100644 spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcLoadBalancerIntegrationTests.java create mode 100644 spring-cloud-gateway-server-mvc/src/test/resources/application-lb.yml diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcLoadBalancerIntegrationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcLoadBalancerIntegrationTests.java new file mode 100644 index 0000000000..f0b9106681 --- /dev/null +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcLoadBalancerIntegrationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2013-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.gateway.server.mvc; + +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.cloud.gateway.server.mvc.filter.FilterAutoConfiguration; +import org.springframework.cloud.gateway.server.mvc.test.HttpbinTestcontainers; +import org.springframework.cloud.gateway.server.mvc.test.TestLoadBalancerConfig; +import org.springframework.cloud.gateway.server.mvc.test.client.TestRestClient; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; + +/** + * Integration tests for {@link FilterAutoConfiguration.LoadBalancerHandlerConfiguration}. + * + * @author Olga Maciaszek-Sharma + * + */ +@SpringBootTest(classes = {ServerMvcLoadBalancerIntegrationTests.Config.class, FilterAutoConfiguration.class}, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ContextConfiguration(initializers = HttpbinTestcontainers.class) +@ActiveProfiles("lb") +public class ServerMvcLoadBalancerIntegrationTests { + + @LocalServerPort + int port; + + @Autowired + TestRestClient testRestClient; + + @Test + void shouldUseLbHandlerFunctionDefinitionToResolveHost() { + testRestClient.get() + .uri("http://localhost:" + port + "/test") + .exchange().expectStatus().isOk(); + } + + @SpringBootApplication + @LoadBalancerClient(name = "httpbin", configuration = TestLoadBalancerConfig.Httpbin.class) + static class Config { + } +} diff --git a/spring-cloud-gateway-server-mvc/src/test/resources/application-lb.yml b/spring-cloud-gateway-server-mvc/src/test/resources/application-lb.yml new file mode 100644 index 0000000000..9d0437b3b3 --- /dev/null +++ b/spring-cloud-gateway-server-mvc/src/test/resources/application-lb.yml @@ -0,0 +1,11 @@ +spring: + cloud: + gateway: + mvc: + routes: + - id: test + uri: lb://httpbin + predicates: + - Path=/test/** + filters: + - StripPrefix=1 \ No newline at end of file From 2b5698722f62cf8cf76840fe78f8e176d5f46285 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Fri, 25 Apr 2025 18:28:34 +0200 Subject: [PATCH 3/4] Remove unnecessary formatting changes. Signed-off-by: Olga Maciaszek-Sharma --- ...atewayServerMvcAutoConfigurationTests.java | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java index efa084f148..0bf4edca2f 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java @@ -77,7 +77,7 @@ public class GatewayServerMvcAutoConfigurationTests { fl1PiUDyPRIl2cnOJd+wCHKsyym/FL7yzk0OSEZ81I92LpGd/0b2Ld3m/bpe+C4Z ILzLXTnC6AhrLcDc9QN/EO+BiCL52n7EplNLtSn1LQ== -----END CERTIFICATE----- - """; + """; private static final String key = """ -----BEGIN PRIVATE KEY----- @@ -113,44 +113,44 @@ public class GatewayServerMvcAutoConfigurationTests { @Test void filterEnabledPropertiesWork() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, - HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, - HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, - RestClientAutoConfiguration.class, SslAutoConfiguration.class)) - .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", - "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", - "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", - "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") - .run(context -> { - assertThat(context).doesNotHaveBean(FormFilter.class); - assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); - assertThat(context).doesNotHaveBean(RemoveHttp2StatusResponseHeadersFilter.class); - assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); - assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); - assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.class); - }); + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withPropertyValues("spring.cloud.gateway.mvc.form-filter.enabled=false", + "spring.cloud.gateway.mvc.forwarded-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-content-length-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-hop-by-hop-response-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.remove-http2-status-response-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.transfer-encoding-normalization-request-headers-filter.enabled=false", + "spring.cloud.gateway.mvc.weight-calculator-filter.enabled=false", + "spring.cloud.gateway.mvc.x-forwarded-request-headers-filter.enabled=false") + .run(context -> { + assertThat(context).doesNotHaveBean(FormFilter.class); + assertThat(context).doesNotHaveBean(ForwardedRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveContentLengthRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHopByHopResponseHeadersFilter.class); + assertThat(context).doesNotHaveBean(RemoveHttp2StatusResponseHeadersFilter.class); + assertThat(context).doesNotHaveBean(TransferEncodingNormalizationRequestHeadersFilter.class); + assertThat(context).doesNotHaveBean(WeightCalculatorFilter.class); + assertThat(context).doesNotHaveBean(XForwardedRequestHeadersFilter.class); + }); } @DisabledForJreRange(min = JRE.JAVA_23) @Test void gatewayHttpClientPropertiesWork() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", - "spring.cloud.gateway.mvc.http-client.connect-timeout=1s", - "spring.cloud.gateway.mvc.http-client.read-timeout=2s", - "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle", - "spring.cloud.gateway.mvc.http-client.type=autodetect", - "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, - "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) - .run(); + .properties("spring.main.web-application-type=none", + "spring.cloud.gateway.mvc.http-client.connect-timeout=1s", + "spring.cloud.gateway.mvc.http-client.read-timeout=2s", + "spring.cloud.gateway.mvc.http-client.ssl-bundle=mybundle", + "spring.cloud.gateway.mvc.http-client.type=autodetect", + "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, + "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) + .run(); ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); HttpClientProperties properties = context.getBean(HttpClientProperties.class); assertThat(properties.getConnectTimeout()).hasSeconds(1); @@ -166,35 +166,35 @@ void gatewayHttpClientPropertiesWork() { @Test void bootHttpClientPropertiesWork() { new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, - HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, - HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, - RestClientAutoConfiguration.class, SslAutoConfiguration.class)) - .withPropertyValues("spring.http.client.connect-timeout=1s", "spring.http.client.read-timeout=2s", - "spring.http.client.ssl.bundle=mybundle", - "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, - "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) - .run(context -> { - assertThat(context).hasSingleBean(ClientHttpRequestFactorySettings.class) - .hasSingleBean(HttpClientProperties.class); - HttpClientProperties httpClient = context.getBean(HttpClientProperties.class); - assertThat(httpClient.getConnectTimeout()).hasSeconds(1); - assertThat(httpClient.getReadTimeout()).hasSeconds(2); - assertThat(httpClient.getSsl().getBundle()).isEqualTo("mybundle"); - assertThat(httpClient.getFactory()).isNull(); - ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); - assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(2)); - assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(1)); - assertThat(settings.sslBundle()).isNotNull(); - // cant test redirects because EnvironmentPostProcessor is not run - }); + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withPropertyValues("spring.http.client.connect-timeout=1s", "spring.http.client.read-timeout=2s", + "spring.http.client.ssl.bundle=mybundle", + "spring.ssl.bundle.pem.mybundle.keystore.certificate=" + cert, + "spring.ssl.bundle.pem.mybundle.keystore.key=" + key) + .run(context -> { + assertThat(context).hasSingleBean(ClientHttpRequestFactorySettings.class) + .hasSingleBean(HttpClientProperties.class); + HttpClientProperties httpClient = context.getBean(HttpClientProperties.class); + assertThat(httpClient.getConnectTimeout()).hasSeconds(1); + assertThat(httpClient.getReadTimeout()).hasSeconds(2); + assertThat(httpClient.getSsl().getBundle()).isEqualTo("mybundle"); + assertThat(httpClient.getFactory()).isNull(); + ClientHttpRequestFactorySettings settings = context.getBean(ClientHttpRequestFactorySettings.class); + assertThat(settings.readTimeout()).isEqualTo(Duration.ofSeconds(2)); + assertThat(settings.connectTimeout()).isEqualTo(Duration.ofSeconds(1)); + assertThat(settings.sslBundle()).isNotNull(); + // cant test redirects because EnvironmentPostProcessor is not run + }); } @Test void settingHttpClientFactoryWorks() { ConfigurableApplicationContext context = new SpringApplicationBuilder(TestConfig.class) - .properties("spring.main.web-application-type=none", "spring.http.client.factory=simple") - .run(); + .properties("spring.main.web-application-type=none", "spring.http.client.factory=simple") + .run(); ClientHttpRequestFactoryBuilder builder = context.getBean(ClientHttpRequestFactoryBuilder.class); assertThat(builder).isInstanceOf(SimpleClientHttpRequestFactoryBuilder.class); } From a4bc1dd151e2a18e4551d38887d4ebb9b5fbe607 Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Tue, 29 Apr 2025 15:09:29 +0200 Subject: [PATCH 4/4] Update copyright comment. Signed-off-by: Olga Maciaszek-Sharma --- .../server/mvc/GatewayServerMvcAutoConfigurationTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java index 0bf4edca2f..afaee7e445 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java @@ -1,5 +1,6 @@ /* - * Copyright 2013-2025 + * Copyright 2013-2025 the original author or authors. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at