From: Robert Varga Date: Tue, 23 Nov 2021 08:21:22 +0000 (+0100) Subject: Fix infinite loop in augment resolution X-Git-Tag: v2.0.10~1 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=efff9769e4e21dac8fb1e510170230cc50d760e6;p=netconf.git Fix infinite loop in augment resolution We should be pushing using 'result' as source, not 'found' here. JIRA: NETCONF-834 Change-Id: I169c97e1b18682ad7296e6e0272de1c362efe6d2 Signed-off-by: Robert Varga --- diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java index b3bc922b41..743945ad7b 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java @@ -212,7 +212,7 @@ public final class YangInstanceIdentifierDeserializer { var result = found; while (result.isMixin()) { path.add(result.getIdentifier()); - result = verifyNotNull(found.getChild(qname), "Mixin %s is missing child for %s while resolving %s", + result = verifyNotNull(result.getChild(qname), "Mixin %s is missing child for %s while resolving %s", result, qname, found); } return result; diff --git a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializerTest.java b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializerTest.java index 9d97189295..9a44c4c914 100644 --- a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializerTest.java +++ b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializerTest.java @@ -641,20 +641,39 @@ public class YangInstanceIdentifierDeserializerTest { public void deserializePartInOtherModuleTest() { final List result = YangInstanceIdentifierDeserializer.create(SCHEMA_CONTEXT, "deserializer-test-included:augmented-list=100/deserializer-test:augmented-leaf"); - assertEquals(4, result.size()); + // list final QName list = QName.create("deserializer:test:included", "2016-06-06", "augmented-list"); - final QName child = QName.create("deserializer:test", "2016-06-06", "augmented-leaf"); + assertEquals(NodeIdentifier.create(list), result.get(0)); + assertEquals(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), Uint16.valueOf(100)), + result.get(1)); + + // augmented leaf + final QName augLeaf = QName.create("deserializer:test", "2016-06-06", "augmented-leaf"); + final QName augList = QName.create("deserializer:test", "2016-06-06", "augmenting-list"); + assertEquals(new AugmentationIdentifier(Set.of(augLeaf, augList)), result.get(2)); + assertEquals(NodeIdentifier.create(augLeaf), result.get(3)); + } + + @Test + public void deserializeListInOtherModuleTest() { + final List result = YangInstanceIdentifierDeserializer.create(SCHEMA_CONTEXT, + "deserializer-test-included:augmented-list=100/deserializer-test:augmenting-list=0"); + assertEquals(5, result.size()); // list + final QName list = QName.create("deserializer:test:included", "2016-06-06", "augmented-list"); assertEquals(NodeIdentifier.create(list), result.get(0)); assertEquals(NodeIdentifierWithPredicates.of(list, QName.create(list, "list-key"), Uint16.valueOf(100)), result.get(1)); - // augmented leaf - assertEquals(new AugmentationIdentifier(Set.of(child)), result.get(2)); - assertEquals(NodeIdentifier.create(child), result.get(3)); + // augmented list + final QName augLeaf = QName.create("deserializer:test", "2016-06-06", "augmented-leaf"); + final QName augList = QName.create("deserializer:test", "2016-06-06", "augmenting-list"); + assertEquals(new AugmentationIdentifier(Set.of(augLeaf, augList)), result.get(2)); + assertEquals(NodeIdentifier.create(augList), result.get(3)); + assertEquals(NodeIdentifierWithPredicates.of(augList, QName.create(augList, "id"), 0), result.get(4)); } /** diff --git a/restconf/restconf-nb-rfc8040/src/test/resources/restconf/parser/deserializer/deserializer-test.yang b/restconf/restconf-nb-rfc8040/src/test/resources/restconf/parser/deserializer/deserializer-test.yang index ec8a825a30..97ec334a81 100644 --- a/restconf/restconf-nb-rfc8040/src/test/resources/restconf/parser/deserializer/deserializer-test.yang +++ b/restconf/restconf-nb-rfc8040/src/test/resources/restconf/parser/deserializer/deserializer-test.yang @@ -90,5 +90,12 @@ module deserializer-test { leaf augmented-leaf { type string; } + + list augmenting-list { + key id; + leaf id { + type int32; + } + } } }