Prevent logging system from being pinged on context refresh

A context refresh is actually only trying to recalculate environment
properties. Spring Boot doesn't provide an explicit API for that so
we create a "mini application" to mimic the startup. There is no
need for the logging system to be touched at all, so we can try
and filter out the listeners we know might do that.

Fixes gh-260
This commit is contained in:
Dave Syer
2017-11-07 10:32:23 +00:00
parent 91f60b3f4c
commit 93a0365422
2 changed files with 77 additions and 5 deletions

View File

@@ -1,7 +1,5 @@
package org.springframework.cloud.context.refresh;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -11,7 +9,9 @@ import java.util.Map;
import org.junit.After;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.cloud.context.scope.refresh.RefreshScope;
@@ -22,6 +22,8 @@ import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import static org.assertj.core.api.Assertions.assertThat;
public class ContextRefresherTests {
private RefreshScope scope = Mockito.mock(RefreshScope.class);
@@ -32,6 +34,8 @@ public class ContextRefresherTests {
if (context != null) {
context.close();
}
System.clearProperty(LoggingSystem.SYSTEM_PROPERTY);
TestLoggingSystem.count = 0;
}
@Test
@@ -82,11 +86,33 @@ public class ContextRefresherTests {
EnvironmentTestUtils.addEnvironment(context,
"spring.cloud.bootstrap.sources: org.springframework.cloud.context.refresh.ContextRefresherTests.PropertySourceConfiguration\n"
+ "");
ConfigurableApplicationContext refresherContext = refresher.addConfigFilesToEnvironment();
assertThat(refresherContext.getParent()).isNotNull().isInstanceOf(ConfigurableApplicationContext.class);
ConfigurableApplicationContext parent = (ConfigurableApplicationContext) refresherContext.getParent();
ConfigurableApplicationContext refresherContext = refresher
.addConfigFilesToEnvironment();
assertThat(refresherContext.getParent()).isNotNull()
.isInstanceOf(ConfigurableApplicationContext.class);
ConfigurableApplicationContext parent = (ConfigurableApplicationContext) refresherContext
.getParent();
assertThat(parent.isActive()).isFalse();
}
@Test
public void loggingSystemNotInitialized() {
System.setProperty(LoggingSystem.SYSTEM_PROPERTY,
TestLoggingSystem.class.getName());
TestLoggingSystem system = (TestLoggingSystem) LoggingSystem
.get(getClass().getClassLoader());
assertThat(system.getCount()).isEqualTo(0);
try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class,
"--spring.main.webEnvironment=false", "--debug=false",
"--spring.main.bannerMode=OFF",
"--spring.cloud.bootstrap.name=refresh")) {
assertThat(system.getCount()).isEqualTo(4);
ContextRefresher refresher = new ContextRefresher(context, scope);
refresher.refresh();
assertThat(system.getCount()).isEqualTo(4);
}
}
private List<String> names(MutablePropertySources propertySources) {
List<String> list = new ArrayList<>();
for (PropertySource<?> p : propertySources) {
@@ -109,4 +135,26 @@ public class ContextRefresherTests {
}
@Configuration
protected static class Empty {
}
public static class TestLoggingSystem extends LoggingSystem {
private static int count;
public TestLoggingSystem(ClassLoader loader) {
}
public int getCount() {
return count;
}
@Override
public void beforeInitialize() {
count++;
}
}
}