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.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 SchemaContext result = YangInferencePipeline.RFC6020_REACTOR.newBuild().addSource(REVFILE).buildEffective();
73 assertNotNull(result);
74 final Module moduleByName = result.getModules().iterator().next();
75 assertEquals("2015-06-07", moduleByName.getQNameModule().getRevision().get().toString());
79 public void twoRevisionsTest() throws ReactorException {
80 SchemaContext result = YangInferencePipeline.RFC6020_REACTOR.newBuild()
81 .addSources(TED_20130712, TED_20131021, IETF_TYPES)
83 assertNotNull(result);
87 public void twoRevisionsTest2() throws ReactorException {
88 SchemaContext result = YangInferencePipeline.RFC6020_REACTOR.newBuild()
89 .addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES)
91 assertNotNull(result);
92 Set<Module> modules = result.getModules();
94 assertEquals(3, modules.size());
95 assertEquals(2, StmtTestUtils.findModules(modules, "network-topology").size());
99 public void moreRevisionsListKeyTest() throws ReactorException {
100 SchemaContext result = YangInferencePipeline.RFC6020_REACTOR.newBuild()
101 .addSources(TED_20130712, TED_20131021, ISIS_20130712, ISIS_20131021, L3_20130712, L3_20131021)
102 .addSources(IETF_TYPES,NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021)
104 assertNotNull(result);
108 public void multipleRevisionsTest() throws Exception {
109 for (int i = 0; i < 100; i++) {
110 SchemaContext context = StmtTestUtils
111 .parseYangSources("/semantic-statement-parser/multiple-revisions");
112 assertNotNull(context);
117 public void multipleRevisionsFullTest() throws Exception {
118 for (int i = 0; i < 100; i++) {
119 SchemaContext context = StmtTestUtils
120 .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
121 assertNotNull(context);
122 assertEquals(6, context.getModules().size());
123 checkContentFullTest(context);
127 private static void checkContentFullTest(final SchemaContext context) {
128 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
130 final Revision rev20100924 = Revision.of("2010-09-24");
131 final Revision rev20130516 = Revision.of("2013-05-16");
132 final Revision rev20130715 = Revision.of("2013-07-15");
134 final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
135 final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
136 final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
138 final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
139 final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
140 final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
142 Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
143 Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
144 Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
145 assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
146 assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
147 assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
149 checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef20130715);
150 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef20100924);
153 private static void checkInterfacesModuleFullTest(final SchemaContext context, final Revision rev20100924,
154 final QName dateTimeTypeDef20100924) {
155 Revision rev20121115 = Revision.of("2012-11-15");
157 Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
158 Set<ModuleImport> imports = interfacesModule20121115.getImports();
159 assertEquals(1, imports.size());
160 ModuleImport interfacesImport = imports.iterator().next();
161 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
162 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
165 private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
166 final Revision rev20130715, final QName dateTimeTypeDef20130715) {
167 Revision rev20101004 = Revision.of("2010-10-04");
169 Module monitoringModule20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
170 Set<ModuleImport> imports = monitoringModule20101004.getImports();
171 assertEquals(2, imports.size());
172 for (ModuleImport monitoringImport : imports) {
173 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
174 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
180 public void multipleRevisionsSimpleTest() throws Exception {
181 for (int i = 0; i < 1000; i++) {
182 SchemaContext context = StmtTestUtils.parseYangSources(
183 "/semantic-statement-parser/multiple-revisions/simple");
184 assertNotNull(context);
185 assertEquals(5, context.getModules().size());
186 checkContentSimpleTest(context);
190 private static void checkContentSimpleTest(final SchemaContext context) {
191 URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
193 final Revision rev20100924 = Revision.of("2010-09-24");
194 final Revision rev20130516 = Revision.of("2013-05-16");
195 final Revision rev20130715 = Revision.of("2013-07-15");
197 final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
198 final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
199 final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
201 final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
202 final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
203 final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
205 Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
206 Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
207 Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
208 assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
209 assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
210 assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
212 checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef20130715);
213 checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef20100924);
216 private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
217 final Revision rev20100924, final QName dateTimeTypeDef20100924) {
218 URI interfacesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-interfaces");
219 Revision rev20121115 = Revision.of("2012-11-15");
220 final QNameModule interfacesNS20121115 = QNameModule.create(interfacesNS, rev20121115);
221 QName lastChange = QName.create(interfacesNS20121115, "last-change");
223 Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
224 DataSchemaNode leafLastChange = interfacesModule20121115.getDataChildByName(lastChange);
225 assertNotNull(leafLastChange);
227 assertTrue(leafLastChange instanceof LeafSchemaNode);
228 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
229 assertEquals(dateTimeTypeDef20100924, lastChangeTypeQName);
231 Set<ModuleImport> imports = interfacesModule20121115.getImports();
232 assertEquals(1, imports.size());
233 ModuleImport interfacesImport = imports.iterator().next();
234 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
235 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
238 private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
239 final Revision rev20130715, final QName dateTimeTypeDef20130715) {
240 URI monitoringNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
241 final QNameModule monitoring19700101 = QNameModule.create(monitoringNS);
242 QName lockedTime = QName.create(monitoring19700101, "locked-time");
244 Module monitoringModule19700101 = context.findModule("ietf-netconf-monitoring").get();
245 DataSchemaNode leafLockedTime = monitoringModule19700101.getDataChildByName(lockedTime);
246 assertNotNull(leafLockedTime);
248 assertTrue(leafLockedTime instanceof LeafSchemaNode);
249 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
250 assertEquals(dateTimeTypeDef20130715, lockedTimeTypeQName);
252 Set<ModuleImport> imports = monitoringModule19700101.getImports();
253 assertEquals(1, imports.size());
254 ModuleImport monitoringImport = imports.iterator().next();
255 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
256 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
259 private static boolean findTypeDef(final Module module, final QName typedef) {
260 for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
261 if (typeDefinition.getQName().equals(typedef)) {
269 public void nodeTest() throws Exception {
270 SchemaContext context = StmtTestUtils.parseYangSources(
271 "/semantic-statement-parser/multiple-revisions/node-test");
272 assertNotNull(context);
274 QName root = QName.create("foo", "2016-04-06", "foo-root");
275 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
276 SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
278 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
280 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
281 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
283 assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
285 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
286 findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
288 assertNull(findDataSchemaNode);