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