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