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