From 954ae300b0fedac7207fa7ae0c34d5b53401f07a Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 6 Jun 2025 09:19:15 +0100 Subject: [PATCH] Stop relying on CloudFoundry in HealthEndpointAutoConfigurationTests Closes gh-45721 --- .../HealthEndpointAutoConfigurationTests.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java index 3a836c878bb..e6fd5710fc9 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/HealthEndpointAutoConfigurationTests.java @@ -24,6 +24,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.WithTestEndpointOutcomeExposureContributor; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration.HealthEndpointGroupMembershipValidator.NoSuchHealthContributorException; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointReactiveWebExtensionConfiguration.WebFluxAdditionalHealthEndpointPathsConfiguration; @@ -32,6 +33,7 @@ import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebEx import org.springframework.boot.actuate.endpoint.ApiVersion; import org.springframework.boot.actuate.endpoint.SecurityContext; import org.springframework.boot.actuate.endpoint.web.WebEndpointResponse; +import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; import org.springframework.boot.actuate.endpoint.web.WebServerNamespace; import org.springframework.boot.actuate.health.CompositeHealthContributor; import org.springframework.boot.actuate.health.DefaultHealthContributorRegistry; @@ -53,7 +55,9 @@ import org.springframework.boot.actuate.health.Status; import org.springframework.boot.actuate.health.StatusAggregator; import org.springframework.boot.actuate.health.SystemHealth; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener; import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration; +import org.springframework.boot.logging.LogLevel; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; @@ -343,42 +347,56 @@ class HealthEndpointAutoConfigurationTests { } @Test + @WithTestEndpointOutcomeExposureContributor void additionalHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() { this.contextRunner .withConfiguration(AutoConfigurations.of(DispatcherServletAutoConfiguration.class, EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class)) .withPropertyValues("management.endpoints.web.exposure.exclude=*", - "management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry") + "management.endpoints.test.exposure.include=*") .run((context) -> { - assertThat(context).hasSingleBean(MvcAdditionalHealthEndpointPathsConfiguration.class); assertThat(context).hasNotFailed(); + assertThat(context).hasSingleBean(HealthEndpoint.class); + assertThat(context).hasSingleBean(HealthEndpointWebExtension.class); + assertThat(context.getBean(WebEndpointsSupplier.class).getEndpoints()).isEmpty(); + assertThat(context).hasSingleBean(MvcAdditionalHealthEndpointPathsConfiguration.class); }); } @Test + @WithTestEndpointOutcomeExposureContributor void additionalJerseyHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() { this.contextRunner .withConfiguration( AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class)) - .withClassLoader(new FilteredClassLoader(DispatcherServlet.class)) + .withClassLoader( + new FilteredClassLoader(Thread.currentThread().getContextClassLoader(), DispatcherServlet.class)) + .withInitializer(ConditionEvaluationReportLoggingListener.forLogLevel(LogLevel.INFO)) .withPropertyValues("management.endpoints.web.exposure.exclude=*", - "management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry") + "management.endpoints.test.exposure.include=*") .run((context) -> { - assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class); assertThat(context).hasNotFailed(); + assertThat(context).hasSingleBean(HealthEndpoint.class); + assertThat(context).hasSingleBean(HealthEndpointWebExtension.class); + assertThat(context.getBean(WebEndpointsSupplier.class).getEndpoints()).isEmpty(); + assertThat(context).hasSingleBean(JerseyAdditionalHealthEndpointPathsConfiguration.class); }); } @Test + @WithTestEndpointOutcomeExposureContributor void additionalReactiveHealthEndpointsPathsTolerateHealthEndpointThatIsNotWebExposed() { this.reactiveContextRunner .withConfiguration( AutoConfigurations.of(EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class)) .withPropertyValues("management.endpoints.web.exposure.exclude=*", - "management.endpoints.cloudfoundry.exposure.include=*", "spring.main.cloud-platform=cloud_foundry") + "management.endpoints.test.exposure.include=*") .run((context) -> { - assertThat(context).hasSingleBean(WebFluxAdditionalHealthEndpointPathsConfiguration.class); assertThat(context).hasNotFailed(); + assertThat(context).hasSingleBean(HealthEndpoint.class); + assertThat(context).hasSingleBean(ReactiveHealthEndpointWebExtension.class); + assertThat(context.getBean(WebEndpointsSupplier.class).getEndpoints()).isEmpty(); + assertThat(context).hasSingleBean(WebFluxAdditionalHealthEndpointPathsConfiguration.class); }); } @@ -505,4 +523,9 @@ class HealthEndpointAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class UnconditionalHealthEndpointWebExtensionConfiguration extends HealthEndpointWebExtensionConfiguration { + + } + }