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
8 package org.opendaylight.yangtools.yang.stmt;
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
17 import java.util.Collection;
18 import java.util.Optional;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.common.QNameModule;
22 import org.opendaylight.yangtools.yang.common.Revision;
23 import org.opendaylight.yangtools.yang.common.XMLNamespace;
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.EffectiveModelContext;
27 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.Module;
29 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
30 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
31 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
32 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
33 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
35 public class MoreRevisionsTest {
37 private static final StatementStreamSource REVFILE = sourceForResource(
38 "/semantic-statement-parser/revisions/more-revisions-test.yang");
40 private static final StatementStreamSource TED_20130712 = sourceForResource(
41 "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
43 private static final StatementStreamSource TED_20131021 = sourceForResource(
44 "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
46 private static final StatementStreamSource IETF_TYPES = sourceForResource(
47 "/ietf/ietf-inet-types@2010-09-24.yang");
49 private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
50 "/ietf/network-topology@2013-07-12.yang");
52 private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
53 "/ietf/network-topology@2013-10-21.yang");
55 private static final StatementStreamSource ISIS_20130712 = sourceForResource(
56 "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
58 private static final StatementStreamSource ISIS_20131021 = sourceForResource(
59 "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
61 private static final StatementStreamSource L3_20130712 = sourceForResource(
62 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
64 private static final StatementStreamSource L3_20131021 = sourceForResource(
65 "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
68 public void readAndParseYangFileTest() throws ReactorException {
69 EffectiveModelContext result = RFC7950Reactors.defaultReactor().newBuild().addSource(REVFILE).buildEffective();
70 final Module moduleByName = result.getModules().iterator().next();
71 assertEquals("2015-06-07", moduleByName.getQNameModule().getRevision().get().toString());
75 public void twoRevisionsTest() throws ReactorException {
76 RFC7950Reactors.defaultReactor().newBuild().addSources(TED_20130712, TED_20131021, IETF_TYPES).buildEffective();
80 public void twoRevisionsTest2() throws ReactorException {
81 final var context = RFC7950Reactors.defaultReactor().newBuild()
82 .addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES)
85 assertEquals(3, context.getModuleStatements().size());
86 assertEquals(2, context.findModules("network-topology").size());
90 public void moreRevisionsListKeyTest() throws ReactorException {
91 RFC7950Reactors.defaultReactor().newBuild()
92 .addSources(TED_20130712, TED_20131021, ISIS_20130712, ISIS_20131021, L3_20130712, L3_20131021)
93 .addSources(IETF_TYPES,NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021)
98 public void multipleRevisionsTest() throws Exception {
99 for (int i = 0; i < 100; i++) {
100 assertNotNull(StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions"));
105 public void multipleRevisionsFullTest() throws Exception {
106 for (int i = 0; i < 100; i++) {
107 EffectiveModelContext context =
108 StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions/full");
109 assertEquals(6, context.getModules().size());
110 checkContentFullTest(context);
114 private static void checkContentFullTest(final EffectiveModelContext context) {
115 final XMLNamespace yangTypesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-yang-types");
117 final Revision rev20100924 = Revision.of("2010-09-24");
118 final Revision rev20130516 = Revision.of("2013-05-16");
119 final Revision rev20130715 = Revision.of("2013-07-15");
121 final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
122 final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
123 final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
125 final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
126 final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
127 final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
129 Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
130 Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
131 Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
132 assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
133 assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
134 assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
136 checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef20130715);
137 checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef20100924);
140 private static void checkInterfacesModuleFullTest(final EffectiveModelContext context, final Revision rev20100924,
141 final QName dateTimeTypeDef20100924) {
142 Revision rev20121115 = Revision.of("2012-11-15");
144 Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
145 Collection<? extends ModuleImport> imports = interfacesModule20121115.getImports();
146 assertEquals(1, imports.size());
147 ModuleImport interfacesImport = imports.iterator().next();
148 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
149 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
152 private static void checkNetconfMonitoringModuleFullTest(final EffectiveModelContext context,
153 final Revision rev20130715, final QName dateTimeTypeDef20130715) {
154 Revision rev20101004 = Revision.of("2010-10-04");
156 Module monitoringModule20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
157 Collection<? extends ModuleImport> imports = monitoringModule20101004.getImports();
158 assertEquals(2, imports.size());
159 for (ModuleImport monitoringImport : imports) {
160 if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
161 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
167 public void multipleRevisionsSimpleTest() throws Exception {
168 for (int i = 0; i < 1000; i++) {
169 EffectiveModelContext context = StmtTestUtils.parseYangSources(
170 "/semantic-statement-parser/multiple-revisions/simple");
171 assertEquals(5, context.getModules().size());
172 checkContentSimpleTest(context);
176 private static void checkContentSimpleTest(final EffectiveModelContext context) {
177 final XMLNamespace yangTypesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-yang-types");
179 final Revision rev20100924 = Revision.of("2010-09-24");
180 final Revision rev20130516 = Revision.of("2013-05-16");
181 final Revision rev20130715 = Revision.of("2013-07-15");
183 final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
184 final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
185 final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
187 final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
188 final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
189 final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
191 Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
192 Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
193 Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
194 assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
195 assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
196 assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
198 checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef20130715);
199 checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef20100924);
202 private static void checkInterfacesModuleSimpleTest(final EffectiveModelContext context,
203 final Revision rev20100924, final QName dateTimeTypeDef20100924) {
204 XMLNamespace interfacesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-interfaces");
205 Revision rev20121115 = Revision.of("2012-11-15");
206 final QNameModule interfacesNS20121115 = QNameModule.create(interfacesNS, rev20121115);
207 QName lastChange = QName.create(interfacesNS20121115, "last-change");
209 Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
210 DataSchemaNode leafLastChange = interfacesModule20121115.getDataChildByName(lastChange);
211 assertThat(leafLastChange, instanceOf(LeafSchemaNode.class));
212 QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
213 assertEquals(dateTimeTypeDef20100924, lastChangeTypeQName);
215 Collection<? extends ModuleImport> imports = interfacesModule20121115.getImports();
216 assertEquals(1, imports.size());
217 ModuleImport interfacesImport = imports.iterator().next();
218 assertEquals("ietf-yang-types", interfacesImport.getModuleName());
219 assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
222 private static void checkNetconfMonitoringModuleSimpleTest(final EffectiveModelContext context,
223 final Revision rev20130715, final QName dateTimeTypeDef20130715) {
224 final XMLNamespace monitoringNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
225 final QNameModule monitoring19700101 = QNameModule.create(monitoringNS);
226 QName lockedTime = QName.create(monitoring19700101, "locked-time");
228 Module monitoringModule19700101 = context.findModule("ietf-netconf-monitoring").get();
229 DataSchemaNode leafLockedTime = monitoringModule19700101.getDataChildByName(lockedTime);
230 assertThat(leafLockedTime, instanceOf(LeafSchemaNode.class));
231 QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
232 assertEquals(dateTimeTypeDef20130715, lockedTimeTypeQName);
234 Collection<? extends ModuleImport> imports = monitoringModule19700101.getImports();
235 assertEquals(1, imports.size());
236 ModuleImport monitoringImport = imports.iterator().next();
237 assertEquals("ietf-yang-types", monitoringImport.getModuleName());
238 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
241 private static boolean findTypeDef(final Module module, final QName typedef) {
242 for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
243 if (typeDefinition.getQName().equals(typedef)) {
251 public void nodeTest() throws Exception {
252 EffectiveModelContext context = StmtTestUtils.parseYangSources(
253 "/semantic-statement-parser/multiple-revisions/node-test");
255 QName root = QName.create("foo", "2016-04-06", "foo-root");
256 QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
257 DataSchemaNode findDataSchemaNode = context.findDataTreeChild(root, container20160404).orElse(null);
258 assertThat(findDataSchemaNode, instanceOf(ContainerSchemaNode.class));
260 QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
261 findDataSchemaNode = context.findDataTreeChild(root, container20160405).orElse(null);
262 assertThat(findDataSchemaNode, instanceOf(ContainerSchemaNode.class));
264 QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
265 assertEquals(Optional.empty(), context.findDataTreeChild(root, container20160406));