You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/11/27 11:09:11 UTC
[incubator-dubbo] 02/06: Add UT for Configuration
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 <ke...@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