Skip to content

Commit ab80ba0

Browse files
committed
Move Cloud Foundry-specific health endpoint tests to separate class
This avoids relying on Cloud Foundry exposure logic in HealthEndpointAutoConfigurationTests. See gh-45721 Signed-off-by: Daeho Kwon <[email protected]>
1 parent e10c566 commit ab80ba0

File tree

2 files changed

+122
-45
lines changed

2 files changed

+122
-45
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.actuate.autoconfigure.health;
18+
19+
import org.junit.jupiter.api.Test;
20+
import reactor.core.publisher.Mono;
21+
22+
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
23+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
24+
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointReactiveWebExtensionConfiguration.WebFluxAdditionalHealthEndpointPathsConfiguration;
25+
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.JerseyAdditionalHealthEndpointPathsConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration;
27+
import org.springframework.boot.actuate.health.Health;
28+
import org.springframework.boot.actuate.health.HealthIndicator;
29+
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
30+
import org.springframework.boot.autoconfigure.AutoConfigurations;
31+
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
32+
import org.springframework.boot.test.context.FilteredClassLoader;
33+
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
34+
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.web.servlet.DispatcherServlet;
38+
39+
import static org.assertj.core.api.Assertions.assertThat;
40+
41+
/**
42+
* Tests for {@link HealthEndpointAutoConfiguration} when running in a Cloud Foundry environment.
43+
*
44+
* This class isolates Cloud Foundry-specific behavior to avoid coupling such concerns
45+
* with general auto-configuration tests.
46+
*
47+
* @author Daeho Kwon
48+
*/
49+
class CloudFoundryHealthEndpointConfigurationTests {
50+
51+
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
52+
.withUserConfiguration(HealthIndicatorsConfiguration.class)
53+
.withConfiguration(
54+
AutoConfigurations.of(HealthContributorAutoConfiguration.class, HealthEndpointAutoConfiguration.class));
55+
56+
private final ReactiveWebApplicationContextRunner reactiveContextRunner = new ReactiveWebApplicationContextRunner()
57+
.withUserConfiguration(HealthIndicatorsConfiguration.class)
58+
.withConfiguration(
59+
AutoConfigurations.of(HealthContributorAutoConfiguration.class, HealthEndpointAutoConfiguration.class,
60+
WebEndpointAutoConfiguration.class, EndpointAutoConfiguration.class));
61+
62+
63+
@Test
64+
void additionalHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
65+
this.contextRunner
66+
.withConfiguration(AutoConfigurations.of(DispatcherServletAutoConfiguration.class,
67+
EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
68+
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
69+
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
70+
.run((context) -> {
71+
assertThat(context).hasSingleBean(MvcAdditionalHealthEndpointPathsConfiguration.class);
72+
assertThat(context).hasNotFailed();
73+
});
74+
}
75+
76+
@Test
77+
void additionalJerseyHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
78+
this.contextRunner
79+
.withConfiguration(
80+
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
81+
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
82+
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
83+
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
84+
.run((context) -> {
85+
assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class);
86+
assertThat(context).hasNotFailed();
87+
});
88+
}
89+
90+
@Test
91+
void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
92+
this.reactiveContextRunner
93+
.withConfiguration(
94+
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
95+
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
96+
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
97+
.run((context) -> {
98+
assertThat(context).hasSingleBean(WebFluxAdditionalHealthEndpointPathsConfiguration.class);
99+
assertThat(context).hasNotFailed();
100+
});
101+
}
102+
103+
@Configuration(proxyBeanMethods = false)
104+
static class HealthIndicatorsConfiguration {
105+
106+
@Bean
107+
HealthIndicator simpleHealthIndicator() {
108+
return () -> Health.up().withDetail("counter", 42).build();
109+
}
110+
111+
@Bean
112+
HealthIndicator additionalHealthIndicator() {
113+
return () -> Health.up().build();
114+
}
115+
116+
@Bean
117+
ReactiveHealthIndicator reactiveHealthIndicator() {
118+
return () -> Mono.just(Health.up().build());
119+
}
120+
121+
}
122+
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@
2626
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
2727
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
2828
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration.HealthEndpointGroupMembershipValidator.NoSuchHealthContributorException;
29-
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointReactiveWebExtensionConfiguration.WebFluxAdditionalHealthEndpointPathsConfiguration;
30-
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.JerseyAdditionalHealthEndpointPathsConfiguration;
31-
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration.MvcAdditionalHealthEndpointPathsConfiguration;
3229
import org.springframework.boot.actuate.endpoint.ApiVersion;
3330
import org.springframework.boot.actuate.endpoint.SecurityContext;
3431
import org.springframework.boot.actuate.endpoint.web.WebEndpointResponse;
@@ -53,14 +50,12 @@
5350
import org.springframework.boot.actuate.health.StatusAggregator;
5451
import org.springframework.boot.actuate.health.SystemHealth;
5552
import org.springframework.boot.autoconfigure.AutoConfigurations;
56-
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
5753
import org.springframework.boot.test.context.FilteredClassLoader;
5854
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
5955
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
6056
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
6157
import org.springframework.context.annotation.Bean;
6258
import org.springframework.context.annotation.Configuration;
63-
import org.springframework.web.servlet.DispatcherServlet;
6459

6560
import static org.assertj.core.api.Assertions.assertThat;
6661
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -342,46 +337,6 @@ void runWithReactiveContextAndIndicatorsInParentContextFindsIndicators() {
342337
}));
343338
}
344339

345-
@Test
346-
void additionalHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
347-
this.contextRunner
348-
.withConfiguration(AutoConfigurations.of(DispatcherServletAutoConfiguration.class,
349-
EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
350-
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
351-
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
352-
.run((context) -> {
353-
assertThat(context).hasSingleBean(MvcAdditionalHealthEndpointPathsConfiguration.class);
354-
assertThat(context).hasNotFailed();
355-
});
356-
}
357-
358-
@Test
359-
void additionalJerseyHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
360-
this.contextRunner
361-
.withConfiguration(
362-
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
363-
.withClassLoader(new FilteredClassLoader(DispatcherServlet.class))
364-
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
365-
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
366-
.run((context) -> {
367-
assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class);
368-
assertThat(context).hasNotFailed();
369-
});
370-
}
371-
372-
@Test
373-
void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() {
374-
this.reactiveContextRunner
375-
.withConfiguration(
376-
AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class))
377-
.withPropertyValues("management.endpoints.web.exposure.exclude=*",
378-
"management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry")
379-
.run((context) -> {
380-
assertThat(context).hasSingleBean(WebFluxAdditionalHealthEndpointPathsConfiguration.class);
381-
assertThat(context).hasNotFailed();
382-
});
383-
}
384-
385340
@Configuration(proxyBeanMethods = false)
386341
static class HealthIndicatorsConfiguration {
387342

0 commit comments

Comments
 (0)