BUG-1172: nested uses-augmentation fails in code-generation phase. 02/7902/2
authorMartin Vitez <mvitez@cisco.com>
Wed, 11 Jun 2014 14:02:12 +0000 (16:02 +0200)
committerMartin Vitez <mvitez@cisco.com>
Wed, 11 Jun 2014 14:18:49 +0000 (16:18 +0200)
Added test case.

Change-Id: I22e506fcaf4f643f5cecb995e3e5f0e5d8ef1fa8
Signed-off-by: Martin Vitez <mvitez@cisco.com>
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.xtend
code-generator/binding-java-api-generator/src/test/java/org/opendaylight/yangtools/sal/java/api/generator/test/CompilationTest.java
code-generator/binding-java-api-generator/src/test/resources/compilation/bug1172/nested-uses-augment.yang [new file with mode: 0644]

index 620efbcee3da17b7fb6146f5bf4f5dedc763f388..8a41bef08f88a24889e712412508735e47227f87 100644 (file)
@@ -866,18 +866,17 @@ public class BindingGeneratorImpl implements BindingGenerator {
             return null;
         }
 
-        val String targetSchemaNodeName = result.QName.localName;
         var boolean fromUses = (result as DataSchemaNode).addedByUses
         var Iterator<UsesNode> groupingUses = grouping.uses.iterator;
-        while (fromUses) {
-            if (groupingUses.hasNext()) {
-                grouping = findNodeInSchemaContext(schemaContext, groupingUses.next().groupingPath.path) as GroupingDefinition;
-                result = grouping.getDataChildByName(targetSchemaNodeName);
-                fromUses = (result as DataSchemaNode).addedByUses;
-            } else {
-                throw new NullPointerException("Failed to generate code for augment in " + parentUsesNode);
+        while (groupingUses.hasNext && fromUses) {
+            result = findOriginalTargetFromGrouping(targetPath, groupingUses.next);
+            if (result != null) {
+                fromUses = (result as DataSchemaNode).addedByUses
             }
         }
+        if (fromUses) {
+            throw new NullPointerException("Failed to generate code for augment in " + parentUsesNode);
+        }
 
         return result as DataSchemaNode
     }
index 5f19a4e8f64b1de6b402e9b9869969121bc59ce7..5cdcbe56ab79fea0cdf4a8baf1e8902eb22dce2f 100644 (file)
@@ -9,8 +9,25 @@ package org.opendaylight.yangtools.sal.java.api.generator.test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.*;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.BASE_PKG;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.COMPILER_OUTPUT_PATH;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.FS;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.GENERATOR_OUTPUT_PATH;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_BAR;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_BAZ;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_FOO;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.NS_TEST;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsConstructor;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsField;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsMethod;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertContainsRestrictionCheck;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertFilesCount;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.assertImplementsIfc;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.cleanUp;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.getSourceFiles;
+import static org.opendaylight.yangtools.sal.java.api.generator.test.CompilationTestUtils.testCompilation;
 
+import com.google.common.collect.Range;
 import java.io.File;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
@@ -25,7 +42,6 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-
 import org.junit.Test;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
@@ -33,8 +49,6 @@ import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
-import com.google.common.collect.Range;
-
 /**
  * Test correct code generation.
  *
@@ -489,7 +503,7 @@ public class CompilationTest extends BaseCompilationTest {
     }
 
     @Test
-    public void bug586Test() throws Exception {
+    public void testBug586() throws Exception {
         final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug586");
         assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
         final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug586");
@@ -503,6 +517,26 @@ public class CompilationTest extends BaseCompilationTest {
         cleanUp(sourcesOutputDir, compiledOutputDir);
     }
 
+    /**
+     * Test handling nested uses-augmentations.
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testBug1172() throws Exception {
+        final File sourcesOutputDir = new File(GENERATOR_OUTPUT_PATH + FS + "bug1172");
+        assertTrue("Failed to create test file '" + sourcesOutputDir + "'", sourcesOutputDir.mkdir());
+        final File compiledOutputDir = new File(COMPILER_OUTPUT_PATH + FS + "bug1172");
+        assertTrue("Failed to create test file '" + compiledOutputDir + "'", compiledOutputDir.mkdir());
+
+        generateTestSources("/compilation/bug1172", sourcesOutputDir);
+
+        // Test if sources are compilable
+        testCompilation(sourcesOutputDir, compiledOutputDir);
+
+        cleanUp(sourcesOutputDir, compiledOutputDir);
+    }
+
     private void generateTestSources(String resourceDirPath, File sourcesOutputDir) throws Exception {
         final List<File> sourceFiles = getSourceFiles(resourceDirPath);
         final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
diff --git a/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1172/nested-uses-augment.yang b/code-generator/binding-java-api-generator/src/test/resources/compilation/bug1172/nested-uses-augment.yang
new file mode 100644 (file)
index 0000000..7377e94
--- /dev/null
@@ -0,0 +1,40 @@
+module nested-uses-augment {
+    yang-version 1;
+    namespace "odl:test:nua";
+    prefix "nua";
+
+    revision "2014-07-11" {
+    }
+
+    grouping machine-types {
+        container types {
+            choice machine-type {
+            }
+        }
+    }
+
+    grouping machine-ext {
+        uses machine-types {
+            augment "types/machine-type" {
+                case type-a {
+                    leaf id {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+
+    grouping machine-ext2 {
+        uses machine-ext {
+            augment "types/machine-type" {
+                case type-b {
+                    leaf name {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+
+}