BUG-4688: eliminate SimpleDateFormatUtil.DEFAULT_DATE_REV
[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.Date;
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.model.api.ContainerSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
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.SchemaContext;
29 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
31 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
32 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
33 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
34 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
35 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
36 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
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         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
73         reactor.addSource(REVFILE);
74         SchemaContext result = reactor.buildEffective();
75         assertNotNull(result);
76         final Module moduleByName = result.getModules().iterator().next();
77         final QNameModule qNameModule = moduleByName.getQNameModule();
78         final String formattedRevision = qNameModule.getFormattedRevision();
79         assertEquals(formattedRevision, "2015-06-07");
80     }
81
82     @Test
83     public void twoRevisionsTest() throws ReactorException {
84         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
85                 .newBuild();
86
87         reactor.addSources(TED_20130712, TED_20131021, IETF_TYPES);
88
89         SchemaContext result = reactor.buildEffective();
90         assertNotNull(result);
91     }
92
93     @Test
94     public void twoRevisionsTest2() throws ReactorException {
95         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
96
97         reactor.addSources(NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021, IETF_TYPES);
98
99         SchemaContext result = reactor.buildEffective();
100         assertNotNull(result);
101         Set<Module> modules = result.getModules();
102
103         assertEquals(3, modules.size());
104         assertEquals(2, StmtTestUtils.findModules(modules, "network-topology").size());
105     }
106
107     @Test
108     public void moreRevisionsListKeyTest() throws ReactorException {
109         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
110
111         reactor.addSources(TED_20130712, TED_20131021, ISIS_20130712,
112                 ISIS_20131021, L3_20130712, L3_20131021, IETF_TYPES,
113                 NETWORK_TOPOLOGY_20130712, NETWORK_TOPOLOGY_20131021);
114
115         SchemaContext result = reactor.buildEffective();
116         assertNotNull(result);
117     }
118
119     @Test
120     public void multipleRevisionsTest() throws Exception {
121         for (int i = 0; i < 100; i++) {
122             SchemaContext context = StmtTestUtils
123                     .parseYangSources("/semantic-statement-parser/multiple-revisions");
124             assertNotNull(context);
125         }
126     }
127
128     @Test
129     public void multipleRevisionsFullTest() throws Exception {
130         for (int i = 0; i < 100; i++) {
131             SchemaContext context = StmtTestUtils
132                     .parseYangSources("/semantic-statement-parser/multiple-revisions/full");
133             assertNotNull(context);
134             assertEquals(6, context.getModules().size());
135             checkContentFullTest(context);
136         }
137     }
138
139     private static void checkContentFullTest(final SchemaContext context) {
140         URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
141
142         final Date rev20100924 = QName.parseRevision("2010-09-24");
143         final Date rev20130516 = QName.parseRevision("2013-05-16");
144         final Date rev20130715 = QName.parseRevision("2013-07-15");
145
146         final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
147         final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
148         final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
149
150         final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
151         final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
152         final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
153
154         Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
155         Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
156         Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
157         assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
158         assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
159         assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
160
161         checkNetconfMonitoringModuleFullTest(context, rev20130715, dateTimeTypeDef_20130715);
162         checkInterfacesModuleFullTest(context, rev20100924, dateTimeTypeDef_20100924);
163     }
164
165     private static void checkInterfacesModuleFullTest(final SchemaContext context, final Date rev20100924,
166             final QName dateTimeTypeDef_20100924) {
167         Date rev20121115 = QName.parseRevision("2012-11-15");
168
169         Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
170         Set<ModuleImport> imports = interfacesModule_20121115.getImports();
171         assertEquals(1, imports.size());
172         ModuleImport interfacesImport = imports.iterator().next();
173         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
174         assertEquals(rev20100924, interfacesImport.getRevision());
175     }
176
177     private static void checkNetconfMonitoringModuleFullTest(final SchemaContext context,
178             final Date rev20130715, final QName dateTimeTypeDef_20130715) {
179         Date rev20101004 = QName.parseRevision("2010-10-04");
180
181         Module monitoringModule_20101004 = context.findModule("ietf-netconf-monitoring", rev20101004).get();
182         Set<ModuleImport> imports = monitoringModule_20101004.getImports();
183         assertEquals(2, imports.size());
184         for (ModuleImport monitoringImport : imports) {
185             if (monitoringImport.getModuleName().equals("ietf-yang-types")) {
186                 assertEquals(rev20130715, monitoringImport.getRevision());
187             }
188         }
189     }
190
191     @Test
192     public void multipleRevisionsSimpleTest() throws Exception {
193         for (int i = 0; i < 1000; i++) {
194             SchemaContext context = StmtTestUtils.parseYangSources(
195                 "/semantic-statement-parser/multiple-revisions/simple");
196             assertNotNull(context);
197             assertEquals(5, context.getModules().size());
198             checkContentSimpleTest(context);
199         }
200     }
201
202     private static void checkContentSimpleTest(final SchemaContext context) {
203         URI yangTypesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-yang-types");
204
205         final Date rev20100924 = QName.parseRevision("2010-09-24");
206         final Date rev20130516 = QName.parseRevision("2013-05-16");
207         final Date rev20130715 = QName.parseRevision("2013-07-15");
208
209         final QNameModule yangTypes_20100924 = QNameModule.create(yangTypesNS, rev20100924);
210         final QNameModule yangTypes_20130516 = QNameModule.create(yangTypesNS, rev20130516);
211         final QNameModule yangTypes_20130715 = QNameModule.create(yangTypesNS, rev20130715);
212
213         final QName dateTimeTypeDef_20100924 = QName.create(yangTypes_20100924, "date-and-time");
214         final QName dateTimeTypeDef_20130516 = QName.create(yangTypes_20130516, "date-and-time");
215         final QName dateTimeTypeDef_20130715 = QName.create(yangTypes_20130715, "date-and-time");
216
217         Module yangTypesModule_20100924 = context.findModule("ietf-yang-types", rev20100924).get();
218         Module yangTypesModule_20130516 = context.findModule("ietf-yang-types", rev20130516).get();
219         Module yangTypesModule_20130715 = context.findModule("ietf-yang-types", rev20130715).get();
220         assertTrue(findTypeDef(yangTypesModule_20100924, dateTimeTypeDef_20100924));
221         assertTrue(findTypeDef(yangTypesModule_20130516, dateTimeTypeDef_20130516));
222         assertTrue(findTypeDef(yangTypesModule_20130715, dateTimeTypeDef_20130715));
223
224         checkNetconfMonitoringModuleSimpleTest(context, rev20130715, dateTimeTypeDef_20130715);
225         checkInterfacesModuleSimpleTest(context, rev20100924, dateTimeTypeDef_20100924);
226     }
227
228     private static void checkInterfacesModuleSimpleTest(final SchemaContext context,
229             final Date rev20100924, final QName dateTimeTypeDef_20100924) {
230         URI interfacesNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-interfaces");
231         Date rev20121115 = QName.parseRevision("2012-11-15");
232         final QNameModule interfacesNS_20121115 = QNameModule.create(interfacesNS, rev20121115);
233         QName lastChange = QName.create(interfacesNS_20121115, "last-change");
234
235         Module interfacesModule_20121115 = context.findModule("ietf-interfaces", rev20121115).get();
236         DataSchemaNode leafLastChange = interfacesModule_20121115.getDataChildByName(lastChange);
237         assertNotNull(leafLastChange);
238
239         assertTrue(leafLastChange instanceof LeafSchemaNode);
240         QName lastChangeTypeQName = ((LeafSchemaNode) leafLastChange).getType().getQName();
241         assertEquals(dateTimeTypeDef_20100924, lastChangeTypeQName);
242
243         Set<ModuleImport> imports = interfacesModule_20121115.getImports();
244         assertEquals(1, imports.size());
245         ModuleImport interfacesImport = imports.iterator().next();
246         assertEquals("ietf-yang-types", interfacesImport.getModuleName());
247         assertEquals(rev20100924, interfacesImport.getRevision());
248     }
249
250     private static void checkNetconfMonitoringModuleSimpleTest(final SchemaContext context,
251             final Date rev20130715, final QName dateTimeTypeDef_20130715) {
252         URI monitoringNS = URI.create("urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring");
253         final QNameModule monitoring_19700101 = QNameModule.create(monitoringNS, null);
254         QName lockedTime = QName.create(monitoring_19700101, "locked-time");
255
256         Module monitoringModule_19700101 = context.findModule("ietf-netconf-monitoring", null).get();
257         DataSchemaNode leafLockedTime = monitoringModule_19700101.getDataChildByName(lockedTime);
258         assertNotNull(leafLockedTime);
259
260         assertTrue(leafLockedTime instanceof LeafSchemaNode);
261         QName lockedTimeTypeQName = ((LeafSchemaNode) leafLockedTime).getType().getQName();
262         assertEquals(dateTimeTypeDef_20130715, lockedTimeTypeQName);
263
264         Set<ModuleImport> imports = monitoringModule_19700101.getImports();
265         assertEquals(1, imports.size());
266         ModuleImport monitoringImport = imports.iterator().next();
267         assertEquals("ietf-yang-types", monitoringImport.getModuleName());
268         assertEquals(rev20130715, monitoringImport.getRevision());
269     }
270
271     private static boolean findTypeDef(final Module module, final QName typedef) {
272         for (TypeDefinition<?> typeDefinition : module.getTypeDefinitions()) {
273             if (typeDefinition.getQName().equals(typedef)) {
274                 return true;
275             }
276         }
277         return false;
278     }
279
280     @Test
281     public void nodeTest() throws Exception {
282         SchemaContext context = StmtTestUtils.parseYangSources(
283             "/semantic-statement-parser/multiple-revisions/node-test");
284         assertNotNull(context);
285
286         QName root = QName.create("foo", "2016-04-06", "foo-root");
287         QName container20160404 = QName.create("foo", "2016-04-06", "con20160404");
288         SchemaNode findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
289             container20160404));
290         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
291
292         QName container20160405 = QName.create("foo", "2016-04-06", "con20160405");
293         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
294             container20160405));
295         assertTrue(findDataSchemaNode instanceof ContainerSchemaNode);
296
297         QName container20160406 = QName.create("foo", "2016-04-06", "con20160406");
298         findDataSchemaNode = SchemaContextUtil.findDataSchemaNode(context, SchemaPath.create(true, root,
299             container20160406));
300         assertNull(findDataSchemaNode);
301     }
302 }