/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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.elasticsearch.common.settings; import org.elasticsearch.common.settings.bar.BarTestClass; import org.elasticsearch.common.settings.foo.FooTestClass; import org.elasticsearch.common.settings.loader.YamlSettingsLoader; import org.elasticsearch.test.ESTestCase; import org.hamcrest.Matchers; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.hamcrest.Matchers.*; /** */ public class SettingsTests extends ESTestCase { @Test public void testCamelCaseSupport() { Settings settings = settingsBuilder() .put("test.camelCase", "bar") .build(); assertThat(settings.get("test.camelCase"), equalTo("bar")); assertThat(settings.get("test.camel_case"), equalTo("bar")); } @Test public void testLoadFromDelimitedString() { Settings settings = settingsBuilder() .loadFromDelimitedString("key1=value1;key2=value2", ';') .build(); assertThat(settings.get("key1"), equalTo("value1")); assertThat(settings.get("key2"), equalTo("value2")); assertThat(settings.getAsMap().size(), equalTo(2)); assertThat(settings.toDelimitedString(';'), equalTo("key1=value1;key2=value2;")); settings = settingsBuilder() .loadFromDelimitedString("key1=value1;key2=value2;", ';') .build(); assertThat(settings.get("key1"), equalTo("value1")); assertThat(settings.get("key2"), equalTo("value2")); assertThat(settings.getAsMap().size(), equalTo(2)); assertThat(settings.toDelimitedString(';'), equalTo("key1=value1;key2=value2;")); } @Test public void testReplacePropertiesPlaceholderSystemProperty() { System.setProperty("sysProp1", "sysVal1"); try { Settings settings = settingsBuilder() .put("setting1", "${sysProp1}") .replacePropertyPlaceholders() .build(); assertThat(settings.get("setting1"), equalTo("sysVal1")); } finally { System.clearProperty("sysProp1"); } Settings settings = settingsBuilder() .put("setting1", "${sysProp1:defaultVal1}") .replacePropertyPlaceholders() .build(); assertThat(settings.get("setting1"), equalTo("defaultVal1")); settings = settingsBuilder() .put("setting1", "${sysProp1:}") .replacePropertyPlaceholders() .build(); assertThat(settings.get("setting1"), is(nullValue())); } @Test public void testReplacePropertiesPlaceholderIgnoreEnvUnset() { Settings settings = settingsBuilder() .put("setting1", "${env.UNSET_ENV_VAR}") .replacePropertyPlaceholders() .build(); assertThat(settings.get("setting1"), is(nullValue())); } @Test public void testReplacePropertiesPlaceholderIgnoresPrompt() { Settings settings = settingsBuilder() .put("setting1", "${prompt.text}") .put("setting2", "${prompt.secret}") .replacePropertyPlaceholders() .build(); assertThat(settings.get("setting1"), is("${prompt.text}")); assertThat(settings.get("setting2"), is("${prompt.secret}")); } @Test public void testUnFlattenedSettings() { Settings settings = settingsBuilder() .put("foo", "abc") .put("bar", "def") .put("baz.foo", "ghi") .put("baz.bar", "jkl") .putArray("baz.arr", "a", "b", "c") .build(); Map<String, Object> map = settings.getAsStructuredMap(); assertThat(map.keySet(), Matchers.<String>hasSize(3)); assertThat(map, allOf( Matchers.<String, Object>hasEntry("foo", "abc"), Matchers.<String, Object>hasEntry("bar", "def"))); @SuppressWarnings("unchecked") Map<String, Object> bazMap = (Map<String, Object>) map.get("baz"); assertThat(bazMap.keySet(), Matchers.<String>hasSize(3)); assertThat(bazMap, allOf( Matchers.<String, Object>hasEntry("foo", "ghi"), Matchers.<String, Object>hasEntry("bar", "jkl"))); @SuppressWarnings("unchecked") List<String> bazArr = (List<String>) bazMap.get("arr"); assertThat(bazArr, contains("a", "b", "c")); } @Test public void testFallbackToFlattenedSettings() { Settings settings = settingsBuilder() .put("foo", "abc") .put("foo.bar", "def") .put("foo.baz", "ghi").build(); Map<String, Object> map = settings.getAsStructuredMap(); assertThat(map.keySet(), Matchers.<String>hasSize(3)); assertThat(map, allOf( Matchers.<String, Object>hasEntry("foo", "abc"), Matchers.<String, Object>hasEntry("foo.bar", "def"), Matchers.<String, Object>hasEntry("foo.baz", "ghi"))); settings = settingsBuilder() .put("foo.bar", "def") .put("foo", "abc") .put("foo.baz", "ghi") .build(); map = settings.getAsStructuredMap(); assertThat(map.keySet(), Matchers.<String>hasSize(3)); assertThat(map, allOf( Matchers.<String, Object>hasEntry("foo", "abc"), Matchers.<String, Object>hasEntry("foo.bar", "def"), Matchers.<String, Object>hasEntry("foo.baz", "ghi"))); } @Test public void testGetAsSettings() { Settings settings = settingsBuilder() .put("foo", "abc") .put("foo.bar", "def") .put("foo.baz", "ghi").build(); Settings fooSettings = settings.getAsSettings("foo"); assertThat(fooSettings.get("bar"), equalTo("def")); assertThat(fooSettings.get("baz"), equalTo("ghi")); } @Test public void testNames() { Settings settings = settingsBuilder() .put("bar", "baz") .put("foo", "abc") .put("foo.bar", "def") .put("foo.baz", "ghi").build(); Set<String> names = settings.names(); assertThat(names.size(), equalTo(2)); assertTrue(names.contains("bar")); assertTrue(names.contains("foo")); Settings fooSettings = settings.getAsSettings("foo"); names = fooSettings.names(); assertThat(names.size(), equalTo(2)); assertTrue(names.contains("bar")); assertTrue(names.contains("baz")); } @Test public void testThatArraysAreOverriddenCorrectly() throws IOException { // overriding a single value with an array Settings settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1").build()) .put(settingsBuilder().putArray("value", "2", "3").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("2", "3")); settings = settingsBuilder() .put(settingsBuilder().put("value", "1").build()) .put(settingsBuilder().putArray("value", "2", "3").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("2", "3")); settings = settingsBuilder() .put(new YamlSettingsLoader().load("value: 1")) .put(new YamlSettingsLoader().load("value: [ 2, 3 ]")) .build(); assertThat(settings.getAsArray("value"), arrayContaining("2", "3")); settings = settingsBuilder() .put(settingsBuilder().put("value.with.deep.key", "1").build()) .put(settingsBuilder().putArray("value.with.deep.key", "2", "3").build()) .build(); assertThat(settings.getAsArray("value.with.deep.key"), arrayContaining("2", "3")); // overriding an array with a shorter array settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1", "2").build()) .put(settingsBuilder().putArray("value", "3").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("3")); settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1", "2", "3").build()) .put(settingsBuilder().putArray("value", "4", "5").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("4", "5")); settings = settingsBuilder() .put(settingsBuilder().putArray("value.deep.key", "1", "2", "3").build()) .put(settingsBuilder().putArray("value.deep.key", "4", "5").build()) .build(); assertThat(settings.getAsArray("value.deep.key"), arrayContaining("4", "5")); // overriding an array with a longer array settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1", "2").build()) .put(settingsBuilder().putArray("value", "3", "4", "5").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("3", "4", "5")); settings = settingsBuilder() .put(settingsBuilder().putArray("value.deep.key", "1", "2", "3").build()) .put(settingsBuilder().putArray("value.deep.key", "4", "5").build()) .build(); assertThat(settings.getAsArray("value.deep.key"), arrayContaining("4", "5")); // overriding an array with a single value settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1", "2").build()) .put(settingsBuilder().put("value", "3").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("3")); settings = settingsBuilder() .put(settingsBuilder().putArray("value.deep.key", "1", "2").build()) .put(settingsBuilder().put("value.deep.key", "3").build()) .build(); assertThat(settings.getAsArray("value.deep.key"), arrayContaining("3")); // test that other arrays are not overridden settings = settingsBuilder() .put(settingsBuilder().putArray("value", "1", "2", "3").putArray("a", "b", "c").build()) .put(settingsBuilder().putArray("value", "4", "5").putArray("d", "e", "f").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("4", "5")); assertThat(settings.getAsArray("a"), arrayContaining("b", "c")); assertThat(settings.getAsArray("d"), arrayContaining("e", "f")); settings = settingsBuilder() .put(settingsBuilder().putArray("value.deep.key", "1", "2", "3").putArray("a", "b", "c").build()) .put(settingsBuilder().putArray("value.deep.key", "4", "5").putArray("d", "e", "f").build()) .build(); assertThat(settings.getAsArray("value.deep.key"), arrayContaining("4", "5")); assertThat(settings.getAsArray("a"), notNullValue()); assertThat(settings.getAsArray("d"), notNullValue()); // overriding a deeper structure with an array settings = settingsBuilder() .put(settingsBuilder().put("value.data", "1").build()) .put(settingsBuilder().putArray("value", "4", "5").build()) .build(); assertThat(settings.getAsArray("value"), arrayContaining("4", "5")); // overriding an array with a deeper structure settings = settingsBuilder() .put(settingsBuilder().putArray("value", "4", "5").build()) .put(settingsBuilder().put("value.data", "1").build()) .build(); assertThat(settings.get("value.data"), is("1")); assertThat(settings.get("value"), is(nullValue())); } @Test public void testPrefixNormalization() { Settings settings = settingsBuilder().normalizePrefix("foo.").build(); assertThat(settings.names().size(), equalTo(0)); settings = settingsBuilder() .put("bar", "baz") .normalizePrefix("foo.") .build(); assertThat(settings.getAsMap().size(), equalTo(1)); assertThat(settings.get("bar"), nullValue()); assertThat(settings.get("foo.bar"), equalTo("baz")); settings = settingsBuilder() .put("bar", "baz") .put("foo.test", "test") .normalizePrefix("foo.") .build(); assertThat(settings.getAsMap().size(), equalTo(2)); assertThat(settings.get("bar"), nullValue()); assertThat(settings.get("foo.bar"), equalTo("baz")); assertThat(settings.get("foo.test"), equalTo("test")); settings = settingsBuilder() .put("foo.test", "test") .normalizePrefix("foo.") .build(); assertThat(settings.getAsMap().size(), equalTo(1)); assertThat(settings.get("foo.test"), equalTo("test")); } }