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