0c8de22fefe105fb324fb67b4986907a4fa3ad8b
[controller.git] / opendaylight / sal / yang-prototype / code-generator / yang-model-parser-impl / src / test / java / org / opendaylight / controller / yang / model / parser / impl / TypesResolutionTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.yang.model.parser.impl;
9
10 import static org.junit.Assert.*;
11
12 import java.io.File;
13 import java.util.List;
14 import java.util.Set;
15
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;
19 import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
20 import org.opendaylight.controller.yang.model.api.Module;
21 import org.opendaylight.controller.yang.model.api.TypeDefinition;
22 import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair;
23 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
24 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
25 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
26 import org.opendaylight.controller.yang.model.util.EnumerationType;
27 import org.opendaylight.controller.yang.model.util.InstanceIdentifier;
28 import org.opendaylight.controller.yang.model.util.StringType;
29 import org.opendaylight.controller.yang.model.util.UnionType;
30
31 public class TypesResolutionTest {
32
33     private YangModelParser parser;
34     private String[] testFiles;
35     private Set<Module> modules;
36
37     @Before
38     public void init() {
39         parser = new YangModelParserImpl();
40         File testDir = new File("src/test/resources/types");
41         String[] fileList = testDir.list();
42         testFiles = new String[fileList.length];
43         int i = 0;
44         for(String fileName : fileList) {
45             File file = new File(testDir, fileName);
46             testFiles[i] = file.getAbsolutePath();
47             i++;
48         }
49         modules = parser.parseYangModels(testFiles);
50         assertEquals(fileList.length, modules.size());
51     }
52
53     @Test
54     public void testIPVersion() {
55         Module tested = findModule(modules, "ietf-inet-types");
56         Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
57         assertEquals(14, typedefs.size());
58
59         TypeDefinition<?> type = findTypedef(typedefs, "ip-version");
60         EnumerationType en = (EnumerationType)type.getBaseType();
61         List<EnumPair> values = en.getValues();
62         assertEquals(3, values.size());
63
64         EnumPair value0 = values.get(0);
65         assertEquals("unknown", value0.getName());
66         assertEquals(0, (int)value0.getValue());
67
68         EnumPair value1 = values.get(1);
69         assertEquals("ipv4", value1.getName());
70         assertEquals(1, (int)value1.getValue());
71
72         EnumPair value2 = values.get(2);
73         assertEquals("ipv6", value2.getName());
74         assertEquals(2, (int)value2.getValue());
75     }
76
77     @Test
78     public void testIpAddress() {
79         Module tested = findModule(modules, "ietf-inet-types");
80         Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
81         TypeDefinition<?> type = findTypedef(typedefs, "ip-address");
82         UnionType baseType = (UnionType)type.getBaseType();
83         List<TypeDefinition<?>> unionTypes = baseType.getTypes();
84
85         StringType ipv4 = (StringType)unionTypes.get(0);
86         String expectedPattern =
87         "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}"
88       +  "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
89       + "(%[\\p{N}\\p{L}]+)?";
90         assertEquals(expectedPattern, ipv4.getPatterns().get(0).getRegularExpression());
91
92         StringType ipv6 = (StringType)unionTypes.get(1);
93         List<PatternConstraint> ipv6Patterns = ipv6.getPatterns();
94         expectedPattern = "((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}"
95         + "((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|"
96         + "(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}"
97         + "(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))"
98         + "(%[\\p{N}\\p{L}]+)?";
99         assertEquals(expectedPattern, ipv6Patterns.get(0).getRegularExpression());
100
101         expectedPattern = "(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|"
102         + "((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)"
103         + "(%.+)?";
104         assertEquals(expectedPattern, ipv6Patterns.get(1).getRegularExpression());
105     }
106
107     @Test
108     public void testDomainName() {
109         Module tested = findModule(modules, "ietf-inet-types");
110         Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
111         TypeDefinition<?> type = findTypedef(typedefs, "domain-name");
112         StringType baseType = (StringType)type.getBaseType();
113         List<PatternConstraint> patterns = baseType.getPatterns();
114         assertEquals(1, patterns.size());
115         String expectedPattern = "((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*"
116         +  "([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?)"
117         +  "|\\.";
118         assertEquals(expectedPattern, patterns.get(0).getRegularExpression());
119
120         List<LengthConstraint> lengths = baseType.getLengthStatements();
121         assertEquals(1, lengths.size());
122         LengthConstraint length = baseType.getLengthStatements().get(0);
123         assertEquals(1L, (long)length.getMin());
124         assertEquals(253L, (long)length.getMax());
125     }
126
127     @Test
128     public void testInstanceIdentifier1() {
129         Module tested = findModule(modules, "custom-types-test");
130         LeafSchemaNode leaf = (LeafSchemaNode)tested.getDataChildByName("inst-id-leaf1");
131         InstanceIdentifier leafType = (InstanceIdentifier)leaf.getType();
132         assertFalse(leafType.requireInstance());
133     }
134
135     @Test
136     public void testInstanceIdentifier2() {
137         Module tested = findModule(modules, "custom-types-test");
138         LeafSchemaNode leaf = (LeafSchemaNode)tested.getDataChildByName("inst-id-leaf2");
139         InstanceIdentifier leafType = (InstanceIdentifier)leaf.getType();
140         assertTrue(leafType.requireInstance());
141     }
142
143     @Test
144     public void testIdentity() {
145         Module tested = findModule(modules, "custom-types-test");
146         Set<IdentitySchemaNode> identities = tested.getIdentities();
147         IdentitySchemaNode testedIdentity = null;
148         for(IdentitySchemaNode id : identities) {
149             if(id.getQName().getLocalName().equals("crypto-alg")) {
150                 testedIdentity = id;
151                 IdentitySchemaNode baseIdentity = id.getBaseIdentity();
152                 assertEquals("crypto-base", baseIdentity.getQName().getLocalName());
153                 assertNull(baseIdentity.getBaseIdentity());
154             }
155         }
156         assertNotNull(testedIdentity);
157     }
158
159     private Module findModule(Set<Module> modules, String name) {
160         for(Module module : modules) {
161             if(module.getName().equals(name)) {
162                 return module;
163             }
164         }
165         return null;
166     }
167
168     private TypeDefinition<?> findTypedef(Set<TypeDefinition<?>> typedefs, String name) {
169         for(TypeDefinition<?> td : typedefs) {
170             if(td.getQName().getLocalName().equals(name)) {
171                 return td;
172             }
173         }
174         return null;
175     }
176
177 }