Fix warnings in EffectiveSchemaContextTest
[yangtools.git] / yang / yang-parser-impl / 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
9 package org.opendaylight.yangtools.yang.stmt;
10
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;
16
17 import java.net.URI;
18 import java.net.URISyntaxException;
19 import java.text.ParseException;
20 import java.util.Date;
21 import java.util.Set;
22 import org.junit.Test;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.QNameModule;
25 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.Module;
30 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
31 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
32 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
34 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
35 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
36 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
37 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
38 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
39 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
40 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
41 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
42
43 public class MoreRevisionsTest {
44
45     private static final StatementStreamSource REVFILE = sourceForResource(
46             "/semantic-statement-parser/revisions/more-revisions-test.yang");
47
48     private static final StatementStreamSource TED_20130712 = sourceForResource(
49             "/semantic-statement-parser/two-revisions/ted@2013-07-12.yang");
50
51     private static final StatementStreamSource TED_20131021 = sourceForResource(
52             "/semantic-statement-parser/two-revisions/ted@2013-10-21.yang");
53
54     private static final StatementStreamSource IETF_TYPES = sourceForResource(
55             "/ietf/ietf-inet-types@2010-09-24.yang");
56
57     private static final StatementStreamSource NETWORK_TOPOLOGY_20130712 = sourceForResource(
58             "/ietf/network-topology@2013-07-12.yang");
59
60     private static final StatementStreamSource NETWORK_TOPOLOGY_20131021 = sourceForResource(
61             "/ietf/network-topology@2013-10-21.yang");
62
63     private static final StatementStreamSource ISIS_20130712 = sourceForResource(
64             "/semantic-statement-parser/two-revisions/isis-topology@2013-07-12.yang");
65
66     private static final StatementStreamSource ISIS_20131021 = sourceForResource(
67             "/semantic-statement-parser/two-revisions/isis-topology@2013-10-21.yang");
68
69     private static final StatementStreamSource L3_20130712 = sourceForResource(
70             "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-07-12.yang");
71
72     private static final StatementStreamSource L3_20131021 = sourceForResource(
73             "/semantic-statement-parser/two-revisions/l3-unicast-igp-topology@2013-10-21.yang");
74
75     @Test
76     public void readAndParseYangFileTest() throws SourceException,
77             ReactorException {
78         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
79                 .newBuild();
80         reactor.addSource(REVFILE);
81         EffectiveSchemaContext result = reactor.buildEffective();
82         assertNotNull(result);
83         final Module moduleByName = result.getModules().iterator().next();
84         final QNameModule qNameModule = moduleByName.getQNameModule();
85         final String formattedRevision = qNameModule.getFormattedRevision();
86         assertEquals(formattedRevision, "2015-06-07");
87     }
88
89     @Test
90     public void twoRevisionsTest() throws SourceException, ReactorException {
91         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
92                 .newBuild();
93
94         reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
95
96         EffectiveSchemaContext result = reactor.buildEffective();
97         assertNotNull(result);
98
99     }
100
101     @Test
102     public void twoRevisionsTest2() throws SourceException, ReactorException {
103         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
104                 .newBuild();
105
106         reactor.addSources(NETWORK_TOPOLOGY_20130712,
107                 NETWORK_TOPOLOGY_20131021, IETF_TYPES);
108
109         EffectiveSchemaContext result = reactor.buildEffective();
110         assertNotNull(result);
111         Set<Module> modules = result.getModules();
112
113         assertEquals(3, modules.size());
114         assertEquals(2, StmtTestUtils.findModules(modules, "network-topology")
115                 .size());
116     }
117
118     @Test
119     public void moreRevisionsListKeyTest() throws SourceException,
120             ReactorException {
121         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
122                 .newBuild();
123
124         reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
125                 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
126                 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
127
128         EffectiveSchemaContext result = reactor.buildEffective();
129         assertNotNull(result);
130     }
131
132     @Test
133     public void multipleRevisionsTest() throws Exception {
134         for (int i = 0; i < 100; i++) {
135             SchemaContext context = StmtTestUtils
136                     .parseYangSources("/semantic-statement-parser/multiple-revisions");
137             assertNotNull(context);
138         }
139     }
140
141     @Test
142     public void multipleRevisionsFullTest() throws Exception,
143             ParseException {
144         for (int i = 0; i < 100; i++) {
145             SchemaContext context = StmtTestUtils
146                     .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
147             assertNotNull(context);
148             assertEquals(6, context.getModules().size());
149             checkContentFullTest(context);
150         }
151     }
152
153     private static void checkContentFullTest(final SchemaContext context) throws ParseException, URISyntaxException {
154
155         String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
156         URI yangTypesNS = new URI(yangTypesNSStr);
157
158         Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
159                 "2010-09-24");
160         Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
161                 "2013-05-16");
162         Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
163                 "2013-07-15");
164
165         final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
166                 rev20100924);
167         final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
168                 rev20130516);
169         final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
170                 rev20130715);
171
172         final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
173                 "date-and-time");
174         final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
175                 "date-and-time");
176         final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
177                 "date-and-time");
178
179         Module yangTypesModule_20100924 = context.findModuleByName(
180                 "ietf-yang-types", rev20100924);
181         Module yangTypesModule_20130516 = context.findModuleByName(
182                 "ietf-yang-types", rev20130516);
183         Module yangTypesModule_20130715 = context.findModuleByName(
184                 "ietf-yang-types", rev20130715);
185
186         assertNotNull(yangTypesModule_20100924);
187         assertNotNull(yangTypesModule_20130516);
188         assertNotNull(yangTypesModule_20130715);
189
190         assertTrue(findTypeDef(yangTypesModule_20100924,
191                 dateTimeTypeDef_20100924));
192         assertTrue(findTypeDef(yangTypesModule_20130516,
193                 dateTimeTypeDef_20130516));
194         assertTrue(findTypeDef(yangTypesModule_20130715,
195                 dateTimeTypeDef_20130715));
196
197         checkNetconfMonitoringModuleFullTest(context, rev20130715,
198                 dateTimeTypeDef_20130715);
199
200         checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
201
202     }
203
204     private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
205             final QName dateTimeTypeDef_20100924) throws URISyntaxException,
206             ParseException {
207         Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
208                 "2012-11-15");
209
210         Module interfacesModule_20121115 = context.findModuleByName(
211                 "ietf-interfaces", rev20121115);
212         assertNotNull(interfacesModule_20121115);
213
214         Set<ModuleImport> imports = interfacesModule_20121115.getImports();
215         assertEquals(1, imports.size());
216         ModuleImport interfacesImport = imports.iterator().next();
217         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
218         assertEquals(rev20100924, interfacesImport.getRevision());
219     }
220
221     private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
222             final Date rev20130715, final QName dateTimeTypeDef_20130715)
223             throws ParseException, URISyntaxException {
224         Date rev20101004 = SimpleDateFormatUtil.getRevisionFormat().parse(
225                 "2010-10-04");
226
227         Module monitoringModule_20101004 = context.findModuleByName(
228                 "ietf-netconf-monitoring", rev20101004);
229         assertNotNull(monitoringModule_20101004);
230
231         Set<ModuleImport> imports = monitoringModule_20101004.getImports();
232         assertEquals(2, imports.size());
233         for (ModuleImport monitoringImport : imports) {
234             if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
235                 assertEquals(rev20130715, monitoringImport.getRevision());
236             }
237         }
238     }
239
240     @Test
241     public void multipleRevisionsSimpleTest() throws Exception {
242         for (int i = 0; i < 1000; i++) {
243             SchemaContext context = StmtTestUtils.parseYangSources(
244                 "/semantic-statement-parser/multiple-revisions/simple");
245             assertNotNull(context);
246             assertEquals(5, context.getModules().size());
247             checkContentSimpleTest(context);
248         }
249     }
250
251     private static void checkContentSimpleTest(final SchemaContext context)
252             throws ParseException, URISyntaxException {
253
254         String yangTypesNSStr = "urn:ietf:params:xml:ns:yang:ietf-yang-types";
255         URI yangTypesNS = new URI(yangTypesNSStr);
256
257         Date rev20100924 = SimpleDateFormatUtil.getRevisionFormat().parse(
258                 "2010-09-24");
259         Date rev20130516 = SimpleDateFormatUtil.getRevisionFormat().parse(
260                 "2013-05-16");
261         Date rev20130715 = SimpleDateFormatUtil.getRevisionFormat().parse(
262                 "2013-07-15");
263
264         final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS,
265                 rev20100924);
266         final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS,
267                 rev20130516);
268         final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS,
269                 rev20130715);
270
271         final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924,
272                 "date-and-time");
273         final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516,
274                 "date-and-time");
275         final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715,
276                 "date-and-time");
277
278         Module yangTypesModule_20100924 = context.findModuleByName(
279                 "ietf-yang-types", rev20100924);
280         Module yangTypesModule_20130516 = context.findModuleByName(
281                 "ietf-yang-types", rev20130516);
282         Module yangTypesModule_20130715 = context.findModuleByName(
283                 "ietf-yang-types", rev20130715);
284
285         assertNotNull(yangTypesModule_20100924);
286         assertNotNull(yangTypesModule_20130516);
287         assertNotNull(yangTypesModule_20130715);
288
289         assertTrue(findTypeDef(yangTypesModule_20100924,
290                 dateTimeTypeDef_20100924));
291         assertTrue(findTypeDef(yangTypesModule_20130516,
292                 dateTimeTypeDef_20130516));
293         assertTrue(findTypeDef(yangTypesModule_20130715,
294                 dateTimeTypeDef_20130715));
295
296         checkNetconfMonitoringModuleSimpleTest(context, rev20130715,
297                 dateTimeTypeDef_20130715);
298
299         checkInterfacesModuleSimpleTest(context, rev20100924,
300                 dateTimeTypeDef_20100924);
301
302     }
303
304     private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
305             final Date rev20100924, final QName dateTimeTypeDef_20100924)
306             throws URISyntaxException, ParseException {
307         String interfacesNSStr = "urn:ietf:params:xml:ns:yang:ietf-interfaces";
308         URI interfacesNS = new URI(interfacesNSStr);
309         Date rev20121115 = SimpleDateFormatUtil.getRevisionFormat().parse(
310                 "2012-11-15");
311         final QNameModule interfacesNS_20121115 = QNameModule.create(
312                 interfacesNS, rev20121115);
313         QName lastChange = QName.create(interfacesNS_20121115, "last-change");
314
315         Module interfacesModule_20121115 = context.findModuleByName(
316                 "ietf-interfaces", rev20121115);
317         assertNotNull(interfacesModule_20121115);
318
319         DataSchemaNode leafLastChange = interfacesModule_20121115
320                 .getDataChildByName(lastChange);
321         assertNotNull(leafLastChange);
322
323         assertTrue(leafLastChange instanceof LeafSchemaNode);
324         QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType()
325                 .getQName();
326         assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
327
328         Set<ModuleImport> imports = interfacesModule_20121115.getImports();
329         assertEquals(1, imports.size());
330         ModuleImport interfacesImport = imports.iterator().next();
331         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
332         assertEquals(rev20100924, interfacesImport.getRevision());
333     }
334
335     private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
336             final Date rev20130715, final QName dateTimeTypeDef_20130715)
337             throws ParseException, URISyntaxException {
338         String monitoringNSStr = "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
339         URI monitoringNS = new URI(monitoringNSStr);
340
341         Date rev19700101 = SimpleDateFormatUtil.getRevisionFormat().parse(
342                 "1970-01-01");
343         final QNameModule monitoring_19700101 = QNameModule.create(
344                 monitoringNS, rev19700101);
345         QName lockedTime = QName.create(monitoring_19700101, "locked-time");
346
347         Module monitoringModule_19700101 = context.findModuleByName(
348                 "ietf-netconf-monitoring", rev19700101);
349         assertNotNull(monitoringModule_19700101);
350
351         DataSchemaNode leafLockedTime = monitoringModule_19700101
352                 .getDataChildByName(lockedTime);
353         assertNotNull(leafLockedTime);
354
355         assertTrue(leafLockedTime instanceof LeafSchemaNode);
356         QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType()
357                 .getQName();
358         assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
359
360         Set<ModuleImport> imports = monitoringModule_19700101.getImports();
361         assertEquals(1, imports.size());
362         ModuleImport monitoringImport = imports.iterator().next();
363         assertEquals("ietf-yang-types", monitoringImport.getModuleName());
364         assertEquals(rev20130715, monitoringImport.getRevision());
365     }
366
367     private static boolean findTypeDef(final Module module, final QName typedef) {
368         Set<TypeDefinition<?>> typeDefinitions = module.getTypeDefinitions();
369         for (TypeDefinition<?> typeDefinition : typeDefinitions) {
370             if (typeDefinition.getQName().equals(typedef)) {
371                 return true;
372             }
373         }
374         return false;
375     }
376
377     @Test
378     public void nodeTest() throws Exception {
379         SchemaContext context = StmtTestUtils.parseYangSources("/semantic-statement-parser/multiple-revisions/node-test");
380         assertNotNull(context);
381
382         QName root = QName.create("foo", "2016-04-06", "foo-root");
383         QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
384         SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160404));
385         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
386
387         QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
388         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160405));
389         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
390
391         QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
392         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root, container20160406));
393         assertNull(findDataSchemaNode);
394     }
395 }