From efff9769e4e21dac8fb1e510170230cc50d760e6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 23 Nov 2021 09:21:22 +0100 Subject: [PATCH] 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 --- .../YangInstanceIdentifierDeserializer.java | 2 +- ...angInstanceIdentifierDeserializerTest.java | 29 +++++++++++++++---- .../deserializer/deserializer-test.yang | 7 +++++ 3 files changed, 32 insertions(+), 6 deletions(-) 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; + } + } } } -- 2.36.6