package org.stagemonitor.configuration; import org.junit.Before; import org.junit.Test; import org.stagemonitor.configuration.source.ConfigurationSource; import org.stagemonitor.configuration.source.SimpleSource; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.regex.Pattern; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class ConfigurationOptionTest { private final ConfigurationOption<Map<Pattern,String>> invalidPatternMap = ConfigurationOption.regexMapOption().key("invalidPatternMap").build(); private final ConfigurationOption<Collection<Pattern>> invalidPatternSyntax = ConfigurationOption.regexListOption().key("invalidPatternSyntax").build(); private final ConfigurationOption<Long> aLong = ConfigurationOption.longOption().key("long").build(); private final ConfigurationOption<Long> invalidLong = ConfigurationOption.longOption().key("invalidLong").defaultValue(2L).build(); private final ConfigurationOption<String> string = ConfigurationOption.stringOption().key("string").buildRequired(); private final ConfigurationOption<Collection<String>> lowerStrings = ConfigurationOption.lowerStringsOption().key("lowerStrings").build(); private final ConfigurationOption<Collection<String>> strings = ConfigurationOption.stringsOption().key("strings").build(); private final ConfigurationOption<Boolean> booleanTrue = ConfigurationOption.booleanOption().key("boolean.true").build(); private final ConfigurationOption<Boolean> booleanFalse = ConfigurationOption.booleanOption().key("boolean.false").build(); private final ConfigurationOption<Boolean> booleanInvalid = ConfigurationOption.booleanOption().key("boolean.invalid").build(); private final ConfigurationOption<String> testCaching = ConfigurationOption.stringOption().key("testCaching").build(); private final ConfigurationOption<String> testUpdate = ConfigurationOption.stringOption().key("testUpdate").dynamic(true).build(); private final ConfigurationOption<Optional<String>> testOptionalWithValue = ConfigurationOption.stringOption().key("testOptionalWithValue").dynamic(true).buildOptional(); private final ConfigurationOption<Optional<String>> testOptionalWithoutValue = ConfigurationOption.stringOption().key("testOptionalWithoutValue").dynamic(true).buildOptional(); ConfigurationOption<String> testAlternateKeys = ConfigurationOption.stringOption() .key("primaryKey") .aliasKeys("alternateKey1", "alternateKey2") .dynamic(true) .build(); private ConfigurationRegistry configuration; private SimpleSource configSource = SimpleSource .forTest("invalidLong", "two") .add("stagemonitor.elasticsearch.url", "foo/") .add("invalidPatternMap", "(.*).js: *.js (.*).css: *.css") .add("invalidPatternSyntax", "(.*.js") .add("long", "2") .add("string", "fooBar") .add("lowerStrings", "fooBar") .add("strings", "fooBar , barFoo") .add("boolean.true", "true") .add("boolean.false", "false") .add("boolean.invalid", "ture") .add("testCaching", "testCaching") .add("testOptionalWithValue", "present"); @Before public void before() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { configuration = createConfiguration(Arrays.asList(invalidPatternMap, invalidPatternSyntax, aLong, invalidLong, string, lowerStrings, strings, booleanTrue, booleanFalse, booleanInvalid, testCaching, testUpdate, testOptionalWithValue, testOptionalWithoutValue), configSource); } private ConfigurationRegistry createConfiguration(List<ConfigurationOption<?>> configurationOptions, ConfigurationSource configurationSource) { final List<ConfigurationOptionProvider> configurationOptionProviders = Collections.singletonList(new ConfigurationOptionProvider() { public List<ConfigurationOption<?>> getConfigurationOptions() { return configurationOptions; } }); return new ConfigurationRegistry(configurationOptionProviders, Collections.singletonList(configurationSource), null); } @Test public void testInvalidPatterns() { assertTrue(invalidPatternMap.getValue().isEmpty()); } @Test public void testInvalidPatternSyntax() { assertTrue(invalidPatternSyntax.getValue().isEmpty()); } @Test public void testGetInt() { assertEquals(Long.valueOf(2L), aLong.getValue()); } @Test public void testGetInvalidLong() { assertEquals(Long.valueOf(2L), invalidLong.getValue()); } @Test public void testGetString() { assertEquals("fooBar", string.getValue()); } @Test public void testGetLowerStrings() { assertEquals(Collections.singleton("foobar"), lowerStrings.getValue()); } @Test public void testCachingAndReload() { assertEquals("testCaching", testCaching.getValue()); configSource.add("testCaching", "testCaching2"); assertEquals("testCaching", testCaching.getValue()); configuration.reloadDynamicConfigurationOptions(); assertEquals("testCaching", testCaching.getValue()); configuration.reloadAllConfigurationOptions(); assertEquals("testCaching2", testCaching.getValue()); } @Test public void testGetBoolean() { assertTrue(booleanTrue.getValue()); assertFalse(booleanFalse.getValue()); } @Test public void testUpdate() throws IOException { assertNull(testUpdate.getValue()); testUpdate.update("updated!", "Test Configuration Source"); assertEquals("updated!", testUpdate.getValue()); } @Test public void testAlternateKeysPrimary() { final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(testAlternateKeys), SimpleSource.forTest("primaryKey", "foo")); assertEquals("foo", configuration.getConfigurationOptionByKey("primaryKey").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey1").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey2").getValueAsString()); } @Test public void testAlternateKeysAlternate() { final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(testAlternateKeys), SimpleSource.forTest("alternateKey1", "foo")); assertEquals("foo", configuration.getConfigurationOptionByKey("primaryKey").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey1").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey2").getValueAsString()); } @Test public void testAlternateKeysPrimaryAndAlternate() { final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(testAlternateKeys), SimpleSource.forTest("primaryKey", "foo").add("alternateKey1", "bar")); assertEquals("foo", configuration.getConfigurationOptionByKey("primaryKey").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey1").getValueAsString()); assertEquals("foo", configuration.getConfigurationOptionByKey("alternateKey2").getValueAsString()); } @Test(expected = IllegalArgumentException.class) public void testDuplicateAlternateKeys() { createConfiguration(Arrays.asList( ConfigurationOption.stringOption().key("primaryKey1").aliasKeys("alternateKey1").build(), ConfigurationOption.stringOption().key("primaryKey2").aliasKeys("alternateKey1").build() ), new SimpleSource()); } @Test public void testOptional() { assertEquals("present", testOptionalWithValue.getValue().get()); assertTrue(testOptionalWithValue.getValue().isPresent()); assertFalse(testOptionalWithoutValue.getValue().isPresent()); } @Test(expected = IllegalArgumentException.class) public void testDefaultValueNull() { ConfigurationOption.stringOption().key("foo").buildWithDefault(null); } }