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