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;
42 public class MoreRevisionsTest {
44 private static final StatementStreamSource REVFILE = sourceForResource(
45 "/semantic-statement-parser/revisions/more-revisions-test.yang");
47 private static final StatementStreamSource TED_20130712 = sourceForResource(
48 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
50 private static final StatementStreamSource TED_20131021 = sourceForResource(
51 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
53 private static final StatementStreamSource IETF_TYPES = sourceForResource(
54 "/ietf/ietf-inet-types@2010-09-24.yang");
56 private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
57 "/ietf/network-topology@2013-07-12.yang");
59 private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
60 "/ietf/network-topology@2013-10-21.yang");
62 private static final StatementStreamSource ISIS_20130712 = sourceForResource(
63 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
65 private static final StatementStreamSource ISIS_20131021 = sourceForResource(
66 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
68 private static final StatementStreamSource L3_20130712 = sourceForResource(
69 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
71 private static final StatementStreamSource L3_20131021 = sourceForResource(
72 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
75 public void readAndParseYangFileTest() throws SourceException,
77 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
79 reactor.addSource(REVFILE);
80 SchemaContext result = reactor.buildEffective();
81 assertNotNull(result);
82 final Module moduleByName = result.getModules().iterator().next();
83 final QNameModule qNameModule = moduleByName.getQNameModule();
84 final String formattedRevision = qNameModule.getFormattedRevision();
85 assertEquals(formattedRevision, "2015-06-07");
89 public void twoRevisionsTest() throws SourceException, ReactorException {
90 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
93 reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
95 SchemaContext result = reactor.buildEffective();
96 assertNotNull(result);
101 public void twoRevisionsTest2() throws SourceException, ReactorException {
102 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
105 reactor.addSources(NETWORK_TOPOLOGY_20130712,
106 NETWORK_TOPOLOGY_20131021, IETF_TYPES);
108 SchemaContext result = reactor.buildEffective();
109 assertNotNull(result);
110 Set<Module> modules = result.getModules();
112 assertEquals(3, modules.size());
113 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology")
118 public void moreRevisionsListKeyTest() throws SourceException,
120 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
123 reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
124 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
125 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
127 SchemaContext result = reactor.buildEffective();
128 assertNotNull(result);
132 public void multipleRevisionsTest() throws Exception {
133 for (int i = 0; i < 100; i++) {
134 SchemaContext context = StmtTestUtils
135 .parseYangSources("/semantic-statement-parser/multiple-revisions");
136 assertNotNull(context);
141 public void multipleRevisionsFullTest() throws Exception,
143 for (int i = 0; i < 100; i++) {
144 SchemaContext context = StmtTestUtils
145 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
146 assertNotNull(context);
147 assertEquals(6, context.getModules().size());
148 checkContentFullTest(context);
152 private static void checkContentFullTest(final SchemaContext context) throws ParseException, URISyntaxException {
154 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
155 URI yangTypesNS = new URI(yangTypesNSStr);
157 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
159 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
161 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
164 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
166 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
168 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
171 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
173 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
175 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
178 Module yangTypesModule_20100924 = context.findModuleByName(
179 "ietf-yang-types", rev20100924);
180 Module yangTypesModule_20130516 = context.findModuleByName(
181 "ietf-yang-types", rev20130516);
182 Module yangTypesModule_20130715 = context.findModuleByName(
183 "ietf-yang-types", rev20130715);
185 assertNotNull(yangTypesModule_20100924);
186 assertNotNull(yangTypesModule_20130516);
187 assertNotNull(yangTypesModule_20130715);
189 assertTrue(findTypeDef(yangTypesModule_20100924,
190 dateTimeTypeDef_20100924));
191 assertTrue(findTypeDef(yangTypesModule_20130516,
192 dateTimeTypeDef_20130516));
193 assertTrue(findTypeDef(yangTypesModule_20130715,
194 dateTimeTypeDef_20130715));
196 checkNetconfMonitoringModuleFullTest(context, rev20130715,
197 dateTimeTypeDef_20130715);
199 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
203 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
204 final QName dateTimeTypeDef_20100924) throws URISyntaxException,
206 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
209 Module interfacesModule_20121115 = context.findModuleByName(
210 "ietf-interfaces", rev20121115);
211 assertNotNull(interfacesModule_20121115);
213 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
214 assertEquals(1, imports.size());
215 ModuleImport interfacesImport = imports.iterator().next();
216 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
217 assertEquals(rev20100924, interfacesImport.getRevision());
220 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
221 final Date rev20130715, final QName dateTimeTypeDef_20130715)
222 throws ParseException, URISyntaxException {
223 Date rev20101004 = SimpleDateFormatUtil.getRevisionFormat().parse(
226 Module monitoringModule_20101004 = context.findModuleByName(
227 "ietf-netconf-monitoring", rev20101004);
228 assertNotNull(monitoringModule_20101004);
230 Set<ModuleImport> imports = monitoringModule_20101004.getImports();
231 assertEquals(2, imports.size());
232 for (ModuleImport monitoringImport : imports) {
233 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
234 assertEquals(rev20130715, monitoringImport.getRevision());
240 public void multipleRevisionsSimpleTest() throws Exception {
241 for (int i = 0; i < 1000; i++) {
242 SchemaContext context = StmtTestUtils.parseYangSources(
243 "/semantic-statement-parser/multiple-revisions/simple");
244 assertNotNull(context);
245 assertEquals(5, context.getModules().size());
246 checkContentSimpleTest(context);
250 private static void checkContentSimpleTest(final SchemaContext context)
251 throws ParseException, URISyntaxException {
253 String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
254 URI yangTypesNS = new URI(yangTypesNSStr);
256 Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
258 Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
260 Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
263 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
265 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
267 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
270 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
272 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
274 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
277 Module yangTypesModule_20100924 = context.findModuleByName(
278 "ietf-yang-types", rev20100924);
279 Module yangTypesModule_20130516 = context.findModuleByName(
280 "ietf-yang-types", rev20130516);
281 Module yangTypesModule_20130715 = context.findModuleByName(
282 "ietf-yang-types", rev20130715);
284 assertNotNull(yangTypesModule_20100924);
285 assertNotNull(yangTypesModule_20130516);
286 assertNotNull(yangTypesModule_20130715);
288 assertTrue(findTypeDef(yangTypesModule_20100924,
289 dateTimeTypeDef_20100924));
290 assertTrue(findTypeDef(yangTypesModule_20130516,
291 dateTimeTypeDef_20130516));
292 assertTrue(findTypeDef(yangTypesModule_20130715,
293 dateTimeTypeDef_20130715));
295 checkNetconfMonitoringModuleSimpleTest(context, rev20130715,
296 dateTimeTypeDef_20130715);
298 checkInterfacesModuleSimpleTest(context, rev20100924,
299 dateTimeTypeDef_20100924);
303 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
304 final Date rev20100924, final QName dateTimeTypeDef_20100924)
305 throws URISyntaxException, ParseException {
306 String interfacesNSStr = "urn:ietf:params:xml:ns:yang:ietf-interfaces";
307 URI interfacesNS = new URI(interfacesNSStr);
308 Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
310 final QNameModule interfacesNS_20121115 = QNameModule.create(
311 interfacesNS, rev20121115);
312 QName lastChange = QName.create(interfacesNS_20121115, "last-change");
314 Module interfacesModule_20121115 = context.findModuleByName(
315 "ietf-interfaces", rev20121115);
316 assertNotNull(interfacesModule_20121115);
318 DataSchemaNode leafLastChange = interfacesModule_20121115
319 .getDataChildByName(lastChange);
320 assertNotNull(leafLastChange);
322 assertTrue(leafLastChange instanceof LeafSchemaNode);
323 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType()
325 assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
327 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
328 assertEquals(1, imports.size());
329 ModuleImport interfacesImport = imports.iterator().next();
330 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
331 assertEquals(rev20100924, interfacesImport.getRevision());
334 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
335 final Date rev20130715, final QName dateTimeTypeDef_20130715)
336 throws ParseException, URISyntaxException {
337 String monitoringNSStr = "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
338 URI monitoringNS = new URI(monitoringNSStr);
340 Date rev19700101 = SimpleDateFormatUtil.getRevisionFormat().parse(
342 final QNameModule monitoring_19700101 = QNameModule.create(
343 monitoringNS, rev19700101);
344 QName lockedTime = QName.create(monitoring_19700101, "locked-time");
346 Module monitoringModule_19700101 = context.findModuleByName(
347 "ietf-netconf-monitoring", rev19700101);
348 assertNotNull(monitoringModule_19700101);
350 DataSchemaNode leafLockedTime = monitoringModule_19700101
351 .getDataChildByName(lockedTime);
352 assertNotNull(leafLockedTime);
354 assertTrue(leafLockedTime instanceof LeafSchemaNode);
355 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType()
357 assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
359 Set<ModuleImport> imports = monitoringModule_19700101.getImports();
360 assertEquals(1, imports.size());
361 ModuleImport monitoringImport = imports.iterator().next();
362 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
363 assertEquals(rev20130715, monitoringImport.getRevision());
366 private static boolean findTypeDef(final Module module, final QName typedef) {
367 Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();
368 for (TypeDefinition<?> typeDefinition : typeDefinitions) {
369 if (typeDefinition.getQName().equals(typedef)) {
377 public void nodeTest() throws Exception {
378 SchemaContext context = StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions/node-test");
379 assertNotNull(context);
381 QName root = QName.create("foo", "2016-04-06", "foo-root");
382 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
383 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160404));
384 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
386 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
387 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160405));
388 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
390 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
391 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160406));
392 assertNull(findDataSchemaNode);