blob: eaf4076186e25f540ffc5777a5e3c114c5cf88b3 [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;
21import org.junit.Test;
22import org.onosproject.yangutils.datamodel.ResolvableStatus;
23import org.onosproject.yangutils.datamodel.YangContainer;
24import org.onosproject.yangutils.datamodel.YangDataTypes;
25import org.onosproject.yangutils.datamodel.YangDerivedInfo;
26import org.onosproject.yangutils.datamodel.YangLeaf;
27import org.onosproject.yangutils.datamodel.YangList;
28import org.onosproject.yangutils.datamodel.YangModule;
29import org.onosproject.yangutils.datamodel.YangNode;
30import org.onosproject.yangutils.datamodel.YangNodeType;
31import org.onosproject.yangutils.datamodel.YangTypeDef;
32import org.onosproject.yangutils.parser.exceptions.ParserException;
33import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
34
35import static org.hamcrest.MatcherAssert.assertThat;
36import static org.hamcrest.core.Is.is;
37
38/**
39 * Test cases for testing "type" intra file linking.
40 */
41public class IntraFileTypeLinkingTest {
42
43 private final YangUtilsParserManager manager = new YangUtilsParserManager();
44
45 /**
46 * Checks self resolution when typedef and leaf using type are siblings.
47 */
48 @Test
49 public void processSelfResolutionWhenTypeAndTypedefAtRootLevel() throws IOException, ParserException {
50
51 YangNode node = manager.getDataModel("src/test/resources/SelfResolutionWhenTypeAndTypedefAtRootLevel.yang");
52
53 // Check whether the data model tree returned is of type module.
54 assertThat((node instanceof YangModule), is(true));
55
56 // Check whether the node type is set properly to module.
57 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
58
59 // Check whether the module name is set correctly.
60 YangModule yangNode = (YangModule) node;
61 assertThat(yangNode.getName(), is("Test"));
62
63 ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
64 YangLeaf leafInfo = leafIterator.next();
65
66 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
67 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
68 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
69
70 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
71 is((YangTypeDef) node.getChild()));
72
73 assertThat((leafInfo.getDataType().getResolvableStatus()),
74 is(ResolvableStatus.RESOLVED));
75 }
76
77 /**
78 * Checks self resolution when typedef and leaf using type are at different
79 * level where typedef is at the root.
80 */
81 @Test
82 public void processSelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy() throws IOException, ParserException {
83
84 YangNode node =
85 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootTypeTwoLevelInHierarchy.yang");
86
87 // Check whether the data model tree returned is of type module.
88 assertThat((node instanceof YangModule), is(true));
89
90 // Check whether the node type is set properly to module.
91 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
92
93 // Check whether the module name is set correctly.
94 YangModule yangNode = (YangModule) node;
95 assertThat(yangNode.getName(), is("Test"));
96
97 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
98
99 YangList yangList = (YangList) yangContainer.getChild();
100
101 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
102 YangLeaf leafInfo = leafIterator.next();
103
104 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
105 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
106 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
107
108 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
109 is((YangTypeDef) node.getChild()));
110
111 assertThat((leafInfo.getDataType().getResolvableStatus()),
112 is(ResolvableStatus.RESOLVED));
113 }
114
115 /**
116 * Checks self resolution when typedef and leaf using type are at different
117 * level where typedef is at the root and defined after parent holder
118 * of type.
119 */
120 @Test
121 public void processSelfFileLinkingTypedefAtRootIsAfterContainerHavingType() throws IOException, ParserException {
122
123 YangNode node =
124 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtRootIsAfterContainerHavingType.yang");
125
126 // Check whether the data model tree returned is of type module.
127 assertThat((node instanceof YangModule), is(true));
128
129 // Check whether the node type is set properly to module.
130 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
131
132 // Check whether the module name is set correctly.
133 YangModule yangNode = (YangModule) node;
134 assertThat(yangNode.getName(), is("Test"));
135
136 YangContainer yangContainer = (YangContainer) node.getChild();
137
138 YangList yangList = (YangList) yangContainer.getChild();
139
140 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
141 YangLeaf leafInfo = leafIterator.next();
142
143 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
144 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
145 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
146
147 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
148 is((YangTypeDef) node.getChild().getNextSibling()));
149
150 assertThat((leafInfo.getDataType().getResolvableStatus()),
151 is(ResolvableStatus.RESOLVED));
152 }
153
154 /**
155 * Checks self resolution when typedef and leaf using type are at different
156 * level where typedef is at the level of root+1 and defined after parent
157 * holder of type.
158 */
159 @Test
160 public void processSelfFileLinkingTypedefAtMiddleLevelAfterParentHolder() throws IOException, ParserException {
161
162 YangNode node =
163 manager.getDataModel("src/test/resources/SelfFileLinkingTypedefAtMiddleLevelAfterParentHolder.yang");
164
165 // Check whether the data model tree returned is of type module.
166 assertThat((node instanceof YangModule), is(true));
167
168 // Check whether the node type is set properly to module.
169 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
170
171 // Check whether the module name is set correctly.
172 YangModule yangNode = (YangModule) node;
173 assertThat(yangNode.getName(), is("Test"));
174
175 YangContainer yangContainer = (YangContainer) node.getChild();
176
177 YangList yangList = (YangList) yangContainer.getChild();
178
179 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
180 YangLeaf leafInfo = leafIterator.next();
181
182 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
183 assertThat(leafInfo.getDataType().getDataTypeName(), is("hello"));
184 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
185
186 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
187 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
188
189 assertThat((leafInfo.getDataType().getResolvableStatus()),
190 is(ResolvableStatus.RESOLVED));
191 }
192
193 /**
194 * Checks self resolution when typedef hierarchical references are present.
195 */
196 @Test
197 public void processSelfFileLinkingWithTypdefHierarchicalReference() throws IOException, ParserException {
198
199 YangNode node =
200 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalReference.yang");
201
202 // Check whether the data model tree returned is of type module.
203 assertThat((node instanceof YangModule), is(true));
204
205 // Check whether the node type is set properly to module.
206 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
207
208 // Check whether the module name is set correctly.
209 YangModule yangNode = (YangModule) node;
210 assertThat(yangNode.getName(), is("Test"));
211
212 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
213
214 YangList yangList = (YangList) yangContainer.getChild();
215
216 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
217 YangLeaf leafInfo = leafIterator.next();
218
219 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
220 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
221 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
222
223 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
224 is((YangTypeDef) yangList.getChild()));
225 assertThat((leafInfo.getDataType().getResolvableStatus()),
226 is(ResolvableStatus.RESOLVED));
227
228 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
229
230 assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
231 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
232 assertThat((typeDef1.getDataType().getResolvableStatus()),
233 is(ResolvableStatus.RESOLVED));
234
235 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
236
237 assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
238 is((YangTypeDef) node.getChild()));
239 assertThat((typeDef2.getDataType().getResolvableStatus()),
240 is(ResolvableStatus.RESOLVED));
241 }
242
243 /**
244 * Checks self resolution when typedef hierarchical references are present
245 * with last type is unresolved.
246 */
247 @Test
248 public void processSelfFileLinkingWithTypdefHierarchicalRefUnresolved() throws IOException, ParserException {
249
250 YangNode node =
251 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypdefHierarchicalRefUnresolved.yang");
252
253 // Check whether the data model tree returned is of type module.
254 assertThat((node instanceof YangModule), is(true));
255
256 // Check whether the node type is set properly to module.
257 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
258
259 // Check whether the module name is set correctly.
260 YangModule yangNode = (YangModule) node;
261 assertThat(yangNode.getName(), is("Test"));
262
263 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
264
265 YangList yangList = (YangList) yangContainer.getChild();
266
267 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
268 YangLeaf leafInfo = leafIterator.next();
269
270 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
271 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
272 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
273
274 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
275 is((YangTypeDef) yangList.getChild()));
276 assertThat((leafInfo.getDataType().getResolvableStatus()),
277 is(ResolvableStatus.PARTIALLY_RESOLVED));
278
279 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
280
281 assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
282 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
283 assertThat((typeDef1.getDataType().getResolvableStatus()),
284 is(ResolvableStatus.PARTIALLY_RESOLVED));
285
286 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
287
288 assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
289 is((YangTypeDef) node.getChild()));
290 assertThat((typeDef2.getDataType().getResolvableStatus()),
291 is(ResolvableStatus.PARTIALLY_RESOLVED));
292 }
293
294 /**
295 * Checks self resolution when type uses prefix of self module.
296 */
297 @Test
298 public void processSelfFileLinkingWithTypeWithSelfModulePrefix() throws IOException, ParserException {
299
300 YangNode node =
301 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfModulePrefix.yang");
302
303 // Check whether the data model tree returned is of type module.
304 assertThat((node instanceof YangModule), is(true));
305
306 // Check whether the node type is set properly to module.
307 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
308
309 // Check whether the module name is set correctly.
310 YangModule yangNode = (YangModule) node;
311 assertThat(yangNode.getName(), is("Test"));
312
313 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
314
315 YangList yangList = (YangList) yangContainer.getChild();
316
317 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
318 YangLeaf leafInfo = leafIterator.next();
319
320 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
321 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
322 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
323
324 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
325 is((YangTypeDef) yangList.getChild()));
326 assertThat((leafInfo.getDataType().getResolvableStatus()),
327 is(ResolvableStatus.RESOLVED));
328
329 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
330
331 assertThat(((YangDerivedInfo<?>) typeDef1.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
332 is((YangTypeDef) yangContainer.getChild().getNextSibling()));
333 assertThat((typeDef1.getDataType().getResolvableStatus()),
334 is(ResolvableStatus.RESOLVED));
335
336 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
337
338 assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
339 is((YangTypeDef) node.getChild()));
340 assertThat((typeDef2.getDataType().getResolvableStatus()),
341 is(ResolvableStatus.RESOLVED));
342 }
343
344 /**
345 * Checks self resolution when some type uses prefix of self module
346 * some uses external prefix.
347 */
348 @Test
349 public void processSelfFileLinkingWithTypeWithSelfAndExternalPrefixMix() throws IOException, ParserException {
350
351 YangNode node =
352 manager.getDataModel("src/test/resources/SelfFileLinkingWithTypeWithSelfAndExternalPrefixMix.yang");
353
354 // Check whether the data model tree returned is of type module.
355 assertThat((node instanceof YangModule), is(true));
356
357 // Check whether the node type is set properly to module.
358 assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
359
360 // Check whether the module name is set correctly.
361 YangModule yangNode = (YangModule) node;
362 assertThat(yangNode.getName(), is("Test"));
363
364 YangContainer yangContainer = (YangContainer) node.getChild().getNextSibling();
365
366 YangList yangList = (YangList) yangContainer.getChild();
367
368 ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
369 YangLeaf leafInfo = leafIterator.next();
370
371 assertThat(leafInfo.getLeafName(), is("invalid-interval"));
372 assertThat(leafInfo.getDataType().getDataTypeName(), is("FirstClass"));
373 assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.DERIVED));
374
375 assertThat(((YangDerivedInfo<?>) leafInfo.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
376 is((YangTypeDef) yangList.getChild()));
377 assertThat((leafInfo.getDataType().getResolvableStatus()),
378 is(ResolvableStatus.PARTIALLY_RESOLVED));
379
380 YangTypeDef typeDef1 = (YangTypeDef) yangList.getChild();
381
382 YangTypeDef typeDef2 = (YangTypeDef) yangContainer.getChild().getNextSibling();
383
384 assertThat(((YangDerivedInfo<?>) typeDef2.getDataType().getDataTypeExtendedInfo()).getReferredTypeDef(),
385 is((YangTypeDef) node.getChild()));
386 assertThat((typeDef2.getDataType().getResolvableStatus()),
387 is(ResolvableStatus.RESOLVED));
388 }
389
390 /**
391 * Check self resolution when type referred typedef is not available in
392 * file.
393 */
394 @Test(expected = ParserException.class)
395 public void processSelfResolutionWhenTypeReferredTypedefNotDefined() throws IOException, ParserException {
396
397 YangNode node =
398 manager.getDataModel("src/test/resources/SelfResolutionWhenTypeReferredTypedefNotDefined.yang");
399 }
400
401 /**
402 * Checks self resolution when typedef and leaf using type are at different
403 * level where typedef is is not an ancestor of type.
404 */
405 @Test(expected = ParserException.class)
406 public void processSelfFileLinkingTypedefNotFound() throws IOException, ParserException {
407
408 YangNode node = manager.getDataModel("src/test/resources/SelfFileLinkingTypedefNotFound.yang");
409 }
410
411 /**
412 * Checks hierarchical self resolution with self resolution failure scenario.
413 */
414 @Test(expected = ParserException.class)
415 public void processSelfFileLinkingWithHierarchicalTypeFailureScenario() throws IOException, ParserException {
416
417 YangNode node =
418 manager.getDataModel("src/test/resources/SelfFileLinkingWithHierarchicalTypeFailureScenario.yang");
419 }
420}