Fix for Bug 495. 81/5581/4
authorMartin Vitez <mvitez@cisco.com>
Mon, 10 Mar 2014 13:51:41 +0000 (14:51 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Wed, 12 Mar 2014 10:07:22 +0000 (10:07 +0000)
Fixed bug in parsing augments defined under uses: target node did not get reference to its augmentations.
Added test.

Change-Id: I4e7e32a6f2eb960d9e6727043e6b4dc4ba26429b
Signed-off-by: Martin Vitez <mvitez@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/AugmentTest.java
yang/yang-parser-impl/src/test/resources/augment-test/augment-in-uses/foo.yang [new file with mode: 0644]

index 591d5c4f5c7de9518c9cbe00136197c93b45d8fd..7206e2016e642871eb7eca9f6cb13eacde17ead3 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.*;
 import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
@@ -876,9 +877,15 @@ public final class YangParserImpl implements YangModelParser {
             targetNode = findSchemaNode(augment.getTargetPath().getPath(), (SchemaNodeBuilder) parentNode);
         }
 
-        fillAugmentTarget(augment, targetNode);
-        augment.setResolved(true);
-        return true;
+        if (targetNode instanceof AugmentationTargetBuilder) {
+            fillAugmentTarget(augment, targetNode);
+            ((AugmentationTargetBuilder) targetNode).addAugmentation(augment);
+            augment.setResolved(true);
+            return true;
+        } else {
+            throw new YangParseException(module.getName(), augment.getLine(),
+                    "Failed to resolve augment in uses. Invalid augment target: " + targetNode);
+        }
     }
 
     /**
index 011f4cd8c56123fbc7e61c6903b72fd2f78094ac..7d8f4ed66d2de2f06481c7c20508a868994190c7 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
@@ -419,4 +420,21 @@ public class AugmentTest {
         assertEquals(1, destroyChildren.size());
     }
 
+    @Test
+    public void testAugmentInUsesResolving() throws Exception {
+        modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-uses").toURI());
+        assertEquals(1, modules.size());
+
+        Module test = modules.iterator().next();
+        DataNodeContainer links = (DataNodeContainer) test.getDataChildByName("links");
+        DataNodeContainer link = (DataNodeContainer) links.getDataChildByName("link");
+        DataNodeContainer nodes = (DataNodeContainer) link.getDataChildByName("nodes");
+        ContainerSchemaNode node = (ContainerSchemaNode) nodes.getDataChildByName("node");
+        Set<AugmentationSchema> augments = node.getAvailableAugmentations();
+        assertEquals(1, augments.size());
+        assertEquals(1, node.getChildNodes().size());
+        LeafSchemaNode id = (LeafSchemaNode) node.getDataChildByName("id");
+        assertTrue(id.isAugmenting());
+    }
+
 }
diff --git a/yang/yang-parser-impl/src/test/resources/augment-test/augment-in-uses/foo.yang b/yang/yang-parser-impl/src/test/resources/augment-test/augment-in-uses/foo.yang
new file mode 100644 (file)
index 0000000..0dca0bc
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+module foo {
+    yang-version 1;
+    namespace "urn:yang.foo";
+    prefix "f";
+
+    revision "2014-03-10" {
+    }
+
+    container links {
+        container link {
+            uses g1 {
+                augment nodes/node {
+                    leaf id {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+
+    grouping g1 {
+        list nodes {
+            container node {
+            }
+        }
+    }
+
+}