Skip to content

Commit 017307e

Browse files
committed
Affix record settings
1 parent 7cbae66 commit 017307e

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

server/src/test/java/org/elasticsearch/common/settings/SettingTests.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.test.ESTestCase;
2424
import org.elasticsearch.test.MockLog;
2525
import org.elasticsearch.test.junit.annotations.TestLogging;
26+
import org.junit.Test;
2627

2728
import java.lang.invoke.MethodHandles;
2829
import java.util.Arrays;
@@ -31,6 +32,7 @@
3132
import java.util.List;
3233
import java.util.Map;
3334
import java.util.Set;
35+
import java.util.concurrent.ConcurrentHashMap;
3436
import java.util.concurrent.atomic.AtomicReference;
3537
import java.util.function.BiConsumer;
3638
import java.util.function.Consumer;
@@ -1610,7 +1612,7 @@ public void testLongSettingBounds() {
16101612
public void testRecordSetting() {
16111613
record TestSetting(int intSetting) {}
16121614
Setting<TestSetting> setting = Setting.recordSetting("record.setting", TestSetting.class, MethodHandles.lookup(), List.of());
1613-
Settings settings123 = Settings.builder().put("record.setting.int_setting", 123).build();
1615+
Settings settings123 = Settings.builder().put("record.setting.int_setting", 123).build(); // automatic snake-case for names
16141616
Settings settings456 = Settings.builder().put("record.setting.int_setting", 456).build();
16151617

16161618
assertEquals(new TestSetting(123), setting.get(settings123));
@@ -1656,4 +1658,48 @@ record TestSetting(int i1, int i2) {}
16561658
assertNull("Updater NOT called when value 'changed' to the default from nothing", watcher.get());
16571659
}
16581660

1661+
public void testAffixRecordSetting() {
1662+
record TestSetting(int intSetting) {}
1663+
var componentSetting = Setting.affixKeySetting(
1664+
"things.",
1665+
"config.int_setting",
1666+
(n,key)-> Setting.intSetting(key, -1));
1667+
var setting = Setting.affixKeySetting(
1668+
"things.",
1669+
"config",
1670+
(namespace, key) -> Setting.recordSetting(key, TestSetting.class, MethodHandles.lookup(), List.of(componentSetting.getConcreteSettingForNamespace(namespace)))
1671+
);
1672+
Settings settings = Settings.builder()
1673+
.put("things.thing1.config.int_setting", 123)
1674+
.put("things.thing2.config.int_setting", 456)
1675+
.build();
1676+
assertEquals(new TestSetting(123), setting.getConcreteSetting("things.thing1.config").get(settings));
1677+
assertEquals(new TestSetting(456), setting.getConcreteSetting("things.thing2.config").get(settings));
1678+
1679+
Settings settings1 = Settings.builder()
1680+
.put("things.thing1.config.int_setting", 123)
1681+
.build();
1682+
assertEquals(new TestSetting(123), setting.getConcreteSetting("things.thing1.config").get(settings));
1683+
assertEquals("Default", new TestSetting(-1), setting.getConcreteSetting("things.thing2.config").get(settings1));
1684+
1685+
Map<String, TestSetting> watcher = new ConcurrentHashMap<>();
1686+
var updater = setting.newAffixUpdater(watcher::put, logger, (k, s)->{});
1687+
1688+
// Test the obvious state transitions
1689+
updater.apply(settings1, Settings.EMPTY);
1690+
assertEquals(Map.of("thing1", new TestSetting(123)), watcher);
1691+
updater.apply(settings, settings1);
1692+
assertEquals(Map.of("thing1", new TestSetting(123), "thing2", new TestSetting(456)), watcher);
1693+
updater.apply(Settings.EMPTY, settings);
1694+
assertEquals("Values set to defaults", Map.of("thing1", new TestSetting(-1), "thing2", new TestSetting(-1)), watcher);
1695+
1696+
// Test that only the changed keys are updated
1697+
watcher.clear();
1698+
updater.apply(settings, settings1);
1699+
assertEquals("Only thing2 updated", Map.of("thing2", new TestSetting(456)), watcher);
1700+
watcher.clear();
1701+
updater.apply(Settings.EMPTY, settings1);
1702+
assertEquals("thing1 set to default", Map.of("thing1", new TestSetting(-1)), watcher);
1703+
}
1704+
16591705
}

0 commit comments

Comments
 (0)