Add XMLNamespace
[yangtools.git] / yang / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / MoreRevisionsTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.stmt;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
15
16 import java.util.Collection;
17 import java.util.Optional;
18 import org.junit.Test;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.common.QNameModule;
21 import org.opendaylight.yangtools.yang.common.Revision;
22 import org.opendaylight.yangtools.yang.common.XMLNamespace;
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.rfc7950.reactor.RFC7950Reactors;
34 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
35 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
36
37 public class MoreRevisionsTest {
38
39     private static final StatementStreamSource REVFILE = sourceForResource(
40             "/semantic-statement-parser/revisions/more-revisions-test.yang");
41
42     private static final StatementStreamSource TED_20130712 = sourceForResource(
43             "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
44
45     private static final StatementStreamSource TED_20131021 = sourceForResource(
46             "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
47
48     private static final StatementStreamSource IETF_TYPES = sourceForResource(
49             "/ietf/ietf-inet-types@2010-09-24.yang");
50
51     private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
52             "/ietf/network-topology@2013-07-12.yang");
53
54     private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
55             "/ietf/network-topology@2013-10-21.yang");
56
57     private static final StatementStreamSource ISIS_20130712 = sourceForResource(
58             "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
59
60     private static final StatementStreamSource ISIS_20131021 = sourceForResource(
61             "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
62
63     private static final StatementStreamSource L3_20130712 = sourceForResource(
64             "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
65
66     private static final StatementStreamSource L3_20131021 = sourceForResource(
67             "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
68
69     @Test
70     public void readAndParseYangFileTest() throws ReactorException {
71         SchemaContext result = RFC7950Reactors.defaultReactor().newBuild().addSource(REVFILE).buildEffective();
72         assertNotNull(result);
73         final Module moduleByName = result.getModules().iterator().next();
74         assertEquals("2015-06-07", moduleByName.getQNameModule().getRevision().get().toString());
75     }
76
77     @Test
78     public void twoRevisionsTest() throws ReactorException {
79         SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
80                 .addSources(TED_20130712, TED_20131021, IETF_TYPES)
81                 .buildEffective();
82         assertNotNull(result);
83     }
84
85     @Test
86     public void twoRevisionsTest2() throws ReactorException {
87         SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
88                 .addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES)
89                 .buildEffective();
90         assertNotNull(result);
91         Collection<? extends Module> modules = result.getModules();
92
93         assertEquals(3, modules.size());
94         assertEquals(2, StmtTestUtils.findModules(modules, "network-topology").size());
95     }
96
97     @Test
98     public void moreRevisionsListKeyTest() throws ReactorException {
99         SchemaContext result = RFC7950Reactors.defaultReactor().newBuild()
100                 .addSources(TED_20130712, TED_20131021, ISIS_20130712, ISIS_20131021, L3_20130712, L3_20131021)
101                 .addSources(IETF_TYPES,NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021)
102                 .buildEffective();
103         assertNotNull(result);
104     }
105
106     @Test
107     public void multipleRevisionsTest() throws Exception {
108         for (int i = 0; i < 100; i++) {
109             SchemaContext context = StmtTestUtils
110                     .parseYangSources("/semantic-statement-parser/multiple-revisions");
111             assertNotNull(context);
112         }
113     }
114
115     @Test
116     public void multipleRevisionsFullTest() throws Exception {
117         for (int i = 0; i < 100; i++) {
118             SchemaContext context = StmtTestUtils
119                     .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
120             assertNotNull(context);
121             assertEquals(6, context.getModules().size());
122             checkContentFullTest(context);
123         }
124     }
125
126     private static void checkContentFullTest(final SchemaContext context) {
127         final XMLNamespace yangTypesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-yang-types");
128
129         final Revision rev20100924 = Revision.of("2010-09-24");
130         final Revision rev20130516 = Revision.of("2013-05-16");
131         final Revision rev20130715 = Revision.of("2013-07-15");
132
133         final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
134         final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
135         final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
136
137         final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
138         final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
139         final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
140
141         Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
142         Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
143         Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
144         assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
145         assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
146         assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
147
148         checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef20130715);
149         checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef20100924);
150     }
151
152     private static void checkInterfacesModuleFullTest(final SchemaContext context, final Revision rev20100924,
153             final QName dateTimeTypeDef20100924) {
154         Revision rev20121115 = Revision.of("2012-11-15");
155
156         Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
157         Collection<? extends ModuleImport> imports = interfacesModule20121115.getImports();
158         assertEquals(1, imports.size());
159         ModuleImport interfacesImport = imports.iterator().next();
160         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
161         assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
162     }
163
164     private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
165             final Revision rev20130715, final QName dateTimeTypeDef20130715) {
166         Revision rev20101004 = Revision.of("2010-10-04");
167
168         Module monitoringModule20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
169         Collection<? extends ModuleImport> imports = monitoringModule20101004.getImports();
170         assertEquals(2, imports.size());
171         for (ModuleImport monitoringImport : imports) {
172             if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
173                 assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
174             }
175         }
176     }
177
178     @Test
179     public void multipleRevisionsSimpleTest() throws Exception {
180         for (int i = 0; i < 1000; i++) {
181             SchemaContext context = StmtTestUtils.parseYangSources(
182                 "/semantic-statement-parser/multiple-revisions/simple");
183             assertNotNull(context);
184             assertEquals(5, context.getModules().size());
185             checkContentSimpleTest(context);
186         }
187     }
188
189     private static void checkContentSimpleTest(final SchemaContext context) {
190         final XMLNamespace yangTypesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-yang-types");
191
192         final Revision rev20100924 = Revision.of("2010-09-24");
193         final Revision rev20130516 = Revision.of("2013-05-16");
194         final Revision rev20130715 = Revision.of("2013-07-15");
195
196         final QNameModule yangTypes20100924 = QNameModule.create(yangTypesNS, rev20100924);
197         final QNameModule yangTypes20130516 = QNameModule.create(yangTypesNS, rev20130516);
198         final QNameModule yangTypes20130715 = QNameModule.create(yangTypesNS, rev20130715);
199
200         final QName dateTimeTypeDef20100924 = QName.create(yangTypes20100924, "date-and-time");
201         final QName dateTimeTypeDef20130516 = QName.create(yangTypes20130516, "date-and-time");
202         final QName dateTimeTypeDef20130715 = QName.create(yangTypes20130715, "date-and-time");
203
204         Module yangTypesModule20100924 = context.findModule("ietf-yang-types", rev20100924).get();
205         Module yangTypesModule20130516 = context.findModule("ietf-yang-types", rev20130516).get();
206         Module yangTypesModule20130715 = context.findModule("ietf-yang-types", rev20130715).get();
207         assertTrue(findTypeDef(yangTypesModule20100924, dateTimeTypeDef20100924));
208         assertTrue(findTypeDef(yangTypesModule20130516, dateTimeTypeDef20130516));
209         assertTrue(findTypeDef(yangTypesModule20130715, dateTimeTypeDef20130715));
210
211         checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef20130715);
212         checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef20100924);
213     }
214
215     private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
216             final Revision rev20100924, final QName dateTimeTypeDef20100924) {
217         XMLNamespace interfacesNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-interfaces");
218         Revision rev20121115 = Revision.of("2012-11-15");
219         final QNameModule interfacesNS20121115 = QNameModule.create(interfacesNS, rev20121115);
220         QName lastChange = QName.create(interfacesNS20121115, "last-change");
221
222         Module interfacesModule20121115 = context.findModule("ietf-interfaces", rev20121115).get();
223         DataSchemaNode leafLastChange = interfacesModule20121115.getDataChildByName(lastChange);
224         assertNotNull(leafLastChange);
225
226         assertTrue(leafLastChange instanceof LeafSchemaNode);
227         QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
228         assertEquals(dateTimeTypeDef20100924, lastChangeTypeQName);
229
230         Collection<? extends ModuleImport> imports = interfacesModule20121115.getImports();
231         assertEquals(1, imports.size());
232         ModuleImport interfacesImport = imports.iterator().next();
233         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
234         assertEquals(Optional.of(rev20100924), interfacesImport.getRevision());
235     }
236
237     private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
238             final Revision rev20130715, final QName dateTimeTypeDef20130715) {
239         final XMLNamespace monitoringNS = XMLNamespace.of("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
240         final QNameModule monitoring19700101 = QNameModule.create(monitoringNS);
241         QName lockedTime = QName.create(monitoring19700101, "locked-time");
242
243         Module monitoringModule19700101 = context.findModule("ietf-netconf-monitoring").get();
244         DataSchemaNode leafLockedTime = monitoringModule19700101.getDataChildByName(lockedTime);
245         assertNotNull(leafLockedTime);
246
247         assertTrue(leafLockedTime instanceof LeafSchemaNode);
248         QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
249         assertEquals(dateTimeTypeDef20130715, lockedTimeTypeQName);
250
251         Collection<? extends ModuleImport> imports = monitoringModule19700101.getImports();
252         assertEquals(1, imports.size());
253         ModuleImport monitoringImport = imports.iterator().next();
254         assertEquals("ietf-yang-types", monitoringImport.getModuleName());
255         assertEquals(Optional.of(rev20130715), monitoringImport.getRevision());
256     }
257
258     private static boolean findTypeDef(final Module module, final QName typedef) {
259         for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
260             if (typeDefinition.getQName().equals(typedef)) {
261                 return true;
262             }
263         }
264         return false;
265     }
266
267     @Test
268     public void nodeTest() throws Exception {
269         SchemaContext context = StmtTestUtils.parseYangSources(
270             "/semantic-statement-parser/multiple-revisions/node-test");
271         assertNotNull(context);
272
273         QName root = QName.create("foo", "2016-04-06", "foo-root");
274         QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
275         SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
276             container20160404));
277         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
278
279         QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
280         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
281             container20160405));
282         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
283
284         QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
285         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
286             container20160406));
287         assertNull(findDataSchemaNode);
288     }
289 }