This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch dev-metadata in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
commit b9ce4a490c642c15f70ee4f19c00af8ef1423c40 Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Sat Nov 24 15:21:50 2018 +0800 Add UT for Configuration --- .../apache/dubbo/common/config/Environment.java | 18 +- .../dubbo/common/config/InmemoryConfiguration.java | 13 +- .../org/apache/dubbo/common/utils/ConfigUtils.java | 15 +- .../org/apache/dubbo/config/AbstractConfig.java | 5 +- .../org/apache/dubbo/config/ApplicationConfig.java | 2 +- .../apache/dubbo/config/ConfigCenterConfig.java | 49 ++--- .../org/apache/dubbo/config/support/Parameter.java | 2 +- .../apache/dubbo/config/AbstractConfigTest.java | 241 +++++++++++++++++++++ .../apache/dubbo/config/RegistryConfigTest.java | 1 + .../src/test/resources/dubbo.properties | 2 + 10 files changed, 312 insertions(+), 36 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java index bc58ec9..11aabd5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java @@ -61,7 +61,7 @@ public class Environment { public InmemoryConfiguration getExternalConfig(String prefix, String id) { return externalConfigs.computeIfAbsent(toKey(prefix, id), k -> { InmemoryConfiguration configuration = new InmemoryConfiguration(prefix, id); - configuration.addProperties(externalConfigurationMap); + configuration.setProperties(externalConfigurationMap); return configuration; }); } @@ -69,7 +69,7 @@ public class Environment { public InmemoryConfiguration getAppExternalConfig(String prefix, String id) { return appExternalConfigs.computeIfAbsent(toKey(prefix, id), k -> { InmemoryConfiguration configuration = new InmemoryConfiguration(prefix, id); - configuration.addProperties(appExternalConfigurationMap); + configuration.setProperties(appExternalConfigurationMap); return configuration; }); } @@ -82,11 +82,11 @@ public class Environment { return appConfigs.get(toKey(prefix, id)); } - public synchronized void setExternalConfig(Map<String, String> externalConfiguration) { + public void setExternalConfig(Map<String, String> externalConfiguration) { this.externalConfigurationMap = externalConfiguration; } - public synchronized void setAppExternalConfig(Map<String, String> appExternalConfiguration) { + public void setAppExternalConfig(Map<String, String> appExternalConfiguration) { this.appExternalConfigurationMap = appExternalConfiguration; } @@ -168,4 +168,14 @@ public class Environment { public void setDynamicConfiguration(Configuration dynamicConfiguration) { this.dynamicConfiguration = dynamicConfiguration; } + + // For test + public void clearExternalConfigs() { + this.externalConfigs.clear(); + } + + // For test + public void clearAppExternalConfigs() { + this.appExternalConfigs.clear(); + } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java index b4a9c48..76b6062 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java @@ -51,6 +51,17 @@ public class InmemoryConfiguration extends AbstractPrefixConfiguration { * Add a set of properties into the store */ public void addProperties(Map<String, String> properties) { - store.putAll(properties); + if (properties != null) { + this.store.putAll(properties); + } + } + + /** + * set store + */ + public void setProperties(Map<String, String> properties) { + if (properties != null) { + this.store = properties; + } } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java index fbab5ea..a67c8f5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConfigUtils.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.lang.management.ManagementFactory; @@ -218,7 +219,7 @@ public class ConfigUtils { public static Properties loadProperties(String fileName, boolean allowMultiFile, boolean optional) { Properties properties = new Properties(); // add scene judgement in windows environment Fix 2557 - if (fileName.startsWith("/") || fileName.matches("^[A-z]:\\\\\\S+$")) { + if (checkFileNameExist(fileName)) { try { FileInputStream input = new FileInputStream(fileName); try { @@ -292,6 +293,18 @@ public class ConfigUtils { return properties; } + /** + * check if the fileName can be found in filesystem + * + * @param fileName + * @return + */ + private static boolean checkFileNameExist(String fileName) { + File file = new File(fileName); + return file.exists(); + } + + public static int getPid() { if (PID < 0) { try { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java index 8dfe27e..d9b7da4 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -406,6 +406,7 @@ public abstract class AbstractConfig implements Serializable { * // FIXME: this method should be completely replaced by appendParameters * @see AbstractConfig#appendParameters(Map, Object, String) * + * Notice! This method should include all properties in the returning map, treat @Parameter differently compared to appendParameters. * @return */ public Map<String, String> getMetaData() { @@ -423,7 +424,7 @@ public abstract class AbstractConfig implements Serializable { String prop = calculatePropertyFromGetter(name); String key; Parameter parameter = method.getAnnotation(Parameter.class); - if (parameter != null && parameter.key().length() > 0 && parameter.propertyKey()) { + if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) { key = parameter.key(); } else { key = prop; @@ -532,7 +533,7 @@ public abstract class AbstractConfig implements Serializable { getter = clazz.getMethod("is" + propertyName); } Parameter parameter = getter.getAnnotation(Parameter.class); - if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.propertyKey()) { + if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.useKeyAsProperty()) { propertyName = parameter.key(); } else { propertyName = propertyName.toLowerCase(); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java index d14d78e..a8404a4 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java @@ -95,7 +95,7 @@ public class ApplicationConfig extends AbstractConfig { setName(name); } - @Parameter(key = Constants.APPLICATION_KEY, required = true, propertyKey = false) + @Parameter(key = Constants.APPLICATION_KEY, required = true, useKeyAsProperty = false) public String getName() { return name; } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java index 1cb5a00..4c699f9 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java @@ -57,36 +57,11 @@ public class ConfigCenterConfig extends AbstractConfig { // customized parameters private Map<String, String> parameters; -// private RegistryConfig registry; - public ConfigCenterConfig() { } public void init() { - DynamicConfiguration dynamicConfiguration = startDynamicConfiguration(); - String configContent = dynamicConfiguration.getConfig(configfile, group); - - String appGroup = getApplicationName(); - String appConfigContent = null; - if (StringUtils.isNotEmpty(appGroup)) { - appConfigContent = dynamicConfiguration.getConfig - ( - StringUtils.isNotEmpty(localconfigfile) ? localconfigfile : configfile, - appGroup - ); - } - try { - Environment.getInstance().setConfigCenterFirst(priority); - Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent)); - Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent)); - } catch (IOException e) { - throw new IllegalStateException("Failed to parse configurations from Config Center.", e); - } - } - - private DynamicConfiguration startDynamicConfiguration() { // give jvm properties the chance to override local configs, e.g., -Ddubbo.configcenter.config.priority - refresh(); // try to use registryConfig as the default configcenter, only applies to zookeeper. if (!isValid() && registry != null && registry.isZookeeperProtocol()) { @@ -95,8 +70,30 @@ public class ConfigCenterConfig extends AbstractConfig { } // checkConfigCenter(); - URL url = toConfigUrl(); + if (isValid()) { + DynamicConfiguration dynamicConfiguration = startDynamicConfiguration(toConfigUrl()); + String configContent = dynamicConfiguration.getConfig(configfile, group); + + String appGroup = getApplicationName(); + String appConfigContent = null; + if (StringUtils.isNotEmpty(appGroup)) { + appConfigContent = dynamicConfiguration.getConfig + ( + StringUtils.isNotEmpty(localconfigfile) ? localconfigfile : configfile, + appGroup + ); + } + try { + Environment.getInstance().setConfigCenterFirst(priority); + Environment.getInstance().updateExternalConfigurationMap(parseProperties(configContent)); + Environment.getInstance().updateAppExternalConfigurationMap(parseProperties(appConfigContent)); + } catch (IOException e) { + throw new IllegalStateException("Failed to parse configurations from Config Center.", e); + } + } + } + private DynamicConfiguration startDynamicConfiguration(URL url) { DynamicConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(DynamicConfiguration.class).getExtension(url.getProtocol()); // TODO, maybe we need a factory to do this? dynamicConfiguration.initWith(url); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java index 56336aa..029a491 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/support/Parameter.java @@ -42,6 +42,6 @@ public @interface Parameter { boolean append() default false; - boolean propertyKey() default true; + boolean useKeyAsProperty() default true; } \ No newline at end of file diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java index 959780c..e407864 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java @@ -17,9 +17,11 @@ package org.apache.dubbo.config; import junit.framework.TestCase; +import org.apache.dubbo.common.config.Environment; import org.apache.dubbo.config.api.Greeting; import org.apache.dubbo.config.support.Parameter; import org.hamcrest.Matchers; +import org.junit.Assert; import org.junit.Test; import java.lang.annotation.ElementType; @@ -273,6 +275,245 @@ public class AbstractConfigTest { assertThat(annotationConfig.toString(), Matchers.containsString("listener=\"l1, l2\" ")); } + @Test + public void testRefreshAll() { + try { + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + overrideConfig.setExclude("override-config"); + + Map<String, String> external = new HashMap<>(); + external.put("dubbo.override.address", "external://127.0.0.1:2181"); + // @Parameter(exclude=true) + external.put("dubbo.override.exclude", "external"); + // @Parameter(key="key1", useKeyAsProperty=false) + external.put("dubbo.override.key", "external"); + // @Parameter(key="key2", useKeyAsProperty=true) + external.put("dubbo.override.key2", "external"); + Environment.getInstance().setExternalConfig(external); + + System.setProperty("dubbo.override.address", "system://127.0.0.1:2181"); + System.setProperty("dubbo.override.protocol", "system"); + // this will not override, use 'key' instread, @Parameter(key="key1", useKeyAsProperty=false) + System.setProperty("dubbo.override.key1", "system"); + System.setProperty("dubbo.override.key2", "system"); + + // Load configuration from system properties -> externalConfiguration -> RegistryConfig -> dubbo.properties + overrideConfig.refresh(); + + Assert.assertEquals("system://127.0.0.1:2181", overrideConfig.getAddress()); + Assert.assertEquals("system", overrideConfig.getProtocol()); + Assert.assertEquals("override-config://", overrideConfig.getEscape()); + Assert.assertEquals("external", overrideConfig.getKey()); + Assert.assertEquals("system", overrideConfig.getUseKeyAsProperty()); + } finally { + System.clearProperty("dubbo.override.address"); + System.clearProperty("dubbo.override.protocol"); + System.clearProperty("dubbo.override.key1"); + System.clearProperty("dubbo.override.key2"); + Environment.getInstance().clearExternalConfigs(); + } + } + + @Test + public void testRefreshSystem() { + try { + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + overrideConfig.setExclude("override-config"); + + System.setProperty("dubbo.override.address", "system://127.0.0.1:2181"); + System.setProperty("dubbo.override.protocol", "system"); + System.setProperty("dubbo.override.key", "system"); + + overrideConfig.refresh(); + + Assert.assertEquals("system://127.0.0.1:2181", overrideConfig.getAddress()); + Assert.assertEquals("system", overrideConfig.getProtocol()); + Assert.assertEquals("override-config://", overrideConfig.getEscape()); + Assert.assertEquals("system", overrideConfig.getKey()); + } finally { + System.clearProperty("dubbo.override.address"); + System.clearProperty("dubbo.override.protocol"); + System.clearProperty("dubbo.override.key1"); + Environment.getInstance().clearExternalConfigs(); + } + } + + @Test + public void testRefreshProperties() { + try { + Environment.getInstance().setExternalConfig(new HashMap<>()); + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + + overrideConfig.refresh(); + + Assert.assertEquals("override-config://127.0.0.1:2181", overrideConfig.getAddress()); + Assert.assertEquals("override-config", overrideConfig.getProtocol()); + Assert.assertEquals("override-config://", overrideConfig.getEscape()); + Assert.assertEquals("properties", overrideConfig.getUseKeyAsProperty()); + } finally { + Environment.getInstance().clearExternalConfigs(); + } + } + + @Test + public void testRefreshExternal() { + try { + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + overrideConfig.setExclude("override-config"); + + Map<String, String> external = new HashMap<>(); + external.put("dubbo.override.address", "external://127.0.0.1:2181"); + external.put("dubbo.override.protocol", "external"); + external.put("dubbo.override.escape", "external://"); + // @Parameter(exclude=true) + external.put("dubbo.override.exclude", "external"); + // @Parameter(key="key1", useKeyAsProperty=false) + external.put("dubbo.override.key", "external"); + // @Parameter(key="key2", useKeyAsProperty=true) + external.put("dubbo.override.key2", "external"); + Environment.getInstance().setExternalConfig(external); + + overrideConfig.refresh(); + + Assert.assertEquals("external://127.0.0.1:2181", overrideConfig.getAddress()); + Assert.assertEquals("external", overrideConfig.getProtocol()); + Assert.assertEquals("external://", overrideConfig.getEscape()); + Assert.assertEquals("external", overrideConfig.getExclude()); + Assert.assertEquals("external", overrideConfig.getKey()); + Assert.assertEquals("external", overrideConfig.getUseKeyAsProperty()); + } finally { + Environment.getInstance().clearExternalConfigs(); + } + } + + @Test + public void testRefreshId() { + try { + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setId("override-id"); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + overrideConfig.setExclude("override-config"); + + Map<String, String> external = new HashMap<>(); + external.put("dubbo.override.override-id.address", "external-override-id://127.0.0.1:2181"); + external.put("dubbo.override.address", "external://127.0.0.1:2181"); + // @Parameter(exclude=true) + external.put("dubbo.override.exclude", "external"); + // @Parameter(key="key1", useKeyAsProperty=false) + external.put("dubbo.override.key", "external"); + // @Parameter(key="key2", useKeyAsProperty=true) + external.put("dubbo.override.key2", "external"); + Environment.getInstance().setExternalConfig(external); + + ConfigCenterConfig configCenter = new ConfigCenterConfig(); + configCenter.init(); + + // Load configuration from system properties -> externalConfiguration -> RegistryConfig -> dubbo.properties + overrideConfig.refresh(); + + Assert.assertEquals("external-override-id://127.0.0.1:2181", overrideConfig.getAddress()); + Assert.assertEquals("override-config", overrideConfig.getProtocol()); + Assert.assertEquals("override-config://", overrideConfig.getEscape()); + Assert.assertEquals("external", overrideConfig.getKey()); + Assert.assertEquals("external", overrideConfig.getUseKeyAsProperty()); + } finally { + Environment.getInstance().clearExternalConfigs(); + } + } + + @Test + public void tetMetaData() { + OverrideConfig overrideConfig = new OverrideConfig(); + overrideConfig.setId("override-id"); + overrideConfig.setAddress("override-config://127.0.0.1:2181"); + overrideConfig.setProtocol("override-config"); + overrideConfig.setEscape("override-config://"); + overrideConfig.setExclude("override-config"); + + Map<String, String> metaData = overrideConfig.getMetaData(); + Assert.assertEquals("override-config://127.0.0.1:2181", metaData.get("address")); + Assert.assertEquals("override-config", metaData.get("protocol")); + Assert.assertEquals("override-config://", metaData.get("escape")); + Assert.assertEquals("override-config", metaData.get("exclude")); + Assert.assertNull(metaData.get("key")); + Assert.assertNull(metaData.get("key2")); + } + + private static class OverrideConfig extends AbstractConfig { + public String address; + public String protocol; + public String exclude; + public String key; + public String useKeyAsProperty; + public String escape; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getProtocol() { + return protocol; + } + + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + @Parameter(excluded = true) + public String getExclude() { + return exclude; + } + + public void setExclude(String exclude) { + this.exclude = exclude; + } + + @Parameter(key = "key1", useKeyAsProperty = false) + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + @Parameter(key = "key2", useKeyAsProperty = true) + public String getUseKeyAsProperty() { + return useKeyAsProperty; + } + + public void setUseKeyAsProperty(String useKeyAsProperty) { + this.useKeyAsProperty = useKeyAsProperty; + } + + @Parameter(escaped = true) + public String getEscape() { + return escape; + } + + public void setEscape(String escape) { + this.escape = escape; + } + } + private static class PropertiesConfig extends AbstractConfig { private char c; private boolean bool; diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java index 75c99b1..2210847 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java @@ -175,4 +175,5 @@ public class RegistryConfigTest { registry.setDefault(true); assertThat(registry.isDefault(), is(true)); } + } diff --git a/dubbo-config/dubbo-config-api/src/test/resources/dubbo.properties b/dubbo-config/dubbo-config-api/src/test/resources/dubbo.properties new file mode 100644 index 0000000..fb4bee8 --- /dev/null +++ b/dubbo-config/dubbo-config-api/src/test/resources/dubbo.properties @@ -0,0 +1,2 @@ +dubbo.override.key2=properties +dubbo.override.protocol=properties \ No newline at end of file