Refactored YANG types resolving.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / test / java / org / opendaylight / controller / yang / model / parser / impl / YangModelParserTest.java
index a42a4fa7494f167bdac812de641849dd4d4215b6..650eaeab8221f2c89fa53ff47c11d20c45661ea8 100644 (file)
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.controller.yang.model.parser.impl;\r
-\r
-import static org.junit.Assert.*;\r
-\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Set;\r
-\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.controller.yang.model.api.AugmentationSchema;\r
-import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;\r
-import org.opendaylight.controller.yang.model.api.LeafSchemaNode;\r
-import org.opendaylight.controller.yang.model.api.ListSchemaNode;\r
-import org.opendaylight.controller.yang.model.api.Module;\r
-import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
-import org.opendaylight.controller.yang.model.api.type.IntegerTypeDefinition;\r
-import org.opendaylight.controller.yang.model.api.type.PatternConstraint;\r
-import org.opendaylight.controller.yang.model.api.type.RangeConstraint;\r
-import org.opendaylight.controller.yang.model.parser.api.YangModelParser;\r
-import org.opendaylight.controller.yang.model.util.Decimal64;\r
-import org.opendaylight.controller.yang.model.util.Int32;\r
-import org.opendaylight.controller.yang.model.util.StringType;\r
-\r
-public class YangModelParserTest {\r
-\r
-    private final String testFile1 = "src/test/resources/model/testfile1.yang";\r
-    private final String testFile2 = "src/test/resources/model/testfile2.yang";\r
-    private YangModelParser tested;\r
-\r
-    @Before\r
-    public void init() {\r
-        tested = new YangModelParserImpl();\r
-    }\r
-\r
-    @Test\r
-    public void testAugment() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m2 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types2")) {\r
-                m2 = m;\r
-            }\r
-        }\r
-        assertNotNull(m2);\r
-\r
-        AugmentationSchema augment = m2.getAugmentations().iterator().next();\r
-        assertNotNull(augment);\r
-    }\r
-\r
-    @Test\r
-    public void testAugmentTarget() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        ContainerSchemaNode container = (ContainerSchemaNode)m1.getDataChildByName("interfaces");\r
-        assertNotNull(container);\r
-\r
-        ListSchemaNode list = (ListSchemaNode)container.getDataChildByName("ifEntry");\r
-        assertNotNull(list);\r
-        assertEquals(1, list.getAvailableAugmentations().size());\r
-\r
-        LeafSchemaNode leaf = (LeafSchemaNode)list.getDataChildByName("ds0ChannelNumber");\r
-        assertNotNull(leaf);\r
-    }\r
-\r
-    @Test\r
-    public void testTypedefRangesResolving() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m1.getDataChildByName("testleaf");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof Int32);\r
-        Int32 baseTypeCast = (Int32)baseType;\r
-        List<RangeConstraint> ranges = baseTypeCast.getRangeStatements();\r
-        assertEquals(2, ranges.size());\r
-        RangeConstraint range = ranges.get(0);\r
-        assertEquals(2L, range.getMin());\r
-        assertEquals(20L, range.getMax());\r
-    }\r
-\r
-    @Test\r
-    public void testTypedefPatternsResolving() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m1.getDataChildByName("test-string-leaf");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof StringType);\r
-        StringType baseTypeCast = (StringType)baseType;\r
-\r
-        Set<String> expectedRegularExpressions = new HashSet<String>();\r
-        expectedRegularExpressions.add("[a-k]*");\r
-        expectedRegularExpressions.add("[b-u]*");\r
-        expectedRegularExpressions.add("[e-z]*");\r
-\r
-        Set<String> actualRegularExpressions = new HashSet<String>();\r
-        List<PatternConstraint> patterns = baseTypeCast.getPatterns();\r
-        for(PatternConstraint pc : patterns) {\r
-            actualRegularExpressions.add(pc.getRegularExpression());\r
-        }\r
-\r
-        assertEquals(expectedRegularExpressions, actualRegularExpressions);\r
-    }\r
-\r
-    @Test\r
-    public void testTypedefLengthsResolving() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m1.getDataChildByName("test-int-leaf");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof IntegerTypeDefinition);\r
-        Int32 baseTypeCast = (Int32)baseType;\r
-\r
-        Long[][] expectedRanges = new Long[3][2];\r
-        expectedRanges[0] = new Long[]{10L, 20L};\r
-        expectedRanges[1] = new Long[]{12L, 18L};\r
-        expectedRanges[2] = new Long[]{14L, 16L};\r
-\r
-        List<RangeConstraint> actualRanges = baseTypeCast.getRangeStatements();\r
-        assertEquals(3, actualRanges.size());\r
-        for(int i = 0; i < actualRanges.size(); i++) {\r
-            assertEquals(expectedRanges[i][0], actualRanges.get(i).getMin());\r
-            assertEquals(expectedRanges[i][1], actualRanges.get(i).getMax());\r
-        }\r
-    }\r
-\r
-    @Test\r
-    public void testTypeDef() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m2 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types2")) {\r
-                m2 = m;\r
-            }\r
-        }\r
-        assertNotNull(m2);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m2.getDataChildByName("nested-type-leaf");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof Int32);\r
-        Int32 baseTypeCast = (Int32)baseType;\r
-        List<RangeConstraint> ranges = baseTypeCast.getRangeStatements();\r
-        assertEquals(2, ranges.size());\r
-        RangeConstraint range = ranges.get(0);\r
-        assertEquals(2L, range.getMin());\r
-        assertEquals(20L, range.getMax());\r
-    }\r
-\r
-    @Test\r
-    public void testTypedefDecimal1() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m1.getDataChildByName("test-decimal-leaf");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof Decimal64);\r
-        Decimal64 baseTypeCast = (Decimal64)baseType;\r
-        assertEquals(4, (int)baseTypeCast.getFractionDigits());\r
-    }\r
-\r
-    @Test\r
-    public void testTypedefDecimal2() {\r
-        Set<Module> modules = tested.parseYangModels(testFile1, testFile2);\r
-        assertEquals(2, modules.size());\r
-\r
-        Module m1 = null;\r
-        for(Module m : modules) {\r
-            if(m.getName().equals("types1")) {\r
-                m1 = m;\r
-            }\r
-        }\r
-        assertNotNull(m1);\r
-\r
-        LeafSchemaNode testleaf = (LeafSchemaNode)m1.getDataChildByName("test-decimal-leaf2");\r
-        TypeDefinition<?> baseType = testleaf.getType().getBaseType();\r
-        assertTrue(testleaf.getType().getBaseType() instanceof Decimal64);\r
-        Decimal64 baseTypeCast = (Decimal64)baseType;\r
-        assertEquals(5, (int)baseTypeCast.getFractionDigits());\r
-    }\r
-\r
-}\r
+/*
+ * 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
+ */
+package org.opendaylight.controller.yang.model.parser.impl;
+
+import static org.junit.Assert.*;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.model.api.AugmentationSchema;
+import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
+import org.opendaylight.controller.yang.model.api.ListSchemaNode;
+import org.opendaylight.controller.yang.model.api.Module;
+import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
+import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
+import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
+import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
+import org.opendaylight.controller.yang.model.util.Decimal64;
+import org.opendaylight.controller.yang.model.util.ExtendedType;
+import org.opendaylight.controller.yang.model.util.Int16;
+import org.opendaylight.controller.yang.model.util.Int32;
+import org.opendaylight.controller.yang.model.util.StringType;
+import org.opendaylight.controller.yang.model.util.UnionType;
+
+public class YangModelParserTest {
+
+    private static final String TEST_FILE1 = "src/test/resources/model/testfile1.yang";
+    private static final String TEST_FILE2 = "src/test/resources/model/testfile2.yang";
+    private YangModelParser tested;
+
+    @Before
+    public void init() {
+        tested = new YangModelParserImpl();
+    }
+
+    @Test
+    public void testAugment() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types2");
+        assertNotNull(testModule);
+
+        AugmentationSchema augment = testModule.getAugmentations().iterator().next();
+        assertNotNull(augment);
+    }
+
+    @Test
+    public void testAugmentTarget() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        ContainerSchemaNode container = (ContainerSchemaNode)testModule.getDataChildByName("interfaces");
+        assertNotNull(container);
+
+        ListSchemaNode list = (ListSchemaNode)container.getDataChildByName("ifEntry");
+        assertNotNull(list);
+        assertEquals(1, list.getAvailableAugmentations().size());
+
+        LeafSchemaNode leaf = (LeafSchemaNode)list.getDataChildByName("ds0ChannelNumber");
+        assertNotNull(leaf);
+    }
+
+    @Test
+    public void testTypedefRangesResolving() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("testleaf");
+        ExtendedType leafType = (ExtendedType)testleaf.getType();
+        assertEquals("my-type1", leafType.getQName().getLocalName());
+        assertEquals("t2", leafType.getQName().getPrefix());
+        ExtendedType baseType = (ExtendedType)leafType.getBaseType();
+        assertEquals("my-base-int32-type", baseType.getQName().getLocalName());
+        assertEquals("t2", baseType.getQName().getPrefix());
+
+        List<RangeConstraint> ranges = leafType.getRanges();
+        assertEquals(1, ranges.size());
+        RangeConstraint range = ranges.get(0);
+        assertEquals(11L, range.getMin());
+        assertEquals(20L, range.getMax());
+    }
+
+    @Test
+    public void testTypedefPatternsResolving() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("test-string-leaf");
+        ExtendedType testleafType = (ExtendedType)testleaf.getType();
+        QName testleafTypeQName = testleafType.getQName();
+        assertEquals("my-string-type-ext", testleafTypeQName.getLocalName());
+        assertEquals("t2", testleafTypeQName.getPrefix());
+
+        Set<String> expectedRegex = new HashSet<String>();
+        expectedRegex.add("[a-k]*");
+        expectedRegex.add("[b-u]*");
+        expectedRegex.add("[e-z]*");
+
+        Set<String> actualRegex = new HashSet<String>();
+        List<PatternConstraint> patterns = testleafType.getPatterns();
+        assertEquals(3, patterns.size());
+        for (PatternConstraint pc : patterns) {
+            actualRegex.add(pc.getRegularExpression());
+        }
+        assertEquals(expectedRegex, actualRegex);
+
+        TypeDefinition<?> baseType = testleafType.getBaseType();
+        assertEquals("my-string-type2", baseType.getQName().getLocalName());
+
+        List<LengthConstraint> lengths = testleafType.getLengths();
+        assertEquals(1, lengths.size());
+
+        LengthConstraint length = lengths.get(0);
+        assertEquals(5L, length.getMin());
+        assertEquals(10L, length.getMax());
+    }
+
+    @Test
+    public void testTypedefLengthsResolving() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("leaf-with-length");
+        ExtendedType testleafType = (ExtendedType)testleaf.getType();
+        assertEquals("my-string-type", testleafType.getQName().getLocalName());
+
+        List<LengthConstraint> lengths = testleafType.getLengths();
+        assertEquals(1, lengths.size());
+
+        LengthConstraint length = lengths.get(0);
+        assertEquals(7L, length.getMin());
+        assertEquals(10L, length.getMax());
+    }
+
+    @Test
+    public void testTypeDef() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types2");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("nested-type-leaf");
+        ExtendedType testleafType = (ExtendedType)testleaf.getType();
+        assertEquals("my-type1", testleafType.getQName().getLocalName());
+
+        ExtendedType baseType = (ExtendedType)testleafType.getBaseType();
+        assertEquals("my-base-int32-type", baseType.getQName().getLocalName());
+
+        Int32 int32base = (Int32)baseType.getBaseType();
+        List<RangeConstraint> ranges = int32base.getRangeStatements();
+        assertEquals(1, ranges.size());
+        RangeConstraint range = ranges.get(0);
+        assertEquals(2L, range.getMin());
+        assertEquals(20L, range.getMax());
+    }
+
+    @Test
+    public void testTypedefDecimal1() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("test-decimal-leaf");
+        ExtendedType type = (ExtendedType)testleaf.getType();
+
+        TypeDefinition<?> baseType = type.getBaseType();
+        assertTrue(baseType instanceof Decimal64);
+        Decimal64 baseTypeCast = (Decimal64)baseType;
+        assertEquals(6, (int)baseTypeCast.getFractionDigits());
+    }
+
+    @Test
+    public void testTypedefDecimal2() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("test-decimal-leaf2");
+        TypeDefinition<?> baseType = testleaf.getType().getBaseType();
+        assertTrue(testleaf.getType().getBaseType() instanceof Decimal64);
+        Decimal64 baseTypeCast = (Decimal64)baseType;
+        assertEquals(5, (int)baseTypeCast.getFractionDigits());
+    }
+
+    @Test
+    public void testTypedefUnion() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("union-leaf");
+        ExtendedType testleafType = (ExtendedType)testleaf.getType();
+        assertEquals("my-union-ext", testleafType.getQName().getLocalName());
+
+        ExtendedType baseType = (ExtendedType)testleafType.getBaseType();
+        assertEquals("my-union", baseType.getQName().getLocalName());
+
+        UnionType unionBase = (UnionType) baseType.getBaseType();
+
+        List<TypeDefinition<?>> unionTypes = unionBase.getTypes();
+        Int16 unionType1 = (Int16)unionTypes.get(0);
+        List<RangeConstraint> ranges = unionType1.getRangeStatements();
+        assertEquals(1, ranges.size());
+        RangeConstraint range = ranges.get(0);
+        assertEquals(1L, range.getMin());
+        assertEquals(100L, range.getMax());
+
+        assertTrue(unionTypes.get(0) instanceof Int16);
+        assertTrue(unionTypes.get(1) instanceof Int32);
+    }
+
+    @Test
+    public void testNestedUnionResolving() {
+        Set<Module> modules = tested.parseYangModels(TEST_FILE1, TEST_FILE2);
+        assertEquals(2, modules.size());
+
+        Module testModule = findModule(modules, "types1");
+        assertNotNull(testModule);
+
+        LeafSchemaNode testleaf = (LeafSchemaNode)testModule.getDataChildByName("nested-union-leaf");
+
+        ExtendedType nestedUnion1 = (ExtendedType)testleaf.getType();
+        assertEquals("nested-union1", nestedUnion1.getQName().getLocalName());
+
+        ExtendedType nestedUnion2 = (ExtendedType)nestedUnion1.getBaseType();
+        assertEquals("nested-union2", nestedUnion2.getQName().getLocalName());
+
+        UnionType unionType1 = (UnionType)nestedUnion2.getBaseType();
+        List<TypeDefinition<?>> unionTypes = unionType1.getTypes();
+        assertEquals(2, unionTypes.size());
+        assertTrue(unionTypes.get(0) instanceof StringType);
+        assertTrue(unionTypes.get(1) instanceof ExtendedType);
+
+        ExtendedType extendedUnion = (ExtendedType)unionTypes.get(1);
+        ExtendedType extendedUnionBase = (ExtendedType)extendedUnion.getBaseType();
+        assertEquals("my-union", extendedUnionBase.getQName().getLocalName());
+
+        UnionType extendedTargetUnion = (UnionType)extendedUnionBase.getBaseType();
+        List<TypeDefinition<?>> extendedTargetTypes = extendedTargetUnion.getTypes();
+        assertTrue(extendedTargetTypes.get(0) instanceof Int16);
+        assertTrue(extendedTargetTypes.get(1) instanceof Int32);
+
+        Int16 int16 = (Int16) extendedTargetTypes.get(0);
+        List<RangeConstraint> ranges = int16.getRangeStatements();
+        assertEquals(1, ranges.size());
+        RangeConstraint range = ranges.get(0);
+        assertEquals(1L, range.getMin());
+        assertEquals(100L, range.getMax());
+    }
+
+    private Module findModule(Set<Module> modules, String moduleName) {
+        Module result = null;
+        for(Module module : modules) {
+            if(module.getName().equals(moduleName)) {
+                result = module;
+                break;
+            }
+        }
+        return result;
+    }
+
+}