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.util.Date;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.QName;
22 import org.opendaylight.yangtools.yang.common.QNameModule;
23 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.Module;
27 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
28 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
29 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
31 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
32 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
33 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
34 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
35 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
36 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
38 public class MoreRevisionsTest {
40 private static final StatementStreamSource REVFILE = sourceForResource(
41 "/semantic-statement-parser/revisions/more-revisions-test.yang");
43 private static final StatementStreamSource TED_20130712 = sourceForResource(
44 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
46 private static final StatementStreamSource TED_20131021 = sourceForResource(
47 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
49 private static final StatementStreamSource IETF_TYPES = sourceForResource(
50 "/ietf/ietf-inet-types@2010-09-24.yang");
52 private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
53 "/ietf/network-topology@2013-07-12.yang");
55 private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
56 "/ietf/network-topology@2013-10-21.yang");
58 private static final StatementStreamSource ISIS_20130712 = sourceForResource(
59 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
61 private static final StatementStreamSource ISIS_20131021 = sourceForResource(
62 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
64 private static final StatementStreamSource L3_20130712 = sourceForResource(
65 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
67 private static final StatementStreamSource L3_20131021 = sourceForResource(
68 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
71 public void readAndParseYangFileTest() throws ReactorException {
72 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
73 reactor.addSource(REVFILE);
74 SchemaContext result = reactor.buildEffective();
75 assertNotNull(result);
76 final Module moduleByName = result.getModules().iterator().next();
77 final QNameModule qNameModule = moduleByName.getQNameModule();
78 final String formattedRevision = qNameModule.getFormattedRevision();
79 assertEquals(formattedRevision, "2015-06-07");
83 public void twoRevisionsTest() throws ReactorException {
84 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
87 reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
89 SchemaContext result = reactor.buildEffective();
90 assertNotNull(result);
94 public void twoRevisionsTest2() throws ReactorException {
95 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
97 reactor.addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES);
99 SchemaContext result = reactor.buildEffective();
100 assertNotNull(result);
101 Set<Module> modules = result.getModules();
103 assertEquals(3, modules.size());
104 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology").size());
108 public void moreRevisionsListKeyTest() throws ReactorException {
109 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
111 reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
112 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
113 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
115 SchemaContext result = reactor.buildEffective();
116 assertNotNull(result);
120 public void multipleRevisionsTest() throws Exception {
121 for (int i = 0; i < 100; i++) {
122 SchemaContext context = StmtTestUtils
123 .parseYangSources("/semantic-statement-parser/multiple-revisions");
124 assertNotNull(context);
129 public void multipleRevisionsFullTest() throws Exception {
130 for (int i = 0; i < 100; i++) {
131 SchemaContext context = StmtTestUtils
132 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
133 assertNotNull(context);
134 assertEquals(6, context.getModules().size());
135 checkContentFullTest(context);
139 private static void checkContentFullTest(final SchemaContext context) {
140 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
142 final Date rev20100924 = QName.parseRevision("2010-09-24");
143 final Date rev20130516 = QName.parseRevision("2013-05-16");
144 final Date rev20130715 = QName.parseRevision("2013-07-15");
146 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
147 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
148 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
150 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
151 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
152 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
154 Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
155 Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
156 Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
157 assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
158 assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
159 assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
161 checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef_20130715);
162 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
165 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
166 final QName dateTimeTypeDef_20100924) {
167 Date rev20121115 = QName.parseRevision("2012-11-15");
169 Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
170 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
171 assertEquals(1, imports.size());
172 ModuleImport interfacesImport = imports.iterator().next();
173 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
174 assertEquals(rev20100924, interfacesImport.getRevision());
177 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
178 final Date rev20130715, final QName dateTimeTypeDef_20130715) {
179 Date rev20101004 = QName.parseRevision("2010-10-04");
181 Module monitoringModule_20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
182 Set<ModuleImport> imports = monitoringModule_20101004.getImports();
183 assertEquals(2, imports.size());
184 for (ModuleImport monitoringImport : imports) {
185 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
186 assertEquals(rev20130715, monitoringImport.getRevision());
192 public void multipleRevisionsSimpleTest() throws Exception {
193 for (int i = 0; i < 1000; i++) {
194 SchemaContext context = StmtTestUtils.parseYangSources(
195 "/semantic-statement-parser/multiple-revisions/simple");
196 assertNotNull(context);
197 assertEquals(5, context.getModules().size());
198 checkContentSimpleTest(context);
202 private static void checkContentSimpleTest(final SchemaContext context) {
203 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
205 final Date rev20100924 = QName.parseRevision("2010-09-24");
206 final Date rev20130516 = QName.parseRevision("2013-05-16");
207 final Date rev20130715 = QName.parseRevision("2013-07-15");
209 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
210 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
211 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
213 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
214 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
215 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
217 Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
218 Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
219 Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
220 assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
221 assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
222 assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
224 checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef_20130715);
225 checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef_20100924);
228 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
229 final Date rev20100924, final QName dateTimeTypeDef_20100924) {
230 URI interfacesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-interfaces");
231 Date rev20121115 = QName.parseRevision("2012-11-15");
232 final QNameModule interfacesNS_20121115 = QNameModule.create(interfacesNS, rev20121115);
233 QName lastChange = QName.create(interfacesNS_20121115, "last-change");
235 Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
236 DataSchemaNode leafLastChange = interfacesModule_20121115.getDataChildByName(lastChange);
237 assertNotNull(leafLastChange);
239 assertTrue(leafLastChange instanceof LeafSchemaNode);
240 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
241 assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
243 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
244 assertEquals(1, imports.size());
245 ModuleImport interfacesImport = imports.iterator().next();
246 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
247 assertEquals(rev20100924, interfacesImport.getRevision());
250 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
251 final Date rev20130715, final QName dateTimeTypeDef_20130715) {
252 URI monitoringNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
253 final QNameModule monitoring_19700101 = QNameModule.create(monitoringNS, null);
254 QName lockedTime = QName.create(monitoring_19700101, "locked-time");
256 Module monitoringModule_19700101 = context.findModule("ietf-netconf-monitoring", null).get();
257 DataSchemaNode leafLockedTime = monitoringModule_19700101.getDataChildByName(lockedTime);
258 assertNotNull(leafLockedTime);
260 assertTrue(leafLockedTime instanceof LeafSchemaNode);
261 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
262 assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
264 Set<ModuleImport> imports = monitoringModule_19700101.getImports();
265 assertEquals(1, imports.size());
266 ModuleImport monitoringImport = imports.iterator().next();
267 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
268 assertEquals(rev20130715, monitoringImport.getRevision());
271 private static boolean findTypeDef(final Module module, final QName typedef) {
272 for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
273 if (typeDefinition.getQName().equals(typedef)) {
281 public void nodeTest() throws Exception {
282 SchemaContext context = StmtTestUtils.parseYangSources(
283 "/semantic-statement-parser/multiple-revisions/node-test");
284 assertNotNull(context);
286 QName root = QName.create("foo", "2016-04-06", "foo-root");
287 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
288 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
290 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
292 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
293 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
295 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
297 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
298 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
300 assertNull(findDataSchemaNode);