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.SchemaContext;
29 public class MandatoryLeafTest {
31 private static SchemaContext SCHEMA_CONTEXT;
34 public static void beforeClass() {
35 SCHEMA_CONTEXT = TestModel.createTestContext("/mandatory-leaf-test.yang");
39 public static void afterClass() {
40 SCHEMA_CONTEXT = null;
43 private static DataTree initDataTree(final boolean enableValidation) {
44 return new InMemoryDataTreeFactory().create(
45 new DataTreeConfiguration.Builder(TreeType.CONFIGURATION).setMandatoryNodesValidation(enableValidation)
46 .build(), SCHEMA_CONTEXT);
50 public void testCorrectMandatoryLeafWrite() throws DataValidationFailedException {
51 final DataTree inMemoryDataTree = initDataTree(true);
52 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
54 final ContainerNode container = Builders
56 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
58 Builders.choiceBuilder()
59 .withNodeIdentifier(choice1Id)
61 Builders.containerBuilder()
63 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
66 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"),
69 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
70 "leaf-value2")).build()).build()).build();
72 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
73 modificationTree.write(TestModel.TEST_PATH, container);
74 modificationTree.ready();
76 inMemoryDataTree.validate(modificationTree);
77 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
78 inMemoryDataTree.commit(prepare);
82 public void testCorrectMandatoryLeafChoiceWrite() throws DataValidationFailedException {
83 final DataTree inMemoryDataTree = initDataTree(true);
85 final ContainerNode container = Builders.containerBuilder()
86 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
88 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
89 modificationTree1.write(TestModel.TEST_PATH, container);
90 modificationTree1.ready();
92 inMemoryDataTree.validate(modificationTree1);
93 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
94 inMemoryDataTree.commit(prepare1);
97 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
98 final ChoiceNode choice = Builders
100 .withNodeIdentifier(choice1Id)
102 Builders.containerBuilder()
104 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
105 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"), "leaf-value"))
106 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
109 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
110 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
111 modificationTree2.ready();
113 inMemoryDataTree.validate(modificationTree2);
114 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
115 inMemoryDataTree.commit(prepare2);
118 @Test(expected = IllegalArgumentException.class)
119 public void testMandatoryLeafViolation() throws DataValidationFailedException {
120 final DataTree inMemoryDataTree = initDataTree(true);
121 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
123 final ContainerNode container = Builders
125 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
127 Builders.choiceBuilder()
128 .withNodeIdentifier(choice1Id)
130 Builders.containerBuilder()
132 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
135 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
136 "leaf-value2")).build()).build()).build();
138 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
139 modificationTree.write(TestModel.TEST_PATH, container);
140 modificationTree.ready();
142 inMemoryDataTree.validate(modificationTree);
143 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
144 inMemoryDataTree.commit(prepare);
145 } catch (final IllegalArgumentException e) {
146 assertEquals("Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?"
147 + "revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:"
148 + "yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
155 public void testDisabledValidation() throws DataValidationFailedException {
156 final DataTree inMemoryDataTree = initDataTree(false);
157 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
159 final ContainerNode container = Builders
161 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
163 Builders.choiceBuilder()
164 .withNodeIdentifier(choice1Id)
166 Builders.containerBuilder()
168 new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
171 leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
172 "leaf-value2")).build()).build()).build();
173 final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
174 modificationTree.write(TestModel.TEST_PATH, container);
175 modificationTree.ready();
177 inMemoryDataTree.validate(modificationTree);
178 final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
179 inMemoryDataTree.commit(prepare);
182 @Test(expected = IllegalArgumentException.class)
183 public void testMandatoryLeafViolationChoiceWrite() throws DataValidationFailedException {
184 final DataTree inMemoryDataTree = initDataTree(true);
186 final ContainerNode container = Builders.containerBuilder()
187 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
189 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
190 modificationTree1.write(TestModel.TEST_PATH, container);
191 modificationTree1.ready();
193 inMemoryDataTree.validate(modificationTree1);
194 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
195 inMemoryDataTree.commit(prepare1);
198 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
199 final ChoiceNode choice = Builders
201 .withNodeIdentifier(choice1Id)
203 Builders.containerBuilder()
205 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
206 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
210 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
211 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
212 modificationTree2.ready();
213 inMemoryDataTree.validate(modificationTree2);
214 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
215 inMemoryDataTree.commit(prepare2);
216 } catch (final IllegalArgumentException e) {
217 assertEquals("Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?"
218 + "revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:"
219 + "yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
226 public void testDisabledValidationChoiceWrite() throws DataValidationFailedException {
227 final DataTree inMemoryDataTree = initDataTree(false);
229 final ContainerNode container = Builders.containerBuilder()
230 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
232 final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
233 modificationTree1.write(TestModel.TEST_PATH, container);
234 modificationTree1.ready();
236 inMemoryDataTree.validate(modificationTree1);
237 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
238 inMemoryDataTree.commit(prepare1);
241 final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
242 final ChoiceNode choice = Builders
244 .withNodeIdentifier(choice1Id)
246 Builders.containerBuilder()
248 new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
249 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
252 final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
253 modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
254 modificationTree2.ready();
255 inMemoryDataTree.validate(modificationTree2);
256 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
257 inMemoryDataTree.commit(prepare2);