2 * Copyright (c) 2015 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.data.impl.schema.tree;
10 import static org.junit.Assert.assertEquals;
11 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
13 import org.junit.AfterClass;
14 import org.junit.BeforeClass;
15 import org.junit.Test;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
21 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
22 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
23 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
24 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
26 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
27 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
29 public class MandatoryLeafTest {
30 private static EffectiveModelContext SCHEMA_CONTEXT;
33 public static void beforeClass() {
34 SCHEMA_CONTEXT = TestModel.createTestContext("/mandatory-leaf-test.yang");
38 public static void afterClass() {
39 SCHEMA_CONTEXT = null;
42 private static DataTree initDataTree(final boolean enableValidation) {
43 return new InMemoryDataTreeFactory().create(
44 new DataTreeConfiguration.Builder(TreeType.CONFIGURATION).setMandatoryNodesValidation(enableValidation)
45 .build(), SCHEMA_CONTEXT);
49 public void testCorrectMandatoryLeafWrite() throws DataValidationFailedException {
50 final DataTree inMemoryDataTree = initDataTree(true);
51 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
53 final ContainerNode container = Builders
55 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
57 Builders.choiceBuilder()
58 .withNodeIdentifier(choice1Id)
60 Builders.containerBuilder()
62 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
65 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"),
68 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
69 "leaf-value2")).build()).build()).build();
71 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
72 modificationTree.write(TestModel.TEST_PATH, container);
73 modificationTree.ready();
75 inMemoryDataTree.validate(modificationTree);
76 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
77 inMemoryDataTree.commit(prepare);
81 public void testCorrectMandatoryLeafChoiceWrite() throws DataValidationFailedException {
82 final DataTree inMemoryDataTree = initDataTree(true);
84 final ContainerNode container = Builders.containerBuilder()
85 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
87 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
88 modificationTree1.write(TestModel.TEST_PATH, container);
89 modificationTree1.ready();
91 inMemoryDataTree.validate(modificationTree1);
92 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
93 inMemoryDataTree.commit(prepare1);
96 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
97 final ChoiceNode choice = Builders
99 .withNodeIdentifier(choice1Id)
101 Builders.containerBuilder()
103 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
104 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"), "leaf-value"))
105 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
108 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
109 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
110 modificationTree2.ready();
112 inMemoryDataTree.validate(modificationTree2);
113 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
114 inMemoryDataTree.commit(prepare2);
117 @Test(expected = IllegalArgumentException.class)
118 public void testMandatoryLeafViolation() throws DataValidationFailedException {
119 final DataTree inMemoryDataTree = initDataTree(true);
120 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
122 final ContainerNode container = Builders
124 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
126 Builders.choiceBuilder()
127 .withNodeIdentifier(choice1Id)
129 Builders.containerBuilder()
131 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
134 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
135 "leaf-value2")).build()).build()).build();
137 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
138 modificationTree.write(TestModel.TEST_PATH, container);
139 modificationTree.ready();
141 inMemoryDataTree.validate(modificationTree);
142 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
143 inMemoryDataTree.commit(prepare);
144 } catch (final IllegalArgumentException e) {
145 assertEquals("Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?"
146 + "revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:"
147 + "yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
154 public void testDisabledValidation() throws DataValidationFailedException {
155 final DataTree inMemoryDataTree = initDataTree(false);
156 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
158 final ContainerNode container = Builders
160 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
162 Builders.choiceBuilder()
163 .withNodeIdentifier(choice1Id)
165 Builders.containerBuilder()
167 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
170 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
171 "leaf-value2")).build()).build()).build();
172 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
173 modificationTree.write(TestModel.TEST_PATH, container);
174 modificationTree.ready();
176 inMemoryDataTree.validate(modificationTree);
177 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
178 inMemoryDataTree.commit(prepare);
181 @Test(expected = IllegalArgumentException.class)
182 public void testMandatoryLeafViolationChoiceWrite() throws DataValidationFailedException {
183 final DataTree inMemoryDataTree = initDataTree(true);
185 final ContainerNode container = Builders.containerBuilder()
186 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
188 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
189 modificationTree1.write(TestModel.TEST_PATH, container);
190 modificationTree1.ready();
192 inMemoryDataTree.validate(modificationTree1);
193 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
194 inMemoryDataTree.commit(prepare1);
197 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
198 final ChoiceNode choice = Builders
200 .withNodeIdentifier(choice1Id)
202 Builders.containerBuilder()
204 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
205 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
209 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
210 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
211 modificationTree2.ready();
212 inMemoryDataTree.validate(modificationTree2);
213 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
214 inMemoryDataTree.commit(prepare2);
215 } catch (final IllegalArgumentException e) {
216 assertEquals("Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?"
217 + "revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:"
218 + "yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
225 public void testDisabledValidationChoiceWrite() throws DataValidationFailedException {
226 final DataTree inMemoryDataTree = initDataTree(false);
228 final ContainerNode container = Builders.containerBuilder()
229 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
231 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
232 modificationTree1.write(TestModel.TEST_PATH, container);
233 modificationTree1.ready();
235 inMemoryDataTree.validate(modificationTree1);
236 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
237 inMemoryDataTree.commit(prepare1);
240 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
241 final ChoiceNode choice = Builders
243 .withNodeIdentifier(choice1Id)
245 Builders.containerBuilder()
247 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
248 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
251 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
252 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
253 modificationTree2.ready();
254 inMemoryDataTree.validate(modificationTree2);
255 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
256 inMemoryDataTree.commit(prepare2);