639c36a1e13ba1d459d3a6d407b93784a4ead68e
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / openconfigver / OpenconfigVersionTest.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.openconfigver;
9
10 import static org.hamcrest.CoreMatchers.instanceOf;
11 import static org.hamcrest.CoreMatchers.startsWith;
12 import static org.hamcrest.MatcherAssert.assertThat;
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNotNull;
15 import static org.junit.Assert.assertThrows;
16
17 import java.util.Optional;
18 import org.junit.Test;
19 import org.opendaylight.yangtools.concepts.SemVer;
20 import org.opendaylight.yangtools.yang.common.QName;
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.Module;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
27 import org.opendaylight.yangtools.yang.parser.api.ImportResolutionMode;
28 import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
30 import org.opendaylight.yangtools.yang.stmt.StmtTestUtils;
31
32 public class OpenconfigVersionTest {
33     private static final YangParserConfiguration SEMVER = YangParserConfiguration.builder()
34         .importResolutionMode(ImportResolutionMode.OPENCONFIG_SEMVER)
35         .build();
36
37     @Test
38     public void basicTest() throws Exception {
39         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/basic", SEMVER);
40         assertNotNull(context);
41
42         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
43         Module bar = context.findModules(XMLNamespace.of("bar")).iterator().next();
44         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
45             .iterator().next();
46
47         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
48         assertEquals(SemVer.valueOf("0.1.1"), foo.getSemanticVersion().get());
49         assertEquals(SemVer.valueOf("0.1.2"), bar.getSemanticVersion().get());
50     }
51
52     @Test
53     public void basicTest2() throws Exception {
54         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/basic-2", SEMVER);
55         assertNotNull(context);
56
57         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
58         Module bar = context.findModules(XMLNamespace.of("bar")).iterator().next();
59         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
60             .iterator().next();
61
62         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
63         assertEquals(SemVer.valueOf("0.1.1"), foo.getSemanticVersion().get());
64         assertEquals(SemVer.valueOf("0.1.2"), bar.getSemanticVersion().get());
65     }
66
67     @Test
68     public void basicTest3() throws Exception {
69         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/basic-3", SEMVER);
70         assertNotNull(context);
71
72         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
73         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
74             .iterator().next();
75
76         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
77         assertEquals(SemVer.valueOf("0.1.1"), foo.getSemanticVersion().get());
78     }
79
80     @Test
81     public void basicImportTest1() throws Exception {
82         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/basic-import-1", SEMVER);
83         assertNotNull(context);
84
85         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
86         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
87             .iterator().next();
88
89         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
90         assertEquals(SemVer.valueOf("0.1.1"), foo.getSemanticVersion().get());
91         Module bar = StmtTestUtils.findImportedModule(context, foo, "bar");
92         assertEquals(SemVer.valueOf("0.1.2"), bar.getSemanticVersion().get());
93     }
94
95     @Test
96     public void multipleModulesTest() throws Exception {
97         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/multiple-modules", SEMVER);
98         assertNotNull(context);
99
100         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
101         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
102             .iterator().next();
103
104         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
105         assertEquals(SemVer.valueOf("0.1.1"), foo.getSemanticVersion().get());
106         Module bar = StmtTestUtils.findImportedModule(context, foo, "bar");
107         assertEquals(SemVer.valueOf("0.10.4"), bar.getSemanticVersion().get());
108     }
109
110     @Test
111     public void basicImportErrTest1() {
112         ReactorException ex = assertThrows(ReactorException.class,
113             () -> StmtTestUtils.parseYangSources("/openconfig-version/basic-import-invalid-1", SEMVER));
114         assertThat(ex.getCause().getMessage(),
115             startsWith("Unable to find module compatible with requested import [bar(0.1.2)]."));
116     }
117
118     @Test
119     public void basicImportErrTest2() {
120         ReactorException ex = assertThrows(ReactorException.class,
121             () -> StmtTestUtils.parseYangSources("/openconfig-version/basic-import-invalid-2", SEMVER));
122         assertThat(ex.getCause().getMessage(),
123             startsWith("Unable to find module compatible with requested import [bar(0.1.2)]."));
124     }
125
126     @Test
127     public void nodeTest() throws Exception {
128         SchemaContext context = StmtTestUtils.parseYangSources("/openconfig-version/node-test", SEMVER);
129         assertNotNull(context);
130
131         Module foo = context.findModules(XMLNamespace.of("foo")).iterator().next();
132         Module semVer = context.findModules(XMLNamespace.of("http://openconfig.net/yang/openconfig-ext"))
133             .iterator().next();
134
135         assertEquals(SemVer.valueOf("0.0.1"), semVer.getSemanticVersion().get());
136         assertEquals(SemVer.valueOf("2016.1.1"), foo.getSemanticVersion().get());
137         Module bar = StmtTestUtils.findImportedModule(context, foo, "bar");
138         assertEquals(SemVer.valueOf("2016.4.6"), bar.getSemanticVersion().get());
139
140         QName root = QName.create("foo", "2016-01-01", "foo-root");
141         QName container20160404 = QName.create("foo", "2016-01-01", "con20160404");
142         SchemaNode findDataSchemaNode = context.findDataTreeChild(root, container20160404).orElseThrow();
143         assertThat(findDataSchemaNode, instanceOf(ContainerSchemaNode.class));
144
145         QName container20160405 = QName.create("foo", "2016-01-01", "con20160405");
146         findDataSchemaNode = context.findDataTreeChild(root, container20160405).orElseThrow();
147         assertThat(findDataSchemaNode, instanceOf(ContainerSchemaNode.class));
148
149         QName container20160406 = QName.create("foo", "2016-01-01", "con20160406");
150         findDataSchemaNode = context.findDataTreeChild(root, container20160406).orElseThrow();
151         assertThat(findDataSchemaNode, instanceOf(ContainerSchemaNode.class));
152
153         QName container20170406 = QName.create("foo", "2016-01-01", "con20170406");
154         final Optional<DataSchemaNode> dataTreeChild = context.findDataTreeChild(root, container20170406);
155         assertEquals(Optional.empty(), dataTreeChild);
156     }
157 }