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