Promote SchemaSourceRepresentation
[yangtools.git] / parser / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / repo / YangTextSchemaContextResolverTest.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.parser.repo;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
13 import static org.junit.jupiter.api.Assertions.assertNotNull;
14 import static org.junit.jupiter.api.Assertions.assertThrows;
15 import static org.junit.jupiter.api.Assertions.assertTrue;
16
17 import java.util.List;
18 import java.util.Set;
19 import java.util.concurrent.ExecutionException;
20 import org.junit.jupiter.api.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.EffectiveModelContext;
24 import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
25 import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException;
26
27 public class YangTextSchemaContextResolverTest {
28     @Test
29     public void testYangTextSchemaContextResolver() throws Exception {
30         final var yangTextSchemaContextResolver = YangTextSchemaContextResolver.create("test-bundle");
31         assertNotNull(yangTextSchemaContextResolver);
32
33         final var yangFile1 = getClass().getResource("/yang-text-schema-context-resolver-test/foo.yang");
34         assertNotNull(yangFile1);
35         final var yangFile2 = getClass().getResource("/yang-text-schema-context-resolver-test/bar.yang");
36         assertNotNull(yangFile2);
37         final var yangFile3 = getClass().getResource("/yang-text-schema-context-resolver-test/baz.yang");
38         assertNotNull(yangFile2);
39
40         final var registration1 = yangTextSchemaContextResolver.registerSource(yangFile1);
41         assertNotNull(registration1);
42         final var registration2 = yangTextSchemaContextResolver.registerSource(yangFile2);
43         assertNotNull(registration2);
44         final var registration3 = yangTextSchemaContextResolver.registerSource(yangFile3);
45         assertNotNull(registration3);
46
47         assertEquals(3, yangTextSchemaContextResolver.getAvailableSources().size());
48
49         final var fooModuleId = new SourceIdentifier("foo", "2016-09-26");
50         final var foo = yangTextSchemaContextResolver.getSource(fooModuleId);
51         assertTrue(foo.isDone());
52         assertEquals(fooModuleId, foo.get().sourceId());
53
54         final var barModuleId = new SourceIdentifier("bar", "2016-09-26");
55         final var bar = yangTextSchemaContextResolver.getSource(barModuleId);
56         assertTrue(bar.isDone());
57         assertEquals(barModuleId, bar.get().sourceId());
58
59         final var bazModuleId = new SourceIdentifier("baz", "2016-09-26");
60         final var baz = yangTextSchemaContextResolver.getSource(bazModuleId);
61         assertTrue(baz.isDone());
62         assertEquals(bazModuleId, baz.get().sourceId());
63
64         final var foobarModuleId = new SourceIdentifier("foobar", "2016-09-26");
65         final var foobar = yangTextSchemaContextResolver.getSource(foobarModuleId);
66         assertTrue(foobar.isDone());
67
68         final var cause = assertInstanceOf(MissingSchemaSourceException.class,
69             assertThrows(ExecutionException.class, foobar::get).getCause());
70         assertEquals("URL for SourceIdentifier [foobar@2016-09-26] not registered", cause.getMessage());
71
72         var schemaContextOptional = yangTextSchemaContextResolver.getEffectiveModelContext();
73         assertTrue(schemaContextOptional.isPresent());
74         var schemaContext = schemaContextOptional.orElseThrow();
75         assertEquals(3, schemaContext.getModules().size());
76
77         registration1.close();
78         registration2.close();
79         registration3.close();
80
81         assertEquals(0, yangTextSchemaContextResolver.getAvailableSources().size());
82
83         schemaContextOptional = yangTextSchemaContextResolver.getEffectiveModelContext();
84         assertTrue(schemaContextOptional.isPresent());
85         schemaContext = schemaContextOptional.orElseThrow();
86         assertEquals(0, schemaContext.getModules().size());
87     }
88
89     @Test
90     public void testFeatureRegistration() throws Exception {
91         final var yangTextSchemaContextResolver = YangTextSchemaContextResolver.create("feature-test-bundle");
92         assertNotNull(yangTextSchemaContextResolver);
93         final var yangFile1 = getClass().getResource("/yang-text-schema-context-resolver-test/foo-feature.yang");
94         assertNotNull(yangFile1);
95         final var yangFile2 = getClass().getResource("/yang-text-schema-context-resolver-test/aux-feature.yang");
96         assertNotNull(yangFile2);
97
98         final var registration1 = yangTextSchemaContextResolver.registerSource(yangFile1);
99         assertNotNull(registration1);
100         final var registration2 = yangTextSchemaContextResolver.registerSource(yangFile2);
101         assertNotNull(registration2);
102
103         final QName cont = QName.create("foo-feature-namespace", "2016-09-26", "bar-feature-container");
104         final QName condLeaf = QName.create("foo-feature-namespace", "2016-09-26", "conditional-leaf");
105         final QName uncondLeaf = QName.create("foo-feature-namespace", "2016-09-26", "unconditional-leaf");
106         final QName auxCont = QName.create("aux-feature-namespace", "2016-09-26", "aux-cond-cont");
107
108         final QName usedFeature = QName.create("foo-feature-namespace", "2016-09-26", "used-feature");
109         final QName unusedFeature = QName.create("foo-feature-namespace", "2016-09-26", "unused-feature");
110
111         final var pathToConditional = List.of(cont, condLeaf);
112         final var pathToUnconditional = List.of(cont, uncondLeaf);
113         final var pathToAuxiliary = List.of(auxCont);
114
115         final var context1 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
116
117         assertTrue(isModulePresent(context1, condLeaf.getModule(), pathToConditional));
118         assertTrue(isModulePresent(context1, uncondLeaf.getModule(), pathToUnconditional));
119         assertTrue(isModulePresent(context1, auxCont.getModule(), pathToAuxiliary));
120
121         final var featRegistration1 = yangTextSchemaContextResolver.registerSupportedFeatures(
122                 unusedFeature.getModule(), Set.of(unusedFeature.getLocalName()));
123         final var context2 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
124
125         assertFalse(isModulePresent(context2, condLeaf.getModule(), pathToConditional));
126         assertTrue(isModulePresent(context2, uncondLeaf.getModule(), pathToUnconditional));
127         assertTrue(isModulePresent(context2, auxCont.getModule(), pathToAuxiliary));
128
129         final var featRegistration2 = yangTextSchemaContextResolver.registerSupportedFeatures(
130                 unusedFeature.getModule(), Set.of(usedFeature.getLocalName()));
131         final var context3 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
132
133         assertTrue(isModulePresent(context3, condLeaf.getModule(), pathToConditional));
134
135         final var featRegistration3 = yangTextSchemaContextResolver.registerSupportedFeatures(
136                 unusedFeature.getModule(), Set.of(usedFeature.getLocalName(), unusedFeature.getLocalName()));
137         featRegistration1.close();
138         featRegistration2.close();
139         final var context4 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
140
141         assertTrue(isModulePresent(context4, condLeaf.getModule(), pathToConditional));
142         assertTrue(isModulePresent(context4, auxCont.getModule(), pathToAuxiliary));
143
144         featRegistration3.close();
145         final var featRegistration4 = yangTextSchemaContextResolver.registerSupportedFeatures(
146                 auxCont.getModule(), Set.of());
147         final var context5 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
148
149         assertTrue(isModulePresent(context5, condLeaf.getModule(), pathToConditional));
150         assertFalse(isModulePresent(context5, auxCont.getModule(), pathToAuxiliary));
151
152         featRegistration4.close();
153         final var context6 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
154
155         assertTrue(isModulePresent(context6, auxCont.getModule(), pathToAuxiliary));
156     }
157
158     private static boolean isModulePresent(final EffectiveModelContext context, final QNameModule qnameModule,
159             final List<QName> path) {
160         for (var module : context.getModules()) {
161             if (module.getQNameModule().equals(qnameModule)) {
162                 return module.findDataTreeChild(path).isPresent();
163             }
164         }
165         throw new AssertionError("No module with given QNameModule present in the context.");
166     }
167 }