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.Optional;
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.common.Revision;
24 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.Module;
28 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
30 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
32 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
33 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
34 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
35 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
36 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
37 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
39 public class MoreRevisionsTest {
41 private static final StatementStreamSource REVFILE = sourceForResource(
42 "/semantic-statement-parser/revisions/more-revisions-test.yang");
44 private static final StatementStreamSource TED_20130712 = sourceForResource(
45 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
47 private static final StatementStreamSource TED_20131021 = sourceForResource(
48 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
50 private static final StatementStreamSource IETF_TYPES = sourceForResource(
51 "/ietf/ietf-inet-types@2010-09-24.yang");
53 private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
54 "/ietf/network-topology@2013-07-12.yang");
56 private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
57 "/ietf/network-topology@2013-10-21.yang");
59 private static final StatementStreamSource ISIS_20130712 = sourceForResource(
60 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
62 private static final StatementStreamSource ISIS_20131021 = sourceForResource(
63 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
65 private static final StatementStreamSource L3_20130712 = sourceForResource(
66 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
68 private static final StatementStreamSource L3_20131021 = sourceForResource(
69 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
72 public void readAndParseYangFileTest() throws ReactorException {
73 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
74 reactor.addSource(REVFILE);
75 SchemaContext result = reactor.buildEffective();
76 assertNotNull(result);
77 final Module moduleByName = result.getModules().iterator().next();
78 final QNameModule qNameModule = moduleByName.getQNameModule();
79 final String formattedRevision = qNameModule.getFormattedRevision();
80 assertEquals(formattedRevision, "2015-06-07");
84 public void twoRevisionsTest() throws ReactorException {
85 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
88 reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
90 SchemaContext result = reactor.buildEffective();
91 assertNotNull(result);
95 public void twoRevisionsTest2() throws ReactorException {
96 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
98 reactor.addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES);
100 SchemaContext result = reactor.buildEffective();
101 assertNotNull(result);
102 Set<Module> modules = result.getModules();
104 assertEquals(3, modules.size());
105 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology").size());
109 public void moreRevisionsListKeyTest() throws ReactorException {
110 CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
112 reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
113 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
114 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
116 SchemaContext result = reactor.buildEffective();
117 assertNotNull(result);
121 public void multipleRevisionsTest() throws Exception {
122 for (int i = 0; i < 100; i++) {
123 SchemaContext context = StmtTestUtils
124 .parseYangSources("/semantic-statement-parser/multiple-revisions");
125 assertNotNull(context);
130 public void multipleRevisionsFullTest() throws Exception {
131 for (int i = 0; i < 100; i++) {
132 SchemaContext context = StmtTestUtils
133 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
134 assertNotNull(context);
135 assertEquals(6, context.getModules().size());
136 checkContentFullTest(context);
140 private static void checkContentFullTest(final SchemaContext context) {
141 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
143 final Revision rev20100924 = Revision.valueOf("2010-09-24");
144 final Revision rev20130516 = Revision.valueOf("2013-05-16");
145 final Revision rev20130715 = Revision.valueOf("2013-07-15");
147 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
148 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
149 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
151 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
152 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
153 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
155 Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
156 Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
157 Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
158 assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
159 assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
160 assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
162 checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef_20130715);
163 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
166 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Revision rev20100924,
167 final QName dateTimeTypeDef_20100924) {
168 Revision rev20121115 = Revision.valueOf("2012-11-15");
170 Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
171 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
172 assertEquals(1, imports.size());
173 ModuleImport interfacesImport = imports.iterator().next();
174 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
175 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
178 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
179 final Revision rev20130715, final QName dateTimeTypeDef_20130715) {
180 Revision rev20101004 = Revision.valueOf("2010-10-04");
182 Module monitoringModule_20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
183 Set<ModuleImport> imports = monitoringModule_20101004.getImports();
184 assertEquals(2, imports.size());
185 for (ModuleImport monitoringImport : imports) {
186 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
187 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
193 public void multipleRevisionsSimpleTest() throws Exception {
194 for (int i = 0; i < 1000; i++) {
195 SchemaContext context = StmtTestUtils.parseYangSources(
196 "/semantic-statement-parser/multiple-revisions/simple");
197 assertNotNull(context);
198 assertEquals(5, context.getModules().size());
199 checkContentSimpleTest(context);
203 private static void checkContentSimpleTest(final SchemaContext context) {
204 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
206 final Revision rev20100924 = Revision.valueOf("2010-09-24");
207 final Revision rev20130516 = Revision.valueOf("2013-05-16");
208 final Revision rev20130715 = Revision.valueOf("2013-07-15");
210 final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
211 final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
212 final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
214 final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
215 final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
216 final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
218 Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
219 Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
220 Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
221 assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
222 assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
223 assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
225 checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef_20130715);
226 checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef_20100924);
229 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
230 final Revision rev20100924, final QName dateTimeTypeDef_20100924) {
231 URI interfacesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-interfaces");
232 Revision rev20121115 = Revision.valueOf("2012-11-15");
233 final QNameModule interfacesNS_20121115 = QNameModule.create(interfacesNS, rev20121115);
234 QName lastChange = QName.create(interfacesNS_20121115, "last-change");
236 Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
237 DataSchemaNode leafLastChange = interfacesModule_20121115.getDataChildByName(lastChange);
238 assertNotNull(leafLastChange);
240 assertTrue(leafLastChange instanceof LeafSchemaNode);
241 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
242 assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
244 Set<ModuleImport> imports = interfacesModule_20121115.getImports();
245 assertEquals(1, imports.size());
246 ModuleImport interfacesImport = imports.iterator().next();
247 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
248 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
251 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
252 final Revision rev20130715, final QName dateTimeTypeDef_20130715) {
253 URI monitoringNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
254 final QNameModule monitoring_19700101 = QNameModule.create(monitoringNS);
255 QName lockedTime = QName.create(monitoring_19700101, "locked-time");
257 Module monitoringModule_19700101 = context.findModule("ietf-netconf-monitoring").get();
258 DataSchemaNode leafLockedTime = monitoringModule_19700101.getDataChildByName(lockedTime);
259 assertNotNull(leafLockedTime);
261 assertTrue(leafLockedTime instanceof LeafSchemaNode);
262 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
263 assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
265 Set<ModuleImport> imports = monitoringModule_19700101.getImports();
266 assertEquals(1, imports.size());
267 ModuleImport monitoringImport = imports.iterator().next();
268 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
269 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
272 private static boolean findTypeDef(final Module module, final QName typedef) {
273 for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
274 if (typeDefinition.getQName().equals(typedef)) {
282 public void nodeTest() throws Exception {
283 SchemaContext context = StmtTestUtils.parseYangSources(
284 "/semantic-statement-parser/multiple-revisions/node-test");
285 assertNotNull(context);
287 QName root = QName.create("foo", "2016-04-06", "foo-root");
288 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
289 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
291 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
293 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
294 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
296 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
298 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
299 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
301 assertNull(findDataSchemaNode);