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.*;
12 import java.text.SimpleDateFormat;
13 import java.util.Date;
14 import java.util.List;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
20 import org.opendaylight.yangtools.yang.model.util.Uint16;
21 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
28 * Test suite for increasing of test coverage of ModuleBuilder implementation.
30 * @see org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder
32 * @author Lukas Sedlak <lsedlak@cisco.com>
34 public class ModuleBuilderTest {
36 private final static String TEST_MODULE_NAMESPACE = "urn:opendaylight.foo";
37 private final static String TEST_MODULE_REVISION = "2014-09-22";
38 private final static String MODULE_NAME = "TestModule";
39 private static final String TEST_MODULE_PATH = "/test/module/path";
41 private ModuleBuilder moduleBuilder;
44 public void setUp() throws Exception {
45 moduleBuilder = new ModuleBuilder(MODULE_NAME , TEST_MODULE_PATH);
49 public void testGetSetModuleBuilderMethods() throws Exception {
50 assertEquals("module", moduleBuilder.getStatementName());
51 assertEquals(TEST_MODULE_PATH, moduleBuilder.getModuleSourcePath());
52 assertNotNull(moduleBuilder.getAllLists());
53 final URI namespace = URI.create(TEST_MODULE_NAMESPACE + "?" + TEST_MODULE_REVISION);
54 moduleBuilder.setNamespace(namespace);
55 assertEquals(namespace, moduleBuilder.getNamespace());
56 moduleBuilder.setBelongsTo("TEST_SUBMODULE");
57 assertEquals("TEST_SUBMODULE", moduleBuilder.getBelongsTo());
58 final Date revision = new SimpleDateFormat("yyyy-dd-mm").parse(TEST_MODULE_REVISION);
59 moduleBuilder.setRevision(revision);
60 assertEquals(revision, moduleBuilder.getRevision());
63 @Test(expected = IllegalArgumentException.class)
64 public void testCheckPrefixFailOnPrefixNull() {
65 moduleBuilder.addModuleImport("TEST_MODULE", null, null);
68 @Test(expected = IllegalArgumentException.class)
69 public void testCheckPrefixFailOnPrefixStringIsEmpty() {
70 moduleBuilder.addModuleImport("TEST_MODULE", null, "");
73 @Test(expected = IllegalArgumentException.class)
74 public void testCheckPrefixFailOnPrefixEqualsModuleBuilderPrefix() {
75 moduleBuilder.setPrefix("prefix");
76 moduleBuilder.addModuleImport("TEST_MODULE", null, "prefix");
80 public void testGetActualNodeNullResult() {
81 moduleBuilder.exitNode();
82 assertNull(moduleBuilder.getActualNode());
85 @Test(expected = YangParseException.class)
86 public void testSetParent() throws Exception {
87 moduleBuilder.setParent(new Builder() {
88 @Override public String getModuleName() {
92 @Override public void setModuleName(String moduleName) {
96 @Override public int getLine() {
100 @Override public Builder getParent() {
104 @Override public void setParent(Builder parent) {
108 @Override public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {
112 @Override public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
116 @Override public Object build() {
122 @Test(expected = YangParseException.class)
123 public void testAddExtensionWhereParentNodeIsNotModuleBuilder() throws Exception {
124 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
125 SchemaPath containerPath = SchemaPath.create(true, containerQName);
126 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
127 final QName extQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
128 SchemaPath extPath = SchemaPath.create(true, containerQName, extQName);
129 moduleBuilder.addExtension(extQName, 12, extPath);
132 @Test(expected = YangParseException.class)
133 public void testAddExtensionWhereNameOfExtensionCollides() throws Exception {
134 final QName extQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
135 SchemaPath extPath = SchemaPath.create(true, extQName);
136 moduleBuilder.addExtension(extQName, 12, extPath);
138 final QName extQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
139 moduleBuilder.addExtension(extQName2, 22, extPath);
142 @Test(expected = YangParseException.class)
143 public void testAddDuplicateGroupingIntoModule() {
144 final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
145 final SchemaPath groupPath1 = SchemaPath.create(true, testGroup1);
147 final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
148 final SchemaPath groupPath2 = SchemaPath.create(true, testGroup2);
150 moduleBuilder.addGrouping(12, testGroup1, groupPath1);
151 moduleBuilder.addGrouping(12, testGroup2, groupPath2);
154 @Test(expected = YangParseException.class)
155 public void testAddDuplicateGroupingIntoDataNodeContainer() {
156 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
157 SchemaPath containerPath = SchemaPath.create(true, containerQName);
158 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
159 final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
160 final SchemaPath groupPath1 = SchemaPath.create(true, containerQName, testGroup1);
162 final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
163 final SchemaPath groupPath2 = SchemaPath.create(true, containerQName, testGroup2);
165 moduleBuilder.addGrouping(12, testGroup1, groupPath1);
166 moduleBuilder.addGrouping(22, testGroup2, groupPath2);
170 public void testAddTwoGroupingIntoDataNodeContainer() {
171 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
172 SchemaPath containerPath = SchemaPath.create(true, containerQName);
173 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
174 final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
175 final SchemaPath groupPath1 = SchemaPath.create(true, containerQName, testGroup1);
177 final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group2");
178 final SchemaPath groupPath2 = SchemaPath.create(true, containerQName, testGroup2);
180 GroupingBuilder grouping1 = moduleBuilder.addGrouping(12, testGroup1, groupPath1);
181 GroupingBuilder grouping2 = moduleBuilder.addGrouping(22, testGroup2, groupPath2);
183 assertNotNull(grouping1);
184 assertNotNull(grouping2);
187 @Test(expected = YangParseException.class)
188 public void testAddDuplicateGroupingIntoRpcDefinition() {
189 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
190 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
191 moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcDefName, rpcPath));
192 final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
193 final SchemaPath groupPath1 = SchemaPath.create(true, rpcDefName, testGroup1);
195 final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
196 final SchemaPath groupPath2 = SchemaPath.create(true, rpcDefName, testGroup2);
198 moduleBuilder.addGrouping(12, testGroup1, groupPath1);
199 moduleBuilder.addGrouping(22, testGroup2, groupPath2);
203 public void testAddTwoGroupingsIntoRpcDefinition() {
204 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
205 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
206 moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcDefName, rpcPath));
207 final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
208 final SchemaPath groupPath1 = SchemaPath.create(true, rpcDefName, testGroup1);
210 final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group2");
211 final SchemaPath groupPath2 = SchemaPath.create(true, rpcDefName, testGroup2);
213 GroupingBuilder grouping1 = moduleBuilder.addGrouping(12, testGroup1, groupPath1);
214 GroupingBuilder grouping2 = moduleBuilder.addGrouping(22, testGroup2, groupPath2);
216 assertNotNull(grouping1);
217 assertNotNull(grouping2);
220 @Test(expected = YangParseException.class)
221 public void testAddGroupingIntoNonValidStatementDefinition() {
222 final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
223 SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
224 moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
225 final QName testGroup = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
226 final SchemaPath groupPath = SchemaPath.create(true, leafListDefName, testGroup);
228 moduleBuilder.addGrouping(12, testGroup, groupPath);
231 @Test(expected = YangParseException.class)
232 public void testInvalidAugmentPathTargetString() {
233 final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
234 moduleBuilder.addAugment(12, "something/something", SchemaPath.create(true, targetSchemaName), 0);
237 @Test(expected = YangParseException.class)
238 public void testInvalidAugmentPathTargetStringInUsesNode() {
239 final QName usesNode = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-uses-node");
240 SchemaPath targetPath = SchemaPath.create(true, usesNode);
241 moduleBuilder.enterNode(new UsesNodeBuilderImpl(MODULE_NAME, 10, targetPath));
242 final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
243 moduleBuilder.addAugment(12, "/something/something", SchemaPath.create(true, targetSchemaName), 0);
246 @Test(expected = YangParseException.class)
247 public void testInvalidAugmentDefinition() {
248 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
249 SchemaPath containerPath = SchemaPath.create(true, containerQName);
250 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
252 final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
253 moduleBuilder.addAugment(12, "/something/something", SchemaPath.create(true, targetSchemaName), 0);
256 @Test(expected = YangParseException.class)
257 public void testInvalidUsesNodeUse() {
258 final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
259 SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
260 moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
262 final QName testGroup = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
263 final SchemaPath groupPath = SchemaPath.create(true, testGroup);
265 moduleBuilder.addUsesNode(17, groupPath);
268 @Test(expected = YangParseException.class)
269 public void testAddRefineToNonUsesNodeBuilder() throws Exception {
270 final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
271 SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
272 moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
274 moduleBuilder.addRefine(new RefineHolderImpl(MODULE_NAME, 12, "testRefineName"));
277 @Test(expected = YangParseException.class)
278 public void testAddRpcToNonModuleBuilder() throws Exception {
279 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
280 SchemaPath containerPath = SchemaPath.create(true, containerQName);
281 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
283 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
284 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
286 moduleBuilder.addRpc(17, rpcDefName, rpcPath);
289 @Test(expected = YangParseException.class)
290 public void testAddRpcWithSameNameAsAlreadyExistingDataNodeContainer() throws Exception {
291 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "element-foo");
292 SchemaPath containerPath = SchemaPath.create(true, containerQName);
293 moduleBuilder.addContainerNode(10, containerQName, containerPath);
295 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "element-foo");
296 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
297 moduleBuilder.addRpc(17, rpcDefName, rpcPath);
300 @Test(expected = YangParseException.class)
301 public void testAddDuplicateRpc() throws Exception {
302 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
303 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
304 moduleBuilder.addRpc(17, rpcDefName, rpcPath);
306 final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
307 SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
308 moduleBuilder.addRpc(23, rpcDefName2, rpcPath2);
311 @Test(expected = YangParseException.class)
312 public void testAddRpcWithSameNameAsAlreadyDefinedNotification() throws Exception {
313 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
314 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
315 moduleBuilder.addNotification(17, rpcDefName, rpcPath);
317 final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
318 SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
319 moduleBuilder.addRpc(23, rpcDefName2, rpcPath2);
322 @Test(expected = YangParseException.class)
323 public void testAddRpcInputForInvalidParent() throws Exception {
324 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
325 final QName rpcInput = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "input");
326 SchemaPath rpcInputPath = SchemaPath.create(true, rpcDefName, rpcInput);
328 moduleBuilder.addRpcInput(23, rpcInput, rpcInputPath);
331 @Test(expected = YangParseException.class)
332 public void testAddRpcOutputForInvalidParent() throws Exception {
333 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
334 final QName rpcOutput = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "output");
335 SchemaPath rpcOutputPath = SchemaPath.create(true, rpcDefName, rpcOutput);
337 moduleBuilder.addRpcOutput(rpcOutputPath, rpcOutput, 23);
340 @Test(expected = YangParseException.class)
341 public void testAddNotificationForInvalidParent() throws Exception {
342 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
343 SchemaPath containerPath = SchemaPath.create(true, containerQName);
344 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
346 final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
347 SchemaPath notificationPath = SchemaPath.create(true, notificationName);
349 moduleBuilder.addNotification(12, notificationName, notificationPath);
352 @Test(expected = YangParseException.class)
353 public void testAddNotificationWithSameNameAsAlreadyExistingDataNodeContainer() throws Exception {
354 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify");
355 SchemaPath containerPath = SchemaPath.create(true, containerQName);
356 moduleBuilder.addContainerNode(10, containerQName, containerPath);
358 final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify");
359 SchemaPath notificationPath = SchemaPath.create(true, notificationName);
361 moduleBuilder.addNotification(12, notificationName, notificationPath);
364 @Test(expected = YangParseException.class)
365 public void testAddDuplicateNotification() throws Exception {
366 final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
367 SchemaPath notificationPath = SchemaPath.create(true, notificationName);
369 moduleBuilder.addNotification(12, notificationName, notificationPath);
371 final QName notificationName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
372 SchemaPath notificationPath2 = SchemaPath.create(true, notificationName2);
374 moduleBuilder.addNotification(17, notificationName2, notificationPath2);
377 @Test(expected = YangParseException.class)
378 public void testAddNotificationWithSameNameAsAlreadyDefinedRpc() throws Exception {
379 final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
380 SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
381 moduleBuilder.addRpc(17, rpcDefName2, rpcPath2);
383 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
384 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
385 moduleBuilder.addNotification(23, rpcDefName, rpcPath);
388 @Test(expected = YangParseException.class)
389 public void testAddFeatureIntoNonModuleBuilder() throws Exception {
390 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
391 SchemaPath containerPath = SchemaPath.create(true, containerQName);
392 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
394 final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
395 SchemaPath featurePath = SchemaPath.create(true, testFeature);
397 moduleBuilder.addFeature(23, testFeature, featurePath);
400 @Test(expected = YangParseException.class)
401 public void testAddDuplicateFeature() throws Exception {
402 final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
403 SchemaPath featurePath = SchemaPath.create(true, testFeature);
405 moduleBuilder.addFeature(23, testFeature, featurePath);
407 final QName testFeature2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
408 SchemaPath featurePath2 = SchemaPath.create(true, testFeature2);
410 moduleBuilder.addFeature(23, testFeature2, featurePath2);
414 public void testAddTwoFeatures() throws Exception {
415 final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
416 SchemaPath featurePath = SchemaPath.create(true, testFeature);
418 final FeatureBuilder feature1 = moduleBuilder.addFeature(23, testFeature, featurePath);
420 final QName testFeature2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature2");
421 SchemaPath featurePath2 = SchemaPath.create(true, testFeature2);
423 final FeatureBuilder feature2 = moduleBuilder.addFeature(23, testFeature2, featurePath2);
425 assertNotNull(feature1);
426 assertNotNull(feature2);
429 @Test(expected = YangParseException.class)
430 public void testAddCaseWhenParentIsNull() throws Exception {
431 moduleBuilder.exitNode();
435 private void addTestCase() {
436 final QName testCase = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-case");
437 SchemaPath testCasePath = SchemaPath.create(true, testCase);
439 moduleBuilder.addCase(72, testCase, testCasePath);
442 @Test(expected = YangParseException.class)
443 public void testAddCaseWhenParentIsModule() throws Exception {
447 @Test(expected = YangParseException.class)
448 public void testAddCaseWhenParentIsNotChoiceNorAugmentation() throws Exception {
449 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
450 SchemaPath containerPath = SchemaPath.create(true, containerQName);
451 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
455 @Test(expected = YangParseException.class)
456 public void testAddDuplicateTypedefIntoContainer() throws Exception {
457 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
458 SchemaPath containerPath = SchemaPath.create(true, containerQName);
459 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
461 tryToAddDuplicateTypedef();
464 private void tryToAddDuplicateTypedef() {
465 final QName testTypedef1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
466 SchemaPath testTypedefPath1 = SchemaPath.create(true, testTypedef1);
468 final QName testTypedef2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
469 SchemaPath testTypedefPath2 = SchemaPath.create(true, testTypedef2);
471 moduleBuilder.addTypedef(23, testTypedef1, testTypedefPath1);
472 moduleBuilder.addTypedef(44, testTypedef2, testTypedefPath2);
475 @Test(expected = YangParseException.class)
476 public void testAddDuplicateTypedefIntoRpcDefinition() throws Exception {
477 final QName rpcQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-rpc");
478 SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
479 moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcQName, rpcPath));
481 tryToAddDuplicateTypedef();
484 @Test(expected = YangParseException.class)
485 public void testAddTypedefIntoNonValidStatement() throws Exception {
486 final QName leafName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaf");
487 SchemaPath leafPath = SchemaPath.create(true, leafName);
488 moduleBuilder.enterNode(new LeafSchemaNodeBuilder(MODULE_NAME, 10, leafName, leafPath));
490 final QName testRpc = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
491 SchemaPath testRpcPath = SchemaPath.create(true, testRpc);
493 moduleBuilder.addTypedef(23, testRpc, testRpcPath);
497 public void testAddTwoTypedefsIntoContainer() throws Exception {
498 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
499 SchemaPath containerPath = SchemaPath.create(true, containerQName);
500 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
502 tryToAddTwoTypedefs();
505 private void tryToAddTwoTypedefs() {
506 final QName testTypedef1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
507 SchemaPath testTypedefPath1 = SchemaPath.create(true, testTypedef1);
509 final QName testTypedef2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition2");
510 SchemaPath testTypedefPath2 = SchemaPath.create(true, testTypedef2);
512 final TypeDefinitionBuilderImpl typedef1 = moduleBuilder.addTypedef(23, testTypedef1, testTypedefPath1);
513 final TypeDefinitionBuilderImpl typedef2 = moduleBuilder.addTypedef(44, testTypedef2, testTypedefPath2);
515 assertNotNull(typedef1);
516 assertNotNull(typedef2);
520 public void testAddTwoTypedefsIntoRpcDefinition() throws Exception {
521 final QName rpcQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-rpc");
522 SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
523 moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcQName, rpcPath));
525 tryToAddTwoTypedefs();
528 @Test(expected = YangParseException.class)
529 public void testSetType() throws Exception {
530 final Uint16 uint = Uint16.getInstance();
531 moduleBuilder.setType(uint);
534 @Test(expected = YangParseException.class)
535 public void testAddUnionTypeWhenParentIsNull() throws Exception {
536 moduleBuilder.exitNode();
541 private void tryToAddUnionType() {
542 final QName unionQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "union-type-def");
543 moduleBuilder.addUnionType(25, QNameModule.create(unionQName.getNamespace(), unionQName.getRevision()));
546 @Test(expected = YangParseException.class)
547 public void testAddUnionTypeWhenParentIsNotTypeAwareBuilder() throws Exception {
548 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
549 SchemaPath containerPath = SchemaPath.create(true, containerQName);
550 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
555 @Test(expected = YangParseException.class)
556 public void addIdentityrefTypeWhenParentIsNull() throws Exception {
557 moduleBuilder.exitNode();
558 tryToAddIdentityrefType();
561 private void tryToAddIdentityrefType() {
562 final QName identityrefQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "identityref-type-def");
563 SchemaPath identityrefPath = SchemaPath.create(true, identityrefQName);
564 moduleBuilder.addIdentityrefType(25, identityrefPath, "simplebase");
567 @Test(expected = YangParseException.class)
568 public void addIdentityrefTypeWhenParentIsNotTypeAwareBuilder() throws Exception {
569 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
570 SchemaPath containerPath = SchemaPath.create(true, containerQName);
571 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
573 tryToAddIdentityrefType();
576 @Test(expected = YangParseException.class)
577 public void testAddDeviationWhereParentIsNotModule() throws Exception {
578 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
579 SchemaPath containerPath = SchemaPath.create(true, containerQName);
580 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
582 final QName deviationQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-deviation-name");
583 SchemaPath deviationPath = SchemaPath.create(true, deviationQName);
585 moduleBuilder.addDeviation(78, deviationPath);
588 @Test(expected = YangParseException.class)
589 public void testAddIdentityWhereParentIsNotModule() throws Exception {
590 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
591 SchemaPath containerPath = SchemaPath.create(true, containerQName);
592 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
597 private void tryToAddIdentity() {
598 final QName identityQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-identity-name");
599 SchemaPath identityPath = SchemaPath.create(true, identityQName);
601 moduleBuilder.addIdentity(identityQName, 78, identityPath);
604 @Test(expected = YangParseException.class)
605 public void testAddDuplicateIdentity() throws Exception {
611 public void testAddUnknownSchemaNodeDirectlyToParent() throws Exception {
612 final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
613 SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
614 assertTrue(moduleBuilder.getUnknownNodes().isEmpty());
615 moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
616 assertFalse(moduleBuilder.getUnknownNodes().isEmpty());
620 public void testAddUnknownSchemaNodeIntoDataNodeContainer() throws Exception {
621 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
622 SchemaPath containerPath = SchemaPath.create(true, containerQName);
623 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
625 final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
626 SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
627 assertTrue(moduleBuilder.getAllUnknownNodes().isEmpty());
628 moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
629 assertFalse(moduleBuilder.getAllUnknownNodes().isEmpty());
632 @Test(expected = YangParseException.class)
633 public void testAddUnknownSchemaNodeIntoNonSchemaNode() throws Exception {
634 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-non-schema-node");
635 SchemaPath containerPath = SchemaPath.create(true, containerQName);
636 moduleBuilder.enterNode(new NonSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
638 final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
639 SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
640 assertTrue(moduleBuilder.getUnknownNodes().isEmpty());
641 moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
642 assertFalse(moduleBuilder.getUnknownNodes().isEmpty());
645 @Test(expected = YangParseException.class)
646 public void testAddContainerWithSameNameAsRpcDefintion() throws Exception {
647 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
648 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
649 moduleBuilder.addRpc(70, rpcDefName, rpcPath);
653 private void tryToAddContainer() {
654 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
655 final SchemaPath containerPath = SchemaPath.create(true, containerQName);
657 moduleBuilder.addContainerNode(22, containerQName, containerPath);
660 @Test(expected = YangParseException.class)
661 public void testAddContainerWithSameNameAsNotificationDefintion() throws Exception {
662 final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
663 SchemaPath notificationPath = SchemaPath.create(true, notificationName);
664 moduleBuilder.addNotification(70, notificationName, notificationPath);
669 public void testAddContainerWithAlreadyAddedRpcDefintion() throws Exception {
670 final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "send-message");
671 SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
672 moduleBuilder.addRpc(70, rpcDefName, rpcPath);
675 DataSchemaNodeBuilder addedContainer = moduleBuilder.getDataChildByName("message");
676 assertNotNull(addedContainer);
680 public void testAddContainerWithAlreadyAddedNotificationDefintion() throws Exception {
681 final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-me");
682 SchemaPath notificationPath = SchemaPath.create(true, notificationName);
683 moduleBuilder.addNotification(70, notificationName, notificationPath);
686 DataSchemaNodeBuilder addedContainer = moduleBuilder.getDataChildByName("message");
687 assertNotNull(addedContainer);
690 @Test(expected = YangParseException.class)
691 public void testAddDuplicateSchemaNodeIntoSubnodeOfModule() throws Exception {
692 final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
693 SchemaPath containerPath = SchemaPath.create(true, containerQName);
694 moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
696 final QName leafQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
697 SchemaPath leafPath1 = SchemaPath.create(true, containerQName, leafQName1);
699 final QName leafQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
700 SchemaPath leafPath2 = SchemaPath.create(true, containerQName, leafQName2);
702 moduleBuilder.addLeafNode(12, leafQName1, leafPath1);
703 moduleBuilder.addLeafNode(20, leafQName2, leafPath2);
706 @Test(expected = YangParseException.class)
707 public void testAddDuplicateCaseIntoChoiceCaseNode() throws Exception {
708 //FIXME: move this into ChoiceBuilderTest !!!
709 final QName choiceQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
710 SchemaPath choicePath = SchemaPath.create(true, choiceQName);
712 moduleBuilder.enterNode(new ChoiceBuilder(MODULE_NAME, 10, choiceQName, choicePath));
714 final QName caseQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
715 SchemaPath casePath1 = SchemaPath.create(true, choiceQName, caseQName1);
717 final QName caseQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
718 SchemaPath casePath2 = SchemaPath.create(true, choiceQName, caseQName2);
720 moduleBuilder.addCase(12, caseQName1, casePath1);
721 moduleBuilder.addCase(20, caseQName2, casePath2);
724 @Test(expected = YangParseException.class)
725 public void testAddChoiceWithSameNameAsCase() throws Exception {
726 final QName choiceQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-choice");
727 SchemaPath choicePath = SchemaPath.create(true, choiceQName);
729 final ChoiceBuilder choiceBuilder = moduleBuilder.addChoice(8, choiceQName, choicePath);
730 moduleBuilder.enterNode(choiceBuilder);
732 final QName caseQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
733 SchemaPath casePath1 = SchemaPath.create(true, choiceQName, caseQName1);
735 final QName caseQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
736 SchemaPath casePath2 = SchemaPath.create(true, choiceQName, caseQName2);
738 moduleBuilder.addCase(12, caseQName1, casePath1);
739 moduleBuilder.addChoice(20, caseQName2, casePath2);
742 @Test(expected = YangParseException.class)
743 public void testAddChildToSubnodeForNonDataNodeContainerAndNonChoiceNode() {
744 final QName leafQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
745 SchemaPath leafPath1 = SchemaPath.create(true, leafQName1);
747 final LeafSchemaNodeBuilder leafBuilder = moduleBuilder.addLeafNode(10, leafQName1, leafPath1);
748 moduleBuilder.enterNode(leafBuilder);
750 final QName leafQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
751 SchemaPath leafPath2 = SchemaPath.create(true, leafQName1, leafQName2);
753 moduleBuilder.addLeafNode(12, leafQName2, leafPath2);
756 private static class NonSchemaNodeBuilder implements Builder {
761 final SchemaPath path;
763 public NonSchemaNodeBuilder(final String moduleName, final int line, final QName name, final SchemaPath path) {
764 this.moduleName = moduleName;
770 @Override public String getModuleName() {
774 @Override public void setModuleName(String moduleName) {
775 this.moduleName = moduleName;
778 @Override public int getLine() {
782 @Override public Builder getParent() {
786 @Override public void setParent(Builder parent) {
790 @Override public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {
794 @Override public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
798 @Override public Object build() {