tkalkirill commented on a change in pull request #336:
URL: https://github.com/apache/ignite-3/pull/336#discussion_r712290903



##########
File path: 
modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
##########
@@ -644,4 +667,366 @@ public void dataRace() throws Exception {
 
         assertEquals(List.of("deleted"), log);
     }
+
+    /** */
+    @Test
+    void testNoGetOrUpdateConfigValueForAny() throws Exception {
+        ChildConfiguration any0 = configuration.elements().any();
+
+        assertThrows(ConfigurationException.class, () -> any0.value());
+        assertThrows(ConfigurationException.class, () -> 
any0.change(doNothingConsumer()));
+
+        assertThrows(ConfigurationException.class, () -> any0.str().value());
+        assertThrows(ConfigurationException.class, () -> 
any0.str().update(""));
+
+        assertThrows(ConfigurationException.class, () -> 
any0.child2().value());
+        assertThrows(ConfigurationException.class, () -> 
any0.child2().change(doNothingConsumer()));
+
+        assertThrows(ConfigurationException.class, () -> 
any0.child2().i().value());
+        assertThrows(ConfigurationException.class, () -> 
any0.child2().i().update(100));
+
+        assertThrows(ConfigurationException.class, () -> 
any0.elements2().value());
+        assertThrows(ConfigurationException.class, () -> 
any0.elements2().change(doNothingConsumer()));
+        assertThrows(ConfigurationException.class, () -> 
any0.elements2().get("test"));
+
+        Child2Configuration any1 = any0.elements2().any();
+
+        assertThrows(ConfigurationException.class, () -> any1.value());
+        assertThrows(ConfigurationException.class, () -> 
any1.change(doNothingConsumer()));
+
+        assertThrows(ConfigurationException.class, () -> any1.i().value());
+        assertThrows(ConfigurationException.class, () -> any1.i().update(200));
+
+        configuration.elements().change(c0 -> c0.create("test", c1 -> 
c1.changeStr("foo"))).get(1, SECONDS);
+
+        Child2Configuration any2 = 
configuration.elements().get("test").elements2().any();
+
+        assertThrows(ConfigurationException.class, () -> any2.value());
+        assertThrows(ConfigurationException.class, () -> 
any2.change(doNothingConsumer()));
+
+        assertThrows(ConfigurationException.class, () -> any2.i().value());
+        assertThrows(ConfigurationException.class, () -> any2.i().update(300));
+    }
+
+    /** */
+    @Test
+    void testAnyListeners() throws Exception {
+        List<String> events = new ArrayList<>();
+
+        // Add "regular" listeners.
+        configuration.listen(configListener(ctx -> events.add("root")));
+
+        configuration.child().listen(configListener(ctx -> 
events.add("root.child")));
+        configuration.child().str().listen(configListener(ctx -> 
events.add("root.child.str")));
+        configuration.child().child2().listen(configListener(ctx -> 
events.add("root.child.child2")));
+        configuration.child().child2().i().listen(configListener(ctx -> 
events.add("root.child.child2.i")));
+
+        configuration.elements().listen(configListener(ctx -> 
events.add("root.elements")));
+        
configuration.elements().listenElements(configNamedListenerOnCreate(ctx -> 
events.add("root.elements.onCrt")));
+        
configuration.elements().listenElements(configNamedListenerOnUpdate(ctx -> 
events.add("root.elements.onUpd")));
+        
configuration.elements().listenElements(configNamedListenerOnRename(ctx -> 
events.add("root.elements.onRen")));
+        
configuration.elements().listenElements(configNamedListenerOnDelete(ctx -> 
events.add("root.elements.onDel")));
+
+        configuration.elements().change(c -> c.create("0", 
doNothingConsumer())).get(1, SECONDS);
+
+        ChildConfiguration childCfg = this.configuration.elements().get("0");
+
+        childCfg.listen(configListener(ctx -> events.add("root.elements.0")));
+        childCfg.str().listen(configListener(ctx -> 
events.add("root.elements.0.str")));
+        childCfg.child2().listen(configListener(ctx -> 
events.add("root.elements.0.child2")));
+        childCfg.child2().i().listen(configListener(ctx -> 
events.add("root.elements.0.child2.i")));
+
+        NamedConfigurationTree<Child2Configuration, Child2View, Child2Change> 
elements2 = childCfg.elements2();
+
+        elements2.listen(configListener(ctx -> 
events.add("root.elements.0.elements2")));
+        elements2.listenElements(configNamedListenerOnCreate(ctx -> 
events.add("root.elements.0.elements2.onCrt")));
+        elements2.listenElements(configNamedListenerOnUpdate(ctx -> 
events.add("root.elements.0.elements2.onUpd")));
+        elements2.listenElements(configNamedListenerOnRename(ctx -> 
events.add("root.elements.0.elements2.onRen")));
+        elements2.listenElements(configNamedListenerOnDelete(ctx -> 
events.add("root.elements.0.elements2.onDel")));
+
+        elements2.change(c -> c.create("0", doNothingConsumer())).get(1, 
SECONDS);
+
+        Child2Configuration child2 = elements2.get("0");
+
+        child2.listen(configListener(ctx -> 
events.add("root.elements.0.elements2.0")));
+        child2.i().listen(configListener(ctx -> 
events.add("root.elements.0.elements2.0.i")));
+
+        // Adding "any" listeners.
+        ChildConfiguration anyChild = configuration.elements().any();
+
+        anyChild.listen(configListener(ctx -> 
events.add("root.elements.any")));
+        anyChild.str().listen(configListener(ctx -> 
events.add("root.elements.any.str")));
+        anyChild.child2().listen(configListener(ctx -> 
events.add("root.elements.any.child2")));
+        anyChild.child2().i().listen(configListener(ctx -> 
events.add("root.elements.any.child2.i")));
+
+        NamedConfigurationTree<Child2Configuration, Child2View, Child2Change> 
anyEl2 = anyChild.elements2();
+
+        anyEl2.listen(configListener(ctx -> 
events.add("root.elements.any.elements2")));
+        anyEl2.listenElements(configNamedListenerOnCreate(ctx -> 
events.add("root.elements.any.elements2.onCrt")));
+        anyEl2.listenElements(configNamedListenerOnUpdate(ctx -> 
events.add("root.elements.any.elements2.onUpd")));
+        anyEl2.listenElements(configNamedListenerOnRename(ctx -> 
events.add("root.elements.any.elements2.onRen")));
+        anyEl2.listenElements(configNamedListenerOnDelete(ctx -> 
events.add("root.elements.any.elements2.onDel")));
+
+        Child2Configuration anyChild2 = anyEl2.any();
+
+        anyChild2.listen(configListener(ctx -> 
events.add("root.elements.any.elements2.any")));
+        anyChild2.i().listen(configListener(ctx -> 
events.add("root.elements.any.elements2.any.i")));
+
+        childCfg.elements2().any().listen(configListener(ctx -> 
events.add("root.elements.0.elements2.any")));
+        childCfg.elements2().any().i().listen(configListener(ctx -> 
events.add("root.elements.0.elements2.any.i")));
+
+        // Tests.
+        checkListeners(
+            () -> configuration.child().change(c -> 
c.changeStr("x").changeChild2(c0 -> c0.changeI(100))),
+            List.of("root", "root.child", "root.child.str", 
"root.child.child2", "root.child.child2.i"),
+            events
+        );
+
+        checkListeners(
+            () -> configuration.elements().get("0").str().update("x"),
+            List.of(
+                "root",
+                "root.elements",
+                "root.elements.onUpd",
+                //
+                "root.elements.any",
+                "root.elements.0",
+                //
+                "root.elements.any.str",
+                "root.elements.0.str"
+            ),
+            events
+        );
+
+        checkListeners(
+            () -> 
configuration.elements().get("0").elements2().get("0").i().update(200),
+            List.of(
+                "root",
+                "root.elements",
+                "root.elements.onUpd",
+                //
+                "root.elements.any",
+                "root.elements.0",
+                //
+                "root.elements.any.elements2",
+                "root.elements.0.elements2",
+                "root.elements.any.elements2.onUpd",
+                "root.elements.0.elements2.onUpd",
+                //
+                "root.elements.any.elements2.any",
+                "root.elements.0.elements2.any",
+                "root.elements.0.elements2.0",
+                //
+                "root.elements.any.elements2.any.i",
+                "root.elements.0.elements2.any.i",
+                "root.elements.0.elements2.0.i"
+            ),
+            events
+        );
+
+        checkListeners(
+            () -> configuration.elements().get("0").elements2().change(c -> 
c.create("1", doNothingConsumer())),
+            List.of(
+                "root",
+                "root.elements",
+                "root.elements.onUpd",
+                //
+                "root.elements.any",
+                "root.elements.0",
+                //
+                "root.elements.any.elements2",
+                "root.elements.0.elements2",
+                "root.elements.any.elements2.onCrt",
+                "root.elements.0.elements2.onCrt",
+                //
+                "root.elements.any.elements2.onUpd",
+                "root.elements.0.elements2.onUpd"
+            ),
+            events
+        );
+
+        checkListeners(
+            () -> configuration.elements()

Review comment:
       I'll try to implement it.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to