2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/epl-v10.html
7 package org.opendaylight.yangtools.yang.parser.builder.impl;
9 import static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.assertFalse;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Mockito.mock;
15 import com.google.common.base.Optional;
17 import java.text.DateFormat;
18 import java.text.SimpleDateFormat;
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.Date;
22 import java.util.HashMap;
23 import java.util.List;
25 import java.util.NavigableMap;
26 import java.util.TreeMap;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.opendaylight.yangtools.yang.common.QName;
30 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
31 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
33 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
34 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
35 import org.opendaylight.yangtools.yang.model.api.Status;
36 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
37 import org.opendaylight.yangtools.yang.model.util.Uint16;
38 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
39 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
40 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
41 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
42 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
43 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
46 * Test suite for increasing of test coverage of BuilderUtils implementation.
48 * @see org.opendaylight.yangtools.yang.parser.builder.impl.BuilderUtils
50 * @author Lukas Sedlak <lsedlak@cisco.com>
52 * @deprecated Pre-Beryllium implementation, scheduled for removal.
55 public class BuilderUtilsTest {
57 private final static String MASTER_MODULE_NAMESPACE = "urn:opendaylight.master-model";
58 private final static String MODULES_REVISION = "2014-10-06";
59 private final static String MASTER_MODULE = "master-module";
60 private final static String DEPENDENT_MODULE_NAMESPACE = "urn:opendaylight.secondary-model";
61 private final static String DEPENDENT_MODULE = "depend-module";
62 private final static String MASTER_MODULE_PATH = "test/module/path/master-module@" + MODULES_REVISION + ".yang";
63 private final static String DEPENDENT_MODULE_PATH = "test/module/path/depend-module@" + MODULES_REVISION + ".yang";
64 private final static String DEPENDENT_MODULE_PREFIX = "dep";
66 private final static DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-mm-dd");
68 private ModuleBuilder masterModule;
69 private ModuleBuilder dependentModule;
72 public void setUp() throws Exception {
73 masterModule = new ModuleBuilder(MASTER_MODULE, MASTER_MODULE_PATH);
74 dependentModule = new ModuleBuilder(DEPENDENT_MODULE, DEPENDENT_MODULE_PATH);
76 final Date moduleRevision = SIMPLE_DATE_FORMAT.parse(MODULES_REVISION);
77 masterModule.setRevision(moduleRevision);
78 dependentModule.setRevision(moduleRevision);
80 masterModule.setNamespace(URI.create(MASTER_MODULE_NAMESPACE));
81 dependentModule.setNamespace(URI.create(DEPENDENT_MODULE_NAMESPACE));
83 masterModule.setNamespace(URI.create(MASTER_MODULE_NAMESPACE));
84 dependentModule.setNamespace(URI.create(DEPENDENT_MODULE_NAMESPACE));
86 masterModule.setPrefix("mod");
87 dependentModule.setPrefix("mod");
88 masterModule.addModuleImport(dependentModule.getModuleName(), dependentModule.getRevision(), DEPENDENT_MODULE_PREFIX);
92 public void testFindModuleFromBuildersWithNullPrefix() throws Exception {
93 final Map<String, NavigableMap<Date, ModuleBuilder>> testModules = initModuleBuildersForTest();
95 ModuleBuilder result = BuilderUtils.findModuleFromBuilders(testModules, masterModule, null, 12);
96 assertEquals(masterModule, result);
98 result = BuilderUtils.findModuleFromBuilders(testModules, masterModule, masterModule.getPrefix(), 12);
99 assertEquals(masterModule, result);
101 result = BuilderUtils.findModuleFromBuilders(testModules, masterModule, DEPENDENT_MODULE_PREFIX, 12);
102 assertEquals(dependentModule, result);
105 private Map<String, NavigableMap<Date, ModuleBuilder>> initModuleBuildersForTest() throws Exception {
106 final Map<String, NavigableMap<Date, ModuleBuilder>> modules = new HashMap<>();
107 final String module3Name = "Module3";
109 ModuleBuilder module3 = new ModuleBuilder(module3Name, "test/module/path/module3.yang");
110 final Date moduleRevision = SIMPLE_DATE_FORMAT.parse(MODULES_REVISION);
112 module3.setRevision(moduleRevision);
113 module3.setNamespace(URI.create("urn:opendaylight.ternary-model"));
114 module3.setPrefix("mod");
116 dependentModule.addModuleImport(module3.getModuleName(), module3.getRevision(), "ter");
118 final NavigableMap<Date, ModuleBuilder> module1Map = new TreeMap<>();
119 module1Map.put(masterModule.getRevision(), masterModule);
121 final NavigableMap<Date, ModuleBuilder> module2Map = new TreeMap<>();
122 module2Map.put(dependentModule.getRevision(), dependentModule);
124 final NavigableMap<Date, ModuleBuilder> module3Map = new TreeMap<>();
125 module3Map.put(module3.getRevision(), module3);
127 modules.put(masterModule.getName(), module1Map);
128 modules.put(dependentModule.getName(), module2Map);
129 modules.put(module3Name, module3Map);
134 @Test(expected = YangParseException.class)
135 public void testFindModuleFromBuildersWithNoImportedModule() throws Exception {
136 final Map<String, NavigableMap<Date, ModuleBuilder>> testModules = initModuleBuildersForTest();
138 BuilderUtils.findModuleFromBuilders(testModules, masterModule, "eth", 12);
141 @Test(expected = YangParseException.class)
142 public void testFindModuleFromContextWithDependentModuleImportEqualsToNull() {
143 final SchemaContext mockContext = mock(SchemaContext.class);
145 BuilderUtils.findModuleFromContext(mockContext, masterModule, "inalid-prefix", 14);
148 @Test(expected = YangParseException.class)
149 public void testFindModuleFromContextWhereModuleIsNotPresent() {
150 final SchemaContext mockContext = mock(SchemaContext.class);
152 BuilderUtils.findModuleFromContext(mockContext, masterModule, DEPENDENT_MODULE_PREFIX, 14);
155 @Test(expected = YangParseException.class)
156 public void testFillAugmentTargetForInvalidTarget() {
157 AugmentationSchemaBuilder augBuilder = mock(AugmentationSchemaBuilder.class);
158 Builder invalidTarget = mock(Builder.class);
159 BuilderUtils.fillAugmentTarget(augBuilder, invalidTarget);
162 @Test(expected = YangParseException.class)
163 public void testFillAugmentTargetWithChoiceBuilderContainingInvalidUsesNodeBuilder() {
164 final QName usesQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "test-grouping");
165 final UsesNodeBuilder usesNodeBuilder = new UsesNodeBuilderImpl(masterModule.getModuleName(), 10, SchemaPath.create(true, usesQName));
167 final QName augTargetQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "target");
168 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(masterModule.getModuleName(), 12,
169 "/target", SchemaPath.create(true, augTargetQName), 1);
171 augBuilder.setParent(usesNodeBuilder);
173 final QName choiceQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "test-choice");
174 final ChoiceBuilder choiceBuilder = new ChoiceBuilder(masterModule.getModuleName(), 14, choiceQName,
175 SchemaPath.create(true, choiceQName));
177 augBuilder.addUsesNode(usesNodeBuilder);
178 BuilderUtils.fillAugmentTarget(augBuilder, choiceBuilder);
182 public void testFillAugmentTargetSetNodeAddedByUses() {
183 final QName augTargetQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "target");
184 final AugmentationSchemaBuilder augBuilder = new AugmentationSchemaBuilderImpl(masterModule.getModuleName(), 12,
185 "/target", SchemaPath.create(true, augTargetQName), 1);
187 final String containerLocalName = "top-level-container";
188 final QName containerQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), containerLocalName);
189 SchemaPath containerPath = SchemaPath.create(true, containerQName);
190 augBuilder.addChildNode(
191 new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 10, containerQName, containerPath));
193 final QName choiceQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "test-choice");
194 final ChoiceBuilder choiceBuilder = new ChoiceBuilder(masterModule.getModuleName(), 14, choiceQName,
195 SchemaPath.create(true, choiceQName));
197 BuilderUtils.fillAugmentTarget(augBuilder, choiceBuilder);
199 ChoiceCaseBuilder result = choiceBuilder.getCaseNodeByName(containerLocalName);
200 assertNotNull(result);
204 public void testFindUnknownNodeInDataNodeContainer() {
205 final String parentLocalName = "parent";
206 final QName containerQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), parentLocalName);
207 SchemaPath containerPath = SchemaPath.create(true, containerQName);
209 final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 10,
210 containerQName, containerPath);
212 final String unknownLocalName = "unknown-ext-use";
213 final QName unknownNode = QName.create(masterModule.getNamespace(), masterModule.getRevision(), unknownLocalName);
214 SchemaPath unknownNodePath = SchemaPath.create(true, containerQName, unknownNode);
215 UnknownSchemaNodeBuilderImpl unknownNodeBuilder = new UnknownSchemaNodeBuilderImpl(masterModule.getModuleName(),
216 22, unknownNode, unknownNodePath);
217 containerBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
219 List<QName> path = new ArrayList<>(2);
220 path.add(unknownNode);
222 SchemaNodeBuilder result = BuilderUtils.findSchemaNode(path, containerBuilder);
223 assertNotNull(result);
224 assertEquals(unknownNodeBuilder, result);
226 path.add(QName.create(masterModule.getNamespace(), masterModule.getRevision(), "foo"));
227 assertNull(BuilderUtils.findSchemaNode(path, containerBuilder));
229 final QName choiceQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "select");
230 SchemaPath choicePath = SchemaPath.create(true, choiceQName);
232 final ChoiceBuilder choiceBuilder = new ChoiceBuilder(masterModule.getModuleName(), 33, choiceQName, choicePath);
234 final QName caseQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "simple-case");
235 SchemaPath casePath = SchemaPath.create(true, choiceQName, caseQName);
237 ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(masterModule.getModuleName(), 35, caseQName, casePath);
238 choiceBuilder.addCase(caseBuilder);
240 choiceBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
244 result = BuilderUtils.findSchemaNode(path, choiceBuilder);
245 assertNotNull(result);
246 assertTrue(result instanceof ChoiceCaseBuilder);
247 assertEquals(caseBuilder, result);
250 path.add(unknownNode);
251 result = BuilderUtils.findSchemaNode(path, choiceBuilder);
252 assertNotNull(result);
253 assertEquals(unknownNodeBuilder, result);
255 path.add(QName.create(masterModule.getNamespace(), masterModule.getRevision(), "foo"));
256 result = BuilderUtils.findSchemaNode(path, choiceBuilder);
259 final QName rpcQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), parentLocalName);
260 SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
261 final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(masterModule.getModuleName(), 45, rpcQName, rpcPath);
263 final QName inputQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "input");
264 final SchemaPath inputPath = SchemaPath.create(true, rpcQName, inputQName);
266 final QName outputQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "output");
267 final SchemaPath outputPath = SchemaPath.create(true, rpcQName, outputQName);
269 final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 46,
270 inputQName, inputPath);
271 final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 76,
272 outputQName, outputPath);
274 rpcBuilder.setInput(inputBuilder);
275 rpcBuilder.setOutput(outputBuilder);
276 rpcBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
279 path.add(inputQName);
280 result = BuilderUtils.findSchemaNode(path, rpcBuilder);
281 assertNotNull(result);
282 assertEquals(inputBuilder, result);
285 path.add(outputQName);
286 result = BuilderUtils.findSchemaNode(path, rpcBuilder);
287 assertNotNull(result);
288 assertEquals(outputBuilder, result);
291 path.add(unknownNode);
292 result = BuilderUtils.findSchemaNode(path, rpcBuilder);
293 assertNotNull(result);
294 assertEquals(unknownNodeBuilder, result);
296 final QName leafQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "simple-leaf");
297 SchemaPath leafPath = SchemaPath.create(true, leafQName);
299 final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(masterModule.getModuleName(), 10, leafQName, leafPath);
300 leafBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
303 path.add(unknownNode);
304 result = BuilderUtils.findSchemaNode(path, leafBuilder);
305 assertNotNull(result);
306 assertEquals(unknownNodeBuilder, result);
310 public void testFindUnknownSchemaNodeInModule() {
311 final String parentLocalName = "parent";
312 final QName containerQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), parentLocalName);
313 SchemaPath containerPath = SchemaPath.create(true, containerQName);
315 final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 10,
316 containerQName, containerPath);
318 final String unknownLocalName = "unknown-ext-use";
319 final QName unknownNode = QName.create(masterModule.getNamespace(), masterModule.getRevision(), unknownLocalName);
320 final SchemaPath unknownNodePath = SchemaPath.create(true, containerQName, unknownNode);
321 UnknownSchemaNodeBuilderImpl unknownNodeBuilder = new UnknownSchemaNodeBuilderImpl(masterModule.getModuleName(),
322 22, unknownNode, unknownNodePath);
323 containerBuilder.addUnknownNodeBuilder(unknownNodeBuilder);
325 masterModule.addChildNode(containerBuilder);
327 Optional<SchemaNodeBuilder> result = BuilderUtils.findSchemaNodeInModule(unknownNodePath, masterModule);
329 assertTrue(result.isPresent());
330 assertEquals(result.get(), unknownNodeBuilder);
332 final QName invalidUnknownNode = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "invalid-ext-use");
333 final SchemaPath invalidPath = SchemaPath.create(true, containerQName, invalidUnknownNode);
335 result = BuilderUtils.findSchemaNodeInModule(invalidPath, masterModule);
336 assertFalse(result.isPresent());
340 public void testFindContainerInRPC() {
342 final QName rpcQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "send-message");
343 SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
344 final RpcDefinitionBuilder rpcBuilder = masterModule.addRpc(45, rpcQName, rpcPath);
346 final QName inputQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "input");
347 final SchemaPath inputPath = SchemaPath.create(true, rpcQName, inputQName);
349 final QName outputQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "output");
350 final SchemaPath outputPath = SchemaPath.create(true, rpcQName, outputQName);
352 Optional<SchemaNodeBuilder> requestResult = BuilderUtils.findSchemaNodeInModule(inputPath, masterModule);
353 assertTrue(requestResult.isPresent());
355 Optional<SchemaNodeBuilder> responseResult = BuilderUtils.findSchemaNodeInModule(outputPath, masterModule);
356 assertTrue(responseResult.isPresent());
358 final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 46,
359 inputQName, inputPath);
360 final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 76,
361 outputQName, outputPath);
363 final QName request = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "request");
364 final SchemaPath requestPath = SchemaPath.create(true, rpcQName, inputQName, request);
366 final QName response = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "response");
367 final SchemaPath responsePath = SchemaPath.create(true, rpcQName, outputQName, response);
369 final ContainerSchemaNodeBuilder requestBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 50,
370 request, requestPath);
371 final ContainerSchemaNodeBuilder responseBuilder = new ContainerSchemaNodeBuilder(masterModule.getModuleName(), 80,
372 response, responsePath);
374 inputBuilder.addChildNode(requestBuilder);
375 outputBuilder.addChildNode(responseBuilder);
377 rpcBuilder.setInput(inputBuilder);
378 rpcBuilder.setOutput(outputBuilder);
380 requestResult = BuilderUtils.findSchemaNodeInModule(requestPath, masterModule);
381 assertTrue(requestResult.isPresent());
383 responseResult = BuilderUtils.findSchemaNodeInModule(responsePath, masterModule);
384 assertTrue(responseResult.isPresent());
386 final SchemaPath invalidPath = SchemaPath.create(true, rpcQName, response);
387 Optional<SchemaNodeBuilder> invalidResult = BuilderUtils.findSchemaNodeInModule(invalidPath, masterModule);
388 assertFalse(invalidResult.isPresent());
392 public void testFindIdentity() {
393 assertNull(BuilderUtils.findIdentity(Collections.emptySet(), "test-identity"));
397 public void testGetModuleByPrefix() {
398 assertEquals(BuilderUtils.getModuleByPrefix(masterModule, null), masterModule);
399 assertEquals(BuilderUtils.getModuleByPrefix(masterModule, ""), masterModule);
400 assertEquals(BuilderUtils.getModuleByPrefix(masterModule, masterModule.getPrefix()), masterModule);
404 public void testFindModule() {
405 final Map<URI, NavigableMap<Date, ModuleBuilder>> modules = new HashMap<>(1);
406 final NavigableMap<Date, ModuleBuilder> masterModuleMap = new TreeMap<>();
407 masterModuleMap.put(masterModule.getRevision(), masterModule);
408 modules.put(masterModule.getNamespace(), masterModuleMap);
410 assertNull(BuilderUtils.findModule(QName.create("test-urn:namespace", "2014-10-08", "impossible-module"), modules));
412 assertEquals(BuilderUtils.findModule(QName.create(masterModule.getNamespace(), null, masterModule.getName()), modules),
417 public void testFindBaseIdentity() {
418 assertNull(BuilderUtils.findBaseIdentity(masterModule, "prefix:ident", 27));
420 final QName identity = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "ident");
421 masterModule.addIdentity(identity, 22, SchemaPath.create(true, identity));
423 final IdentitySchemaNodeBuilder result = BuilderUtils
424 .findBaseIdentity(masterModule, masterModule.getPrefix() + ":ident", 22);
425 assertNotNull(result);
426 assertEquals(result.getQName(), identity);
430 public void testWrapChildNode() {
431 final QName leafQName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "parent-leaf");
432 final SchemaPath leafPath = SchemaPath.create(true, leafQName);
433 final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(masterModule.getModuleName(),
434 27, leafQName, leafPath);
435 leafListBuilder.setType(Uint16.getInstance());
437 final LeafListSchemaNode leafList = leafListBuilder.build();
439 DataSchemaNodeBuilder wrapedLeafList = BuilderUtils
440 .wrapChildNode(masterModule.getModuleName(), 72, leafList, leafPath, leafQName);
442 assertNotNull(wrapedLeafList);
443 assertEquals(wrapedLeafList.getQName(), leafList.getQName());
446 @Test(expected = YangParseException.class)
447 public void wrapChildNodeForUnknownNode() {
448 final QName qName = QName.create(masterModule.getNamespace(), masterModule.getRevision(), "name");
449 final SchemaPath path = SchemaPath.create(true, qName);
452 .wrapChildNode(masterModule.getModuleName(), 72, new NotExistingDataSchemaNodeImpl(), path, qName);
455 private static class NotExistingDataSchemaNodeImpl implements DataSchemaNode {
457 @Override public boolean isAugmenting() {
461 @Override public boolean isAddedByUses() {
465 @Override public boolean isConfiguration() {
469 @Override public ConstraintDefinition getConstraints() {
473 @Override public QName getQName() {
477 @Override public SchemaPath getPath() {
481 @Override public List<UnknownSchemaNode> getUnknownSchemaNodes() {
485 @Override public String getDescription() {
489 @Override public String getReference() {
493 @Override public Status getStatus() {