diff --git a/redisson/src/main/java/org/redisson/config/ConfigSupport.java b/redisson/src/main/java/org/redisson/config/ConfigSupport.java index 484fd38a5..b1304e551 100644 --- a/redisson/src/main/java/org/redisson/config/ConfigSupport.java +++ b/redisson/src/main/java/org/redisson/config/ConfigSupport.java @@ -61,7 +61,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; * */ public class ConfigSupport { - + @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class") @JsonFilter("classFilter") public static class ClassMixIn { @@ -136,13 +136,15 @@ public class ConfigSupport { } private String resolveEnvParams(String content) { - Pattern pattern = Pattern.compile("\\$\\{(\\w+)\\}"); + Pattern pattern = Pattern.compile("\\$\\{(\\w+(:-.+)?)\\}"); Matcher m = pattern.matcher(content); while (m.find()) { - String s = m.group(1); - String v = System.getenv(s); + String[] parts = m.group(1).split(":-"); + String v = System.getenv(parts[0]); if (v != null) { content = content.replace(m.group(), v); + } else if (parts.length == 2) { + content = content.replace(m.group(), parts[1]); } } return content; diff --git a/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java new file mode 100644 index 000000000..1a2aa8ac9 --- /dev/null +++ b/redisson/src/test/java/org/redisson/config/ConfigSupportTest.java @@ -0,0 +1,67 @@ +package org.redisson.config; + +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import mockit.Mock; +import mockit.MockUp; +import org.junit.Test; + +import java.io.IOException; +import java.net.URI; + +import static org.junit.Assert.*; + +public class ConfigSupportTest { + + @Test + public void testParsingLiteral() throws IOException { + mockHostEnv("1.1.1.1"); + SingleServerConfig config = mkConfig("127.0.0.1"); + + assertEquals(URI.create("redis://127.0.0.1"), config.getAddress()); + } + + @Test + public void testParsingEnv() throws IOException { + mockHostEnv("1.1.1.1"); + SingleServerConfig config = mkConfig("${REDIS_URI}"); + + assertEquals(URI.create("redis://1.1.1.1"), config.getAddress()); + } + + @Test(expected = InvalidFormatException.class) + public void testParsingEnv_envMissing() throws IOException { + mockHostEnv(null); + mkConfig("${REDIS_URI}"); + } + + @Test + public void testParsingDefault_envPresent() throws IOException { + mockHostEnv("11.0.0.1"); + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}"); + + assertEquals(URI.create("redis://11.0.0.1"), config.getAddress()); + } + + @Test + public void testParsingDefault_envMissing() throws IOException { + mockHostEnv(null); + SingleServerConfig config = mkConfig("${REDIS_URI:-10.0.0.1}"); + + assertEquals(URI.create("redis://10.0.0.1"), config.getAddress()); + } + + private SingleServerConfig mkConfig(String authorityValue) throws IOException { + String config = "singleServerConfig:\n address: redis://" + authorityValue; + return new ConfigSupport().fromYAML(config, Config.class).getSingleServerConfig(); + } + + private void mockHostEnv(String value) { + new MockUp() { + @Mock + String getenv(String name) { + return value; + } + }; + } + +}