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;
16 import java.io.FileNotFoundException;
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.stmt.reactor.CrossSourceStatementReactor;
39 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
40 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl;
41 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
43 public class MoreRevisionsTest {
45 private static final YangStatementSourceImpl REVFILE = new YangStatementSourceImpl(
46 "/semantic-statement-parser/revisions/more-revisions-test.yang",
49 private static final YangStatementSourceImpl TED_20130712 = new YangStatementSourceImpl(
50 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang",
53 private static final YangStatementSourceImpl TED_20131021 = new YangStatementSourceImpl(
54 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang",
57 private static final YangStatementSourceImpl IETF_TYPES = new YangStatementSourceImpl(
58 "/ietf/ietf-inet-types@2010-09-24.yang", false);
60 private static final YangStatementSourceImpl NETWORK_TOPOLOGY_20130712 = new YangStatementSourceImpl(
61 "/ietf/network-topology@2013-07-12.yang", false);
63 private static final YangStatementSourceImpl NETWORK_TOPOLOGY_20131021 = new YangStatementSourceImpl(
64 "/ietf/network-topology@2013-10-21.yang", false);
66 private static final YangStatementSourceImpl ISIS_20130712 = new YangStatementSourceImpl(
67 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang",
70 private static final YangStatementSourceImpl ISIS_20131021 = new YangStatementSourceImpl(
71 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang",
74 private static final YangStatementSourceImpl L3_20130712 = new YangStatementSourceImpl(
75 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang",
78 private static final YangStatementSourceImpl L3_20131021 = new YangStatementSourceImpl(
79 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang",
83 public void readAndParseYangFileTest() throws SourceException,
85 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
87 reactor.addSource(REVFILE);
88 EffectiveSchemaContext result = reactor.buildEffective();
89 assertNotNull(result);
90 final Module moduleByName = result.getModules().iterator().next();
91 final QNameModule qNameModule = moduleByName.getQNameModule();
92 final String formattedRevision = qNameModule.getFormattedRevision();
93 assertEquals(formattedRevision, "2015-06-07");
97 public void twoRevisionsTest() throws SourceException, ReactorException {
98 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
101 reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
103 EffectiveSchemaContext result = reactor.buildEffective();
104 assertNotNull(result);
109 public void twoRevisionsTest2() throws SourceException, ReactorException {
110 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
113 reactor.addSources(NETWORK_TOPOLOGY_20130712,
114 NETWORK_TOPOLOGY_20131021, IETF_TYPES);
116 EffectiveSchemaContext result = reactor.buildEffective();
117 assertNotNull(result);
118 Set<Module> modules = result.getModules();
120 assertEquals(3, modules.size());
121 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology")
126 public void moreRevisionsListKeyTest() throws SourceException,
128 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
131 reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
132 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
133 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
135 EffectiveSchemaContext result = reactor.buildEffective();
136 assertNotNull(result);
140 public void multipleRevisionsTest() throws SourceException,
141 ReactorException, FileNotFoundException, URISyntaxException {
142 for (int i = 0; i < 100; i++) {
143 SchemaContext context = StmtTestUtils
144 .parseYangSources("/semantic-statement-parser/multiple-revisions");
145 assertNotNull(context);
150 public void multipleRevisionsFullTest() throws SourceException,
151 ReactorException, FileNotFoundException, URISyntaxException,
153 for (int i = 0; i < 100; i++) {
154 SchemaContext context = StmtTestUtils
155 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
156 assertNotNull(context);
157 assertEquals(6, context.getModules().size());
158 checkContentFullTest(context);
162 private static void checkContentFullTest(final SchemaContext context) throws ParseException,
165 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
166 URI yangTypesNS = new URI(yangTypesNSStr);
168 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
170 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
172 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
175 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
177 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
179 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
182 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
184 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
186 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
189 Module yangTypesModule_20100924 = context.findModuleByName(
190 "ietf-yang-types", rev20100924);
191 Module yangTypesModule_20130516 = context.findModuleByName(
192 "ietf-yang-types", rev20130516);
193 Module yangTypesModule_20130715 = context.findModuleByName(
194 "ietf-yang-types", rev20130715);
196 assertNotNull(yangTypesModule_20100924);
197 assertNotNull(yangTypesModule_20130516);
198 assertNotNull(yangTypesModule_20130715);
200 assertTrue(findTypeDef(yangTypesModule_20100924,
201 dateTimeTypeDef_20100924));
202 assertTrue(findTypeDef(yangTypesModule_20130516,
203 dateTimeTypeDef_20130516));
204 assertTrue(findTypeDef(yangTypesModule_20130715,
205 dateTimeTypeDef_20130715));
207 checkNetconfMonitoringModuleFullTest(context, rev20130715,
208 dateTimeTypeDef_20130715);
210 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
214 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
215 final QName dateTimeTypeDef_20100924) throws URISyntaxException,
217 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
220 Module interfacesModule_20121115 = context.findModuleByName(
221 "ietf-interfaces", rev20121115);
222 assertNotNull(interfacesModule_20121115);
224 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
225 assertEquals(1, imports.size());
226 ModuleImport interfacesImport = imports.iterator().next();
227 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
228 assertEquals(rev20100924, interfacesImport.getRevision());
231 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
232 final Date rev20130715, final QName dateTimeTypeDef_20130715)
233 throws ParseException, URISyntaxException {
234 Date rev20101004 = SimpleDateFormatUtil.getRevisionFormat().parse(
237 Module monitoringModule_20101004 = context.findModuleByName(
238 "ietf-netconf-monitoring", rev20101004);
239 assertNotNull(monitoringModule_20101004);
241 Set<ModuleImport> imports = monitoringModule_20101004.getImports();
242 assertEquals(2, imports.size());
243 for (ModuleImport monitoringImport : imports) {
244 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
245 assertEquals(rev20130715, monitoringImport.getRevision());
251 public void multipleRevisionsSimpleTest() throws SourceException,
252 ReactorException, FileNotFoundException, URISyntaxException,
254 for (int i = 0; i < 1000; i++) {
255 SchemaContext context = StmtTestUtils
256 .parseYangSources("/semantic-statement-parser/multiple-revisions/simple");
257 assertNotNull(context);
258 assertEquals(5, context.getModules().size());
259 checkContentSimpleTest(context);
263 private static void checkContentSimpleTest(final SchemaContext context)
264 throws ParseException, URISyntaxException {
266 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
267 URI yangTypesNS = new URI(yangTypesNSStr);
269 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
271 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
273 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
276 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
278 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
280 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
283 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
285 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
287 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
290 Module yangTypesModule_20100924 = context.findModuleByName(
291 "ietf-yang-types", rev20100924);
292 Module yangTypesModule_20130516 = context.findModuleByName(
293 "ietf-yang-types", rev20130516);
294 Module yangTypesModule_20130715 = context.findModuleByName(
295 "ietf-yang-types", rev20130715);
297 assertNotNull(yangTypesModule_20100924);
298 assertNotNull(yangTypesModule_20130516);
299 assertNotNull(yangTypesModule_20130715);
301 assertTrue(findTypeDef(yangTypesModule_20100924,
302 dateTimeTypeDef_20100924));
303 assertTrue(findTypeDef(yangTypesModule_20130516,
304 dateTimeTypeDef_20130516));
305 assertTrue(findTypeDef(yangTypesModule_20130715,
306 dateTimeTypeDef_20130715));
308 checkNetconfMonitoringModuleSimpleTest(context, rev20130715,
309 dateTimeTypeDef_20130715);
311 checkInterfacesModuleSimpleTest(context, rev20100924,
312 dateTimeTypeDef_20100924);
316 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
317 final Date rev20100924, final QName dateTimeTypeDef_20100924)
318 throws URISyntaxException, ParseException {
319 String interfacesNSStr = "urn:ietf:params:xml:ns:yang:ietf-interfaces";
320 URI interfacesNS = new URI(interfacesNSStr);
321 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
323 final QNameModule interfacesNS_20121115 = QNameModule.create(
324 interfacesNS, rev20121115);
325 QName lastChange = QName.create(interfacesNS_20121115, "last-change");
327 Module interfacesModule_20121115 = context.findModuleByName(
328 "ietf-interfaces", rev20121115);
329 assertNotNull(interfacesModule_20121115);
331 DataSchemaNode leafLastChange = interfacesModule_20121115
332 .getDataChildByName(lastChange);
333 assertNotNull(leafLastChange);
335 assertTrue(leafLastChange instanceof LeafSchemaNode);
336 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType()
338 assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
340 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
341 assertEquals(1, imports.size());
342 ModuleImport interfacesImport = imports.iterator().next();
343 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
344 assertEquals(rev20100924, interfacesImport.getRevision());
347 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
348 final Date rev20130715, final QName dateTimeTypeDef_20130715)
349 throws ParseException, URISyntaxException {
350 String monitoringNSStr = "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
351 URI monitoringNS = new URI(monitoringNSStr);
353 Date rev19700101 = SimpleDateFormatUtil.getRevisionFormat().parse(
355 final QNameModule monitoring_19700101 = QNameModule.create(
356 monitoringNS, rev19700101);
357 QName lockedTime = QName.create(monitoring_19700101, "locked-time");
359 Module monitoringModule_19700101 = context.findModuleByName(
360 "ietf-netconf-monitoring", rev19700101);
361 assertNotNull(monitoringModule_19700101);
363 DataSchemaNode leafLockedTime = monitoringModule_19700101
364 .getDataChildByName(lockedTime);
365 assertNotNull(leafLockedTime);
367 assertTrue(leafLockedTime instanceof LeafSchemaNode);
368 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType()
370 assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
372 Set<ModuleImport> imports = monitoringModule_19700101.getImports();
373 assertEquals(1, imports.size());
374 ModuleImport monitoringImport = imports.iterator().next();
375 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
376 assertEquals(rev20130715, monitoringImport.getRevision());
379 private static boolean findTypeDef(final Module module, final QName typedef) {
380 Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();
381 for (TypeDefinition<?> typeDefinition : typeDefinitions) {
382 if (typeDefinition.getQName().equals(typedef)) {
390 public void nodeTest() throws Exception {
391 SchemaContext context = StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions/node-test");
392 assertNotNull(context);
394 QName root = QName.create("foo", "2016-04-06", "foo-root");
395 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
396 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160404));
397 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
399 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
400 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160405));
401 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
403 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
404 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160406));
405 assertNull(findDataSchemaNode);