|
23 | 23 | import org.elasticsearch.test.ESTestCase;
|
24 | 24 | import org.elasticsearch.test.MockLog;
|
25 | 25 | import org.elasticsearch.test.junit.annotations.TestLogging;
|
| 26 | +import org.junit.Test; |
26 | 27 |
|
27 | 28 | import java.lang.invoke.MethodHandles;
|
28 | 29 | import java.util.Arrays;
|
|
31 | 32 | import java.util.List;
|
32 | 33 | import java.util.Map;
|
33 | 34 | import java.util.Set;
|
| 35 | +import java.util.concurrent.ConcurrentHashMap; |
34 | 36 | import java.util.concurrent.atomic.AtomicReference;
|
35 | 37 | import java.util.function.BiConsumer;
|
36 | 38 | import java.util.function.Consumer;
|
@@ -1610,7 +1612,7 @@ public void testLongSettingBounds() {
|
1610 | 1612 | public void testRecordSetting() {
|
1611 | 1613 | record TestSetting(int intSetting) {}
|
1612 | 1614 | 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 |
1614 | 1616 | Settings settings456 = Settings.builder().put("record.setting.int_setting", 456).build();
|
1615 | 1617 |
|
1616 | 1618 | assertEquals(new TestSetting(123), setting.get(settings123));
|
@@ -1656,4 +1658,48 @@ record TestSetting(int i1, int i2) {}
|
1656 | 1658 | assertNull("Updater NOT called when value 'changed' to the default from nothing", watcher.get());
|
1657 | 1659 | }
|
1658 | 1660 |
|
| 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 | + |
1659 | 1705 | }
|
0 commit comments