2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.stmt;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
18 import java.net.URISyntaxException;
19 import java.text.ParseException;
20 import java.util.Date;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.QNameModule;
25 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.Module;
30 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
34 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
35 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
36 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
37 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
38 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
39 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
40 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
41 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
43 public class MoreRevisionsTest {
45 private static final StatementStreamSource REVFILE = sourceForResource(
46 "/semantic-statement-parser/revisions/more-revisions-test.yang");
48 private static final StatementStreamSource TED_20130712 = sourceForResource(
49 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
51 private static final StatementStreamSource TED_20131021 = sourceForResource(
52 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
54 private static final StatementStreamSource IETF_TYPES = sourceForResource(
55 "/ietf/ietf-inet-types@2010-09-24.yang");
57 private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
58 "/ietf/network-topology@2013-07-12.yang");
60 private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
61 "/ietf/network-topology@2013-10-21.yang");
63 private static final StatementStreamSource ISIS_20130712 = sourceForResource(
64 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
66 private static final StatementStreamSource ISIS_20131021 = sourceForResource(
67 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
69 private static final StatementStreamSource L3_20130712 = sourceForResource(
70 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
72 private static final StatementStreamSource L3_20131021 = sourceForResource(
73 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
76 public void readAndParseYangFileTest() throws SourceException,
78 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
80 reactor.addSource(REVFILE);
81 EffectiveSchemaContext result = reactor.buildEffective();
82 assertNotNull(result);
83 final Module moduleByName = result.getModules().iterator().next();
84 final QNameModule qNameModule = moduleByName.getQNameModule();
85 final String formattedRevision = qNameModule.getFormattedRevision();
86 assertEquals(formattedRevision, "2015-06-07");
90 public void twoRevisionsTest() throws SourceException, ReactorException {
91 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
94 reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
96 EffectiveSchemaContext result = reactor.buildEffective();
97 assertNotNull(result);
102 public void twoRevisionsTest2() throws SourceException, ReactorException {
103 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
106 reactor.addSources(NETWORK_TOPOLOGY_20130712,
107 NETWORK_TOPOLOGY_20131021, IETF_TYPES);
109 EffectiveSchemaContext result = reactor.buildEffective();
110 assertNotNull(result);
111 Set<Module> modules = result.getModules();
113 assertEquals(3, modules.size());
114 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology")
119 public void moreRevisionsListKeyTest() throws SourceException,
121 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
124 reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
125 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
126 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
128 EffectiveSchemaContext result = reactor.buildEffective();
129 assertNotNull(result);
133 public void multipleRevisionsTest() throws Exception {
134 for (int i = 0; i < 100; i++) {
135 SchemaContext context = StmtTestUtils
136 .parseYangSources("/semantic-statement-parser/multiple-revisions");
137 assertNotNull(context);
142 public void multipleRevisionsFullTest() throws Exception,
144 for (int i = 0; i < 100; i++) {
145 SchemaContext context = StmtTestUtils
146 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
147 assertNotNull(context);
148 assertEquals(6, context.getModules().size());
149 checkContentFullTest(context);
153 private static void checkContentFullTest(final SchemaContext context) throws ParseException, URISyntaxException {
155 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
156 URI yangTypesNS = new URI(yangTypesNSStr);
158 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
160 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
162 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
165 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
167 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
169 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
172 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
174 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
176 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
179 Module yangTypesModule_20100924 = context.findModuleByName(
180 "ietf-yang-types", rev20100924);
181 Module yangTypesModule_20130516 = context.findModuleByName(
182 "ietf-yang-types", rev20130516);
183 Module yangTypesModule_20130715 = context.findModuleByName(
184 "ietf-yang-types", rev20130715);
186 assertNotNull(yangTypesModule_20100924);
187 assertNotNull(yangTypesModule_20130516);
188 assertNotNull(yangTypesModule_20130715);
190 assertTrue(findTypeDef(yangTypesModule_20100924,
191 dateTimeTypeDef_20100924));
192 assertTrue(findTypeDef(yangTypesModule_20130516,
193 dateTimeTypeDef_20130516));
194 assertTrue(findTypeDef(yangTypesModule_20130715,
195 dateTimeTypeDef_20130715));
197 checkNetconfMonitoringModuleFullTest(context, rev20130715,
198 dateTimeTypeDef_20130715);
200 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
204 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
205 final QName dateTimeTypeDef_20100924) throws URISyntaxException,
207 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
210 Module interfacesModule_20121115 = context.findModuleByName(
211 "ietf-interfaces", rev20121115);
212 assertNotNull(interfacesModule_20121115);
214 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
215 assertEquals(1, imports.size());
216 ModuleImport interfacesImport = imports.iterator().next();
217 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
218 assertEquals(rev20100924, interfacesImport.getRevision());
221 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
222 final Date rev20130715, final QName dateTimeTypeDef_20130715)
223 throws ParseException, URISyntaxException {
224 Date rev20101004 = SimpleDateFormatUtil.getRevisionFormat().parse(
227 Module monitoringModule_20101004 = context.findModuleByName(
228 "ietf-netconf-monitoring", rev20101004);
229 assertNotNull(monitoringModule_20101004);
231 Set<ModuleImport> imports = monitoringModule_20101004.getImports();
232 assertEquals(2, imports.size());
233 for (ModuleImport monitoringImport : imports) {
234 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
235 assertEquals(rev20130715, monitoringImport.getRevision());
241 public void multipleRevisionsSimpleTest() throws Exception {
242 for (int i = 0; i < 1000; i++) {
243 SchemaContext context = StmtTestUtils.parseYangSources(
244 "/semantic-statement-parser/multiple-revisions/simple");
245 assertNotNull(context);
246 assertEquals(5, context.getModules().size());
247 checkContentSimpleTest(context);
251 private static void checkContentSimpleTest(final SchemaContext context)
252 throws ParseException, URISyntaxException {
254 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
255 URI yangTypesNS = new URI(yangTypesNSStr);
257 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
259 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
261 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
264 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
266 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
268 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
271 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
273 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
275 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
278 Module yangTypesModule_20100924 = context.findModuleByName(
279 "ietf-yang-types", rev20100924);
280 Module yangTypesModule_20130516 = context.findModuleByName(
281 "ietf-yang-types", rev20130516);
282 Module yangTypesModule_20130715 = context.findModuleByName(
283 "ietf-yang-types", rev20130715);
285 assertNotNull(yangTypesModule_20100924);
286 assertNotNull(yangTypesModule_20130516);
287 assertNotNull(yangTypesModule_20130715);
289 assertTrue(findTypeDef(yangTypesModule_20100924,
290 dateTimeTypeDef_20100924));
291 assertTrue(findTypeDef(yangTypesModule_20130516,
292 dateTimeTypeDef_20130516));
293 assertTrue(findTypeDef(yangTypesModule_20130715,
294 dateTimeTypeDef_20130715));
296 checkNetconfMonitoringModuleSimpleTest(context, rev20130715,
297 dateTimeTypeDef_20130715);
299 checkInterfacesModuleSimpleTest(context, rev20100924,
300 dateTimeTypeDef_20100924);
304 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
305 final Date rev20100924, final QName dateTimeTypeDef_20100924)
306 throws URISyntaxException, ParseException {
307 String interfacesNSStr = "urn:ietf:params:xml:ns:yang:ietf-interfaces";
308 URI interfacesNS = new URI(interfacesNSStr);
309 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
311 final QNameModule interfacesNS_20121115 = QNameModule.create(
312 interfacesNS, rev20121115);
313 QName lastChange = QName.create(interfacesNS_20121115, "last-change");
315 Module interfacesModule_20121115 = context.findModuleByName(
316 "ietf-interfaces", rev20121115);
317 assertNotNull(interfacesModule_20121115);
319 DataSchemaNode leafLastChange = interfacesModule_20121115
320 .getDataChildByName(lastChange);
321 assertNotNull(leafLastChange);
323 assertTrue(leafLastChange instanceof LeafSchemaNode);
324 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType()
326 assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
328 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
329 assertEquals(1, imports.size());
330 ModuleImport interfacesImport = imports.iterator().next();
331 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
332 assertEquals(rev20100924, interfacesImport.getRevision());
335 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
336 final Date rev20130715, final QName dateTimeTypeDef_20130715)
337 throws ParseException, URISyntaxException {
338 String monitoringNSStr = "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
339 URI monitoringNS = new URI(monitoringNSStr);
341 Date rev19700101 = SimpleDateFormatUtil.getRevisionFormat().parse(
343 final QNameModule monitoring_19700101 = QNameModule.create(
344 monitoringNS, rev19700101);
345 QName lockedTime = QName.create(monitoring_19700101, "locked-time");
347 Module monitoringModule_19700101 = context.findModuleByName(
348 "ietf-netconf-monitoring", rev19700101);
349 assertNotNull(monitoringModule_19700101);
351 DataSchemaNode leafLockedTime = monitoringModule_19700101
352 .getDataChildByName(lockedTime);
353 assertNotNull(leafLockedTime);
355 assertTrue(leafLockedTime instanceof LeafSchemaNode);
356 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType()
358 assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
360 Set<ModuleImport> imports = monitoringModule_19700101.getImports();
361 assertEquals(1, imports.size());
362 ModuleImport monitoringImport = imports.iterator().next();
363 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
364 assertEquals(rev20130715, monitoringImport.getRevision());
367 private static boolean findTypeDef(final Module module, final QName typedef) {
368 Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();
369 for (TypeDefinition<?> typeDefinition : typeDefinitions) {
370 if (typeDefinition.getQName().equals(typedef)) {
378 public void nodeTest() throws Exception {
379 SchemaContext context = StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions/node-test");
380 assertNotNull(context);
382 QName root = QName.create("foo", "2016-04-06", "foo-root");
383 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
384 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160404));
385 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
387 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
388 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160405));
389 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
391 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
392 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160406));
393 assertNull(findDataSchemaNode);