Browse Source
This commit changes @SpringBootTest(randomPort = true) to generate a random port for the actuator endpoints if the management server runs on a different port from the main server. Closes gh-4424pull/14478/merge
4 changed files with 234 additions and 0 deletions
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
/* |
||||
* Copyright 2012-2018 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 |
||||
* |
||||
* http://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.boot.test.web; |
||||
|
||||
import java.util.Objects; |
||||
|
||||
import org.springframework.boot.SpringApplication; |
||||
import org.springframework.boot.env.EnvironmentPostProcessor; |
||||
import org.springframework.core.env.ConfigurableEnvironment; |
||||
import org.springframework.core.env.MapPropertySource; |
||||
import org.springframework.test.context.support.TestPropertySourceUtils; |
||||
|
||||
/** |
||||
* {@link EnvironmentPostProcessor} implementation to start the management context on a |
||||
* random port if the main server's port is 0 and the management context is expected on a |
||||
* different port. |
||||
* |
||||
* @author Madhura Bhave |
||||
* @since 2.1.0 |
||||
*/ |
||||
public class SpringBootTestRandomPortEnvironmentPostProcessor |
||||
implements EnvironmentPostProcessor { |
||||
|
||||
private static final String MANAGEMENT_PORT_PROPERTY = "management.server.port"; |
||||
|
||||
private static final String SERVER_PORT_PROPERTY = "server.port"; |
||||
|
||||
@Override |
||||
public void postProcessEnvironment(ConfigurableEnvironment environment, |
||||
SpringApplication application) { |
||||
MapPropertySource source = (MapPropertySource) environment.getPropertySources() |
||||
.get(TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME); |
||||
if (isTestServerPortRandom(source)) { |
||||
if (source.getProperty(MANAGEMENT_PORT_PROPERTY) == null) { |
||||
String managementPort = getPort(environment, MANAGEMENT_PORT_PROPERTY, |
||||
null); |
||||
String serverPort = getPort(environment, SERVER_PORT_PROPERTY, "8080"); |
||||
if (managementPort != null && !managementPort.equals("-1")) { |
||||
if (!managementPort.equals(serverPort)) { |
||||
source.getSource().put(MANAGEMENT_PORT_PROPERTY, "0"); |
||||
} |
||||
else { |
||||
source.getSource().put(MANAGEMENT_PORT_PROPERTY, ""); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
private boolean isTestServerPortRandom(MapPropertySource source) { |
||||
return (source != null && "0".equals(source.getProperty(SERVER_PORT_PROPERTY))); |
||||
} |
||||
|
||||
private String getPort(ConfigurableEnvironment environment, String property, |
||||
String defaultValue) { |
||||
return environment.getPropertySources().stream() |
||||
.filter((source) -> !source.getName().equals( |
||||
TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME)) |
||||
.map((source) -> (String) source.getProperty(property)) |
||||
.filter(Objects::nonNull).findFirst().orElse(defaultValue); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,149 @@
@@ -0,0 +1,149 @@
|
||||
/* |
||||
* Copyright 2012-2018 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 |
||||
* |
||||
* http://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.boot.test.web; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
|
||||
import org.springframework.core.env.MapPropertySource; |
||||
import org.springframework.core.env.MutablePropertySources; |
||||
import org.springframework.mock.env.MockEnvironment; |
||||
import org.springframework.test.context.support.TestPropertySourceUtils; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* Tests for {@link SpringBootTestRandomPortEnvironmentPostProcessor}. |
||||
* |
||||
* @author Madhura Bhave |
||||
*/ |
||||
public class SpringBootTestRandomPortEnvironmentPostProcessorTests { |
||||
|
||||
private SpringBootTestRandomPortEnvironmentPostProcessor postProcessor = new SpringBootTestRandomPortEnvironmentPostProcessor(); |
||||
|
||||
private MockEnvironment environment; |
||||
|
||||
private MutablePropertySources propertySources; |
||||
|
||||
@Before |
||||
public void setup() { |
||||
this.environment = new MockEnvironment(); |
||||
this.propertySources = this.environment.getPropertySources(); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenServerAndManagementPortIsZeroInTestPropertySource() { |
||||
addTestPropertySource("0", "0"); |
||||
this.environment.setProperty("management.server.port", "0"); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0"); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerAndTestManagementPortAreNonZero() { |
||||
addTestPropertySource("8080", "8081"); |
||||
this.environment.setProperty("server.port", "8080"); |
||||
this.environment.setProperty("management.server.port", "8081"); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("8080"); |
||||
assertThat(this.environment.getProperty("management.server.port")) |
||||
.isEqualTo("8081"); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndTestManagementPortIsNotNull() { |
||||
addTestPropertySource("0", "8080"); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")) |
||||
.isEqualTo("8080"); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndManagementPortIsNull() { |
||||
addTestPropertySource("0", null); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")) |
||||
.isEqualTo(null); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndManagementPortIsNotNullAndSameInProduction() { |
||||
addTestPropertySource("0", null); |
||||
Map<String, Object> other = new HashMap<>(); |
||||
other.put("server.port", "8081"); |
||||
other.put("management.server.port", "8081"); |
||||
MapPropertySource otherSource = new MapPropertySource("other", other); |
||||
this.propertySources.addLast(otherSource); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo(""); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndManagementPortIsNotNullAndDefaultSameInProduction() { |
||||
// mgmt port is 8080 which means its on the same port as main server since that is
|
||||
// null in app properties
|
||||
addTestPropertySource("0", null); |
||||
Map<String, Object> other = new HashMap<>(); |
||||
other.put("management.server.port", "8080"); |
||||
MapPropertySource otherSource = new MapPropertySource("other", other); |
||||
this.propertySources.addLast(otherSource); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo(""); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndManagementPortIsNotNullAndDifferentInProduction() { |
||||
addTestPropertySource("0", null); |
||||
Map<String, Object> other = new HashMap<>(); |
||||
other.put("management.server.port", "8081"); |
||||
MapPropertySource otherSource = new MapPropertySource("other", other); |
||||
this.propertySources.addLast(otherSource); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")).isEqualTo("0"); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenTestServerPortIsZeroAndManagementPortMinusOne() { |
||||
addTestPropertySource("0", null); |
||||
Map<String, Object> other = new HashMap<>(); |
||||
other.put("management.server.port", "-1"); |
||||
MapPropertySource otherSource = new MapPropertySource("other", other); |
||||
this.propertySources.addLast(otherSource); |
||||
this.postProcessor.postProcessEnvironment(this.environment, null); |
||||
assertThat(this.environment.getProperty("server.port")).isEqualTo("0"); |
||||
assertThat(this.environment.getProperty("management.server.port")) |
||||
.isEqualTo("-1"); |
||||
} |
||||
|
||||
private void addTestPropertySource(String serverPort, String managementPort) { |
||||
Map<String, Object> source = new HashMap<>(); |
||||
source.put("server.port", serverPort); |
||||
source.put("management.server.port", managementPort); |
||||
MapPropertySource inlineTestSource = new MapPropertySource( |
||||
TestPropertySourceUtils.INLINED_PROPERTIES_PROPERTY_SOURCE_NAME, source); |
||||
this.propertySources.addFirst(inlineTestSource); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue