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