blob: 52fb4ff545294798bbcdfae9d5f0920c1c0865fc [file] [log] [blame]
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.yangutils.linker;
18
19import java.io.IOException;
20import java.util.ListIterator;
Vinod Kumar Sd4deb062016-04-15 18:08:57 +053021
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +053022import org.junit.Test;
23import org.onosproject.yangutils.datamodel.ResolvableStatus;
24import org.onosproject.yangutils.datamodel.YangContainer;
25import org.onosproject.yangutils.datamodel.YangDataTypes;
26import org.onosproject.yangutils.datamodel.YangDerivedInfo;
27import org.onosproject.yangutils.datamodel.YangLeaf;
28import org.onosproject.yangutils.datamodel.YangList;
29import org.onosproject.yangutils.datamodel.YangModule;
30import org.onosproject.yangutils.datamodel.YangNode;
31import org.onosproject.yangutils.datamodel.YangNodeType;
32import org.onosproject.yangutils.datamodel.YangTypeDef;
33import org.onosproject.yangutils.parser.exceptions.ParserException;
34import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
35
36import static org.hamcrest.MatcherAssert.assertThat;
37import static org.hamcrest.core.Is.is;
38
39/**
40 * Test cases for testing "type" intra file linking.
41 */
42public class IntraFileTypeLinkingTest {
43
44 private final YangUtilsParserManager manager = new YangUtilsParserManager();
45
46 /**
47 * Checks self resolution when typedef and leaf using type are siblings.
48 */
49 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +053050 public void processSelfResolutionWhenTypeAndTypedefAtRootLevel()
51 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +053052
53 YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenTypeAndTypedefAtRootLevel.yang");
54
55 // Check whether the data model tree returned is of type module.
56 assertThat((node instanceof YangModule), is(true));
57
58 // Check whether the node type is set properly to module.
59 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
60
61 // Check whether the module name is set correctly.
62 YangModule yangNode = (YangModule) node;
63 assertThat(yangNode.getName(), is("Test"));
64
65 ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
66 YangLeaf leafInfo = leafIterator.next();
67
68 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
69 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
70 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
71
72 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
73 is((YangTypeDef) node.getChild()));
74
75 assertThat((leafInfo.getDataType().getResolvableStatus()),
76 is(ResolvableStatus.RESOLVED));
77 }
78
79 /**
80 * Checks self resolution when typedef and leaf using type are at different
81 * level where typedef is at the root.
82 */
83 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +053084 public void processSelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy()
85 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +053086
87 YangNode node =
88 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy.yang");
89
90 // Check whether the data model tree returned is of type module.
91 assertThat((node instanceof YangModule), is(true));
92
93 // Check whether the node type is set properly to module.
94 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
95
96 // Check whether the module name is set correctly.
97 YangModule yangNode = (YangModule) node;
98 assertThat(yangNode.getName(), is("Test"));
99
100 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
101
102 YangList yangList = (YangList) yangContainer.getChild();
103
104 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
105 YangLeaf leafInfo = leafIterator.next();
106
107 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
108 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
109 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
110
111 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
112 is((YangTypeDef) node.getChild()));
113
114 assertThat((leafInfo.getDataType().getResolvableStatus()),
115 is(ResolvableStatus.RESOLVED));
116 }
117
118 /**
119 * Checks self resolution when typedef and leaf using type are at different
120 * level where typedef is at the root and defined after parent holder
121 * of type.
122 */
123 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530124 public void processSelfFileLinkingTypedefAtRootIsAfterContainerHavingType()
125 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530126
127 YangNode node =
128 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootIsAfterContainerHavingType.yang");
129
130 // Check whether the data model tree returned is of type module.
131 assertThat((node instanceof YangModule), is(true));
132
133 // Check whether the node type is set properly to module.
134 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
135
136 // Check whether the module name is set correctly.
137 YangModule yangNode = (YangModule) node;
138 assertThat(yangNode.getName(), is("Test"));
139
140 YangContainer yangContainer = (YangContainer) node.getChild();
141
142 YangList yangList = (YangList) yangContainer.getChild();
143
144 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
145 YangLeaf leafInfo = leafIterator.next();
146
147 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
148 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
149 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
150
151 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
152 is((YangTypeDef) node.getChild().getNextSibling()));
153
154 assertThat((leafInfo.getDataType().getResolvableStatus()),
155 is(ResolvableStatus.RESOLVED));
156 }
157
158 /**
159 * Checks self resolution when typedef and leaf using type are at different
160 * level where typedef is at the level of root+1 and defined after parent
161 * holder of type.
162 */
163 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530164 public void processSelfFileLinkingTypedefAtMiddleLevelAfterParentHolder()
165 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530166
167 YangNode node =
168 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtMiddleLevelAfterParentHolder.yang");
169
170 // Check whether the data model tree returned is of type module.
171 assertThat((node instanceof YangModule), is(true));
172
173 // Check whether the node type is set properly to module.
174 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
175
176 // Check whether the module name is set correctly.
177 YangModule yangNode = (YangModule) node;
178 assertThat(yangNode.getName(), is("Test"));
179
180 YangContainer yangContainer = (YangContainer) node.getChild();
181
182 YangList yangList = (YangList) yangContainer.getChild();
183
184 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
185 YangLeaf leafInfo = leafIterator.next();
186
187 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
188 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
189 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
190
191 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
192 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
193
194 assertThat((leafInfo.getDataType().getResolvableStatus()),
195 is(ResolvableStatus.RESOLVED));
196 }
197
198 /**
199 * Checks self resolution when typedef hierarchical references are present.
200 */
201 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530202 public void processSelfFileLinkingWithTypdefHierarchicalReference()
203 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530204
205 YangNode node =
206 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalReference.yang");
207
208 // Check whether the data model tree returned is of type module.
209 assertThat((node instanceof YangModule), is(true));
210
211 // Check whether the node type is set properly to module.
212 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
213
214 // Check whether the module name is set correctly.
215 YangModule yangNode = (YangModule) node;
216 assertThat(yangNode.getName(), is("Test"));
217
218 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
219
220 YangList yangList = (YangList) yangContainer.getChild();
221
222 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
223 YangLeaf leafInfo = leafIterator.next();
224
225 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
226 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
227 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
228
229 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
230 is((YangTypeDef) yangList.getChild()));
231 assertThat((leafInfo.getDataType().getResolvableStatus()),
232 is(ResolvableStatus.RESOLVED));
233
234 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
235
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530236 assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530237 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530238 assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530239 is(ResolvableStatus.RESOLVED));
240
241 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
242
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530243 assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530244 is((YangTypeDef) node.getChild()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530245 assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530246 is(ResolvableStatus.RESOLVED));
247 }
248
249 /**
250 * Checks self resolution when typedef hierarchical references are present
251 * with last type is unresolved.
252 */
253 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530254 public void processSelfFileLinkingWithTypdefHierarchicalRefUnresolved()
255 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530256
257 YangNode node =
258 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalRefUnresolved.yang");
259
260 // Check whether the data model tree returned is of type module.
261 assertThat((node instanceof YangModule), is(true));
262
263 // Check whether the node type is set properly to module.
264 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
265
266 // Check whether the module name is set correctly.
267 YangModule yangNode = (YangModule) node;
268 assertThat(yangNode.getName(), is("Test"));
269
270 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
271
272 YangList yangList = (YangList) yangContainer.getChild();
273
274 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
275 YangLeaf leafInfo = leafIterator.next();
276
277 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
278 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
279 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
280
281 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
282 is((YangTypeDef) yangList.getChild()));
283 assertThat((leafInfo.getDataType().getResolvableStatus()),
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530284 is(ResolvableStatus.INTRA_FILE_RESOLVED));
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530285
286 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
287
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530288 assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530289 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530290 assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
291 is(ResolvableStatus.INTRA_FILE_RESOLVED));
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530292
293 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
294
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530295 assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530296 is((YangTypeDef) node.getChild()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530297 assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
298 is(ResolvableStatus.INTRA_FILE_RESOLVED));
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530299 }
300
301 /**
302 * Checks self resolution when type uses prefix of self module.
303 */
304 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530305 public void processSelfFileLinkingWithTypeWithSelfModulePrefix()
306 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530307
308 YangNode node =
309 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfModulePrefix.yang");
310
311 // Check whether the data model tree returned is of type module.
312 assertThat((node instanceof YangModule), is(true));
313
314 // Check whether the node type is set properly to module.
315 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
316
317 // Check whether the module name is set correctly.
318 YangModule yangNode = (YangModule) node;
319 assertThat(yangNode.getName(), is("Test"));
320
321 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
322
323 YangList yangList = (YangList) yangContainer.getChild();
324
325 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
326 YangLeaf leafInfo = leafIterator.next();
327
328 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
329 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
330 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
331
332 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
333 is((YangTypeDef) yangList.getChild()));
334 assertThat((leafInfo.getDataType().getResolvableStatus()),
335 is(ResolvableStatus.RESOLVED));
336
337 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
338
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530339 assertThat(((YangDerivedInfo<?>) typeDef1.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530340 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530341 assertThat((typeDef1.getTypeDefBaseType().getResolvableStatus()),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530342 is(ResolvableStatus.RESOLVED));
343
344 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
345
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530346 assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530347 is((YangTypeDef) node.getChild()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530348 assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530349 is(ResolvableStatus.RESOLVED));
350 }
351
352 /**
353 * Checks self resolution when some type uses prefix of self module
354 * some uses external prefix.
355 */
356 @Test
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530357 public void processSelfFileLinkingWithTypeWithSelfAndExternalPrefixMix()
358 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530359
360 YangNode node =
361 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfAndExternalPrefixMix.yang");
362
363 // Check whether the data model tree returned is of type module.
364 assertThat((node instanceof YangModule), is(true));
365
366 // Check whether the node type is set properly to module.
367 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
368
369 // Check whether the module name is set correctly.
370 YangModule yangNode = (YangModule) node;
371 assertThat(yangNode.getName(), is("Test"));
372
373 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
374
375 YangList yangList = (YangList) yangContainer.getChild();
376
377 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
378 YangLeaf leafInfo = leafIterator.next();
379
380 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
381 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
382 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
383
384 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
385 is((YangTypeDef) yangList.getChild()));
386 assertThat((leafInfo.getDataType().getResolvableStatus()),
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530387 is(ResolvableStatus.INTRA_FILE_RESOLVED));
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530388
389 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
390
391 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
392
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530393 assertThat(((YangDerivedInfo<?>) typeDef2.getTypeDefBaseType().getDataTypeExtendedInfo()).getReferredTypeDef(),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530394 is((YangTypeDef) node.getChild()));
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530395 assertThat((typeDef2.getTypeDefBaseType().getResolvableStatus()),
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530396 is(ResolvableStatus.RESOLVED));
397 }
398
399 /**
400 * Check self resolution when type referred typedef is not available in
401 * file.
402 */
403 @Test(expected = ParserException.class)
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530404 public void processSelfResolutionWhenTypeReferredTypedefNotDefined()
405 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530406
407 YangNode node =
408 manager.getDataModel("src/test/resources/SelfResolutionWhenTypeReferredTypedefNotDefined.yang");
409 }
410
411 /**
412 * Checks self resolution when typedef and leaf using type are at different
413 * level where typedef is is not an ancestor of type.
414 */
415 @Test(expected = ParserException.class)
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530416 public void processSelfFileLinkingTypedefNotFound()
417 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530418
419 YangNode node = manager.getDataModel("src/test/resources/SelfFileLinkingTypedefNotFound.yang");
420 }
421
422 /**
423 * Checks hierarchical self resolution with self resolution failure scenario.
424 */
425 @Test(expected = ParserException.class)
Vinod Kumar Sd4deb062016-04-15 18:08:57 +0530426 public void processSelfFileLinkingWithHierarchicalTypeFailureScenario()
427 throws IOException, ParserException {
Gaurav Agrawald9d6cc82016-03-29 02:17:23 +0530428
429 YangNode node =
430 manager.getDataModel("src/test/resources/SelfFileLinkingWithHierarchicalTypeFailureScenario.yang");
431 }
432}