Browse Source
Remove the mutable getEmbeddedServletContainers() Map from EmbeddedWebApplicationContext and instead use the `namespace` to distinguish the management container. The ServerPortInfoApplicationContextInitializer class replaces the previous TestExecutionListener to exposes port properties (by listening for EmbeddedServletContainerInitializedEvents).pull/718/head
7 changed files with 93 additions and 91 deletions
@ -1,53 +0,0 @@
@@ -1,53 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2014 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; |
||||
|
||||
import java.util.Map; |
||||
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer; |
||||
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.core.env.Environment; |
||||
import org.springframework.test.context.TestContext; |
||||
import org.springframework.test.context.support.AbstractTestExecutionListener; |
||||
|
||||
/** |
||||
* Listener that injects the server port into an {@link Environment} property named |
||||
* {@literal local.<server>.port}. Useful when the server is running on a dynamic |
||||
* port. |
||||
* |
||||
* @author Dave Syer |
||||
*/ |
||||
public class EmbeddedServletContainerTestExecutionListener extends |
||||
AbstractTestExecutionListener { |
||||
|
||||
@Override |
||||
public void prepareTestInstance(TestContext testContext) throws Exception { |
||||
ApplicationContext context = testContext.getApplicationContext(); |
||||
if (context instanceof EmbeddedWebApplicationContext) { |
||||
prepareTestInstance((EmbeddedWebApplicationContext) context); |
||||
} |
||||
} |
||||
|
||||
private void prepareTestInstance(EmbeddedWebApplicationContext context) { |
||||
for (Map.Entry<String, EmbeddedServletContainer> entry : context |
||||
.getEmbeddedServletContainers().entrySet()) { |
||||
EnvironmentTestUtils.addEnvironment(context, "local." + entry.getKey() |
||||
+ ".port:" + entry.getValue().getPort()); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
/* |
||||
* Copyright 2012-2014 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; |
||||
|
||||
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer; |
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; |
||||
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.ApplicationContextInitializer; |
||||
import org.springframework.context.ApplicationListener; |
||||
import org.springframework.context.ConfigurableApplicationContext; |
||||
import org.springframework.core.env.Environment; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* {@link ApplicationContextInitializer} that sets {@link Environment} properties for the |
||||
* ports that {@link EmbeddedServletContainer} servers are actually listening on. The |
||||
* property {@literal "local.server.port"} can be injected directly into tests using |
||||
* {@link Value @Value} or obtained via the {@link Environment}. |
||||
* <p> |
||||
* If the {@link EmbeddedWebApplicationContext} has a |
||||
* {@link EmbeddedWebApplicationContext#setNamespace(String) namespace} set, it will be |
||||
* used to construct the property name. For example, the "management" actuator context |
||||
* will have the property name {@literal "local.management.port"}. |
||||
* <p> |
||||
* Properties are automatically propagated up to any parent context. |
||||
* |
||||
* @author Dave Syer |
||||
* @author Phillip Webb |
||||
*/ |
||||
public class ServerPortInfoApplicationContextInitializer implements |
||||
ApplicationContextInitializer<ConfigurableApplicationContext> { |
||||
|
||||
@Override |
||||
public void initialize(ConfigurableApplicationContext applicationContext) { |
||||
applicationContext |
||||
.addApplicationListener(new ApplicationListener<EmbeddedServletContainerInitializedEvent>() { |
||||
@Override |
||||
public void onApplicationEvent( |
||||
EmbeddedServletContainerInitializedEvent event) { |
||||
ServerPortInfoApplicationContextInitializer.this |
||||
.onApplicationEvent(event); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { |
||||
String propertyName = getPropertyName(event.getApplicationContext()); |
||||
setPortProperty(event.getApplicationContext(), propertyName, event |
||||
.getEmbeddedServletContainer().getPort()); |
||||
} |
||||
|
||||
protected String getPropertyName(EmbeddedWebApplicationContext context) { |
||||
String name = context.getNamespace(); |
||||
if (StringUtils.isEmpty(name)) { |
||||
name = "server"; |
||||
} |
||||
return "local." + name + ".port"; |
||||
} |
||||
|
||||
private void setPortProperty(ApplicationContext context, String propertyName, int port) { |
||||
if (context instanceof ConfigurableApplicationContext) { |
||||
EnvironmentTestUtils.addEnvironment((ConfigurableApplicationContext) context, |
||||
propertyName + ":" + port); |
||||
} |
||||
if (context.getParent() != null) { |
||||
setPortProperty(context.getParent(), propertyName, port); |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue