blob: 496bf0dd3f6f3f9559c45fad5739cecf16082b93 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.servicecomb.core;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.configuration.Configuration;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.servicecomb.config.ConfigUtil;
import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import org.springframework.core.env.CompositePropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.env.SystemEnvironmentPropertySource;
import org.springframework.jndi.JndiPropertySource;
import com.netflix.config.ConfigurationManager;
import mockit.Deencapsulation;
public class TestConfigurationSpringInitializer {
@BeforeEach
public void beforeTest() {
Logger.getRootLogger().setLevel(Level.OFF);
ConfigUtil.clearExtraConfig();
ArchaiusUtils.resetConfig();
Logger.getRootLogger().setLevel(Level.INFO);
}
@AfterEach
public void afterTest() {
ConfigUtil.clearExtraConfig();
ArchaiusUtils.resetConfig();
}
@Test
public void testAll() {
ConfigurationSpringInitializer configurationSpringInitializer = new ConfigurationSpringInitializer();
ConfigUtil.installDynamicConfig();
Object o = ConfigUtil.getProperty("zq");
@SuppressWarnings("unchecked")
List<Map<String, Object>> listO = (List<Map<String, Object>>) o;
Assertions.assertEquals(3, listO.size());
Assertions.assertNull(ConfigUtil.getProperty("notExist"));
Configuration instance = ConfigurationManager.getConfigInstance();
ConfigUtil.installDynamicConfig();
// must not reinstall
Assertions.assertEquals(instance, ConfigurationManager.getConfigInstance());
}
@Test
public void testSetEnvironment() {
ConfigurableEnvironment environment = Mockito.mock(ConfigurableEnvironment.class);
MutablePropertySources propertySources = new MutablePropertySources();
Map<String, String> propertyMap = new HashMap<>();
final String map0Key0 = "map0-Key0";
final String map1Key0 = "map1-Key0";
final String map2Key0 = "map2-Key0";
final String map3Key0 = "map3-Key0";
propertyMap.put(map0Key0, "map0-Value0");
propertyMap.put(map1Key0, "map1-Value0");
propertyMap.put(map2Key0, "map2-Value0");
propertyMap.put(map3Key0, "map3-Value0");
/*
propertySources
|- compositePropertySource0
| |- mapPropertySource0
| | |- map0-Key0 = map0-Value0
| |- compositePropertySource1
| |- mapPropertySource1
| | |- map1-Key0 = map1-Value0
| |- mapPropertySource2
| |- map2-Key0 = map2-Value0
| |- JndiPropertySource(mocked)
|- mapPropertySource3
|- map3-Key0 = map3-Value0
*/
CompositePropertySource compositePropertySource0 = new CompositePropertySource("compositePropertySource0");
propertySources.addFirst(compositePropertySource0);
HashMap<String, Object> map0 = new HashMap<>();
map0.put(map0Key0, propertyMap.get(map0Key0));
MapPropertySource mapPropertySource0 = new MapPropertySource("mapPropertySource0", map0);
compositePropertySource0.addFirstPropertySource(mapPropertySource0);
CompositePropertySource compositePropertySource1 = new CompositePropertySource("compositePropertySource1");
compositePropertySource0.addPropertySource(compositePropertySource1);
HashMap<String, Object> map1 = new HashMap<>();
map1.put(map1Key0, propertyMap.get(map1Key0));
MapPropertySource mapPropertySource1 = new MapPropertySource("mapPropertySource1", map1);
compositePropertySource1.addPropertySource(mapPropertySource1);
HashMap<String, Object> map2 = new HashMap<>();
map2.put(map2Key0, propertyMap.get(map2Key0));
MapPropertySource mapPropertySource2 = new MapPropertySource("mapPropertySource2", map2);
compositePropertySource1.addPropertySource(mapPropertySource2);
compositePropertySource1.addPropertySource(Mockito.mock(JndiPropertySource.class));
HashMap<String, Object> map3 = new HashMap<>();
map3.put(map3Key0, propertyMap.get(map3Key0));
MapPropertySource mapPropertySource3 = new MapPropertySource("mapPropertySource3", map3);
compositePropertySource0.addPropertySource(mapPropertySource3);
Mockito.when(environment.getPropertySources()).thenReturn(propertySources);
Mockito.doAnswer((Answer<String>) invocation -> {
Object[] args = invocation.getArguments();
String propertyName = (String) args[0];
if ("spring.config.name".equals(propertyName) || "spring.application.name".equals(propertyName)) {
return null;
}
String value = propertyMap.get(propertyName);
if (null == value) {
Assertions.fail("get unexpected property name: " + propertyName);
}
return value;
}).when(environment).getProperty(ArgumentMatchers.anyString(), ArgumentMatchers.eq(Object.class));
new ConfigurationSpringInitializer().setEnvironment(environment);
Map<String, Map<String, Object>> extraLocalConfig = getExtraConfigMapFromConfigUtil();
Assertions.assertFalse(extraLocalConfig.isEmpty());
Map<String, Object> extraProperties = extraLocalConfig
.get(ConfigurationSpringInitializer.EXTRA_CONFIG_SOURCE_PREFIX + environment.getClass().getName() + "@"
+ environment.hashCode());
Assertions.assertNotNull(extraLocalConfig);
for (Entry<String, String> entry : propertyMap.entrySet()) {
Assertions.assertEquals(entry.getValue(), extraProperties.get(entry.getKey()));
}
}
@Test
public void testSetEnvironmentOnEnvironmentName() {
// get environment name from spring.config.name
ConfigurableEnvironment environment0 = Mockito.mock(ConfigurableEnvironment.class);
MutablePropertySources propertySources0 = new MutablePropertySources();
Mockito.when(environment0.getPropertySources()).thenReturn(propertySources0);
Map<String, Object> map0 = new HashMap<>(1);
map0.put("spring.config.name", "application");
propertySources0.addFirst(new MapPropertySource("mapPropertySource0", map0));
Mockito.when(environment0.getProperty("spring.config.name", Object.class)).thenReturn("application");
Mockito.when(environment0.getProperty("spring.config.name")).thenReturn("application");
// get environment name from spring.application.name
ConfigurableEnvironment environment1 = Mockito.mock(ConfigurableEnvironment.class);
MutablePropertySources propertySources1 = new MutablePropertySources();
Mockito.when(environment1.getPropertySources()).thenReturn(propertySources1);
Map<String, Object> map1 = new HashMap<>(1);
map1.put("spring.application.name", "bootstrap");
propertySources1.addFirst(new MapPropertySource("mapPropertySource1", map1));
Mockito.when(environment1.getProperty("spring.application.name", Object.class)).thenReturn("bootstrap");
Mockito.when(environment1.getProperty("spring.application.name")).thenReturn("bootstrap");
// get environment name from className+hashcode
ConfigurableEnvironment environment2 = Mockito.mock(ConfigurableEnvironment.class);
MutablePropertySources propertySources2 = new MutablePropertySources();
Mockito.when(environment2.getPropertySources()).thenReturn(propertySources2);
Map<String, Object> map2 = new HashMap<>(1);
map2.put("key2", "value2");
propertySources2.addFirst(new MapPropertySource("mapPropertySource2", map2));
Mockito.when(environment2.getProperty("key2", Object.class)).thenReturn("value2");
Mockito.when(environment2.getProperty("key2")).thenReturn("value2");
ConfigurationSpringInitializer configurationSpringInitializer = new ConfigurationSpringInitializer();
configurationSpringInitializer.setEnvironment(environment0);
configurationSpringInitializer.setEnvironment(environment1);
configurationSpringInitializer.setEnvironment(environment2);
Map<String, Map<String, Object>> extraConfig = getExtraConfigMapFromConfigUtil();
Assertions.assertEquals(3, extraConfig.size());
Map<String, Object> extraProperties = extraConfig
.get(ConfigurationSpringInitializer.EXTRA_CONFIG_SOURCE_PREFIX + "application");
Assertions.assertEquals(1, extraProperties.size());
Assertions.assertEquals("application", extraProperties.get("spring.config.name"));
extraProperties = extraConfig.get(ConfigurationSpringInitializer.EXTRA_CONFIG_SOURCE_PREFIX + "bootstrap");
Assertions.assertEquals(1, extraProperties.size());
Assertions.assertEquals("bootstrap", extraProperties.get("spring.application.name"));
extraProperties = extraConfig.get(
ConfigurationSpringInitializer.EXTRA_CONFIG_SOURCE_PREFIX + environment2.getClass().getName() + "@"
+ environment2.hashCode());
Assertions.assertEquals(1, extraProperties.size());
Assertions.assertEquals("value2", extraProperties.get("key2"));
}
@Test
public void should_throw_exception_when_given_ignoreResolveFailure_false() {
Assertions.assertThrows(RuntimeException.class, () -> {
StandardEnvironment environment = newStandardEnvironment();
ConfigurationSpringInitializer configurationSpringInitializer = new ConfigurationSpringInitializer();
configurationSpringInitializer.setEnvironment(environment);
});
}
private Map<String, Map<String, Object>> getExtraConfigMapFromConfigUtil() {
return Deencapsulation
.getField(ConfigUtil.class, "EXTRA_CONFIG_MAP");
}
private StandardEnvironment newStandardEnvironment() {
Map<String, Object> envProperties = new HashMap<>();
envProperties.put("IFS-X", "${IFS-X}");
PropertySource<Map<String, Object>> systemEnvironmentPropertySource = new SystemEnvironmentPropertySource("system-env", envProperties);
StandardEnvironment environment = new StandardEnvironment();
environment.getPropertySources()
.addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, systemEnvironmentPropertySource);
return environment;
}
}