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