2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.repo;
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;
17 import java.util.List;
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;
27 public class YangTextSchemaContextResolverTest {
29 public void testYangTextSchemaContextResolver() throws Exception {
30 final var yangTextSchemaContextResolver = YangTextSchemaContextResolver.create("test-bundle");
31 assertNotNull(yangTextSchemaContextResolver);
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);
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);
47 assertEquals(3, yangTextSchemaContextResolver.getAvailableSources().size());
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());
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());
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());
64 final var foobarModuleId = new SourceIdentifier("foobar", "2016-09-26");
65 final var foobar = yangTextSchemaContextResolver.getSource(foobarModuleId);
66 assertTrue(foobar.isDone());
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());
72 var schemaContextOptional = yangTextSchemaContextResolver.getEffectiveModelContext();
73 assertTrue(schemaContextOptional.isPresent());
74 var schemaContext = schemaContextOptional.orElseThrow();
75 assertEquals(3, schemaContext.getModules().size());
77 registration1.close();
78 registration2.close();
79 registration3.close();
81 assertEquals(0, yangTextSchemaContextResolver.getAvailableSources().size());
83 schemaContextOptional = yangTextSchemaContextResolver.getEffectiveModelContext();
84 assertTrue(schemaContextOptional.isPresent());
85 schemaContext = schemaContextOptional.orElseThrow();
86 assertEquals(0, schemaContext.getModules().size());
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);
98 final var registration1 = yangTextSchemaContextResolver.registerSource(yangFile1);
99 assertNotNull(registration1);
100 final var registration2 = yangTextSchemaContextResolver.registerSource(yangFile2);
101 assertNotNull(registration2);
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");
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");
111 final var pathToConditional = List.of(cont, condLeaf);
112 final var pathToUnconditional = List.of(cont, uncondLeaf);
113 final var pathToAuxiliary = List.of(auxCont);
115 final var context1 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
117 assertTrue(isModulePresent(context1, condLeaf.getModule(), pathToConditional));
118 assertTrue(isModulePresent(context1, uncondLeaf.getModule(), pathToUnconditional));
119 assertTrue(isModulePresent(context1, auxCont.getModule(), pathToAuxiliary));
121 final var featRegistration1 = yangTextSchemaContextResolver.registerSupportedFeatures(
122 unusedFeature.getModule(), Set.of(unusedFeature.getLocalName()));
123 final var context2 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
125 assertFalse(isModulePresent(context2, condLeaf.getModule(), pathToConditional));
126 assertTrue(isModulePresent(context2, uncondLeaf.getModule(), pathToUnconditional));
127 assertTrue(isModulePresent(context2, auxCont.getModule(), pathToAuxiliary));
129 final var featRegistration2 = yangTextSchemaContextResolver.registerSupportedFeatures(
130 unusedFeature.getModule(), Set.of(usedFeature.getLocalName()));
131 final var context3 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
133 assertTrue(isModulePresent(context3, condLeaf.getModule(), pathToConditional));
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();
141 assertTrue(isModulePresent(context4, condLeaf.getModule(), pathToConditional));
142 assertTrue(isModulePresent(context4, auxCont.getModule(), pathToAuxiliary));
144 featRegistration3.close();
145 final var featRegistration4 = yangTextSchemaContextResolver.registerSupportedFeatures(
146 auxCont.getModule(), Set.of());
147 final var context5 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
149 assertTrue(isModulePresent(context5, condLeaf.getModule(), pathToConditional));
150 assertFalse(isModulePresent(context5, auxCont.getModule(), pathToAuxiliary));
152 featRegistration4.close();
153 final var context6 = yangTextSchemaContextResolver.getEffectiveModelContext().orElseThrow();
155 assertTrue(isModulePresent(context6, auxCont.getModule(), pathToAuxiliary));
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();
165 throw new AssertionError("No module with given QNameModule present in the context.");