943c1de02d4a6b59069969e902fc3349f918f091
[yangtools.git] / yang / yang-data-impl / src / test / java / org / opendaylight / yangtools / yang / data / impl / schema / tree / MandatoryLeafTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
12
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;
28
29 public class MandatoryLeafTest {
30
31     private static SchemaContext SCHEMA_CONTEXT;
32
33     @BeforeClass
34     public static void beforeClass() {
35         SCHEMA_CONTEXT = TestModel.createTestContext("/mandatory-leaf-test.yang");
36     }
37
38     @AfterClass
39     public static void afterClass() {
40         SCHEMA_CONTEXT = null;
41     }
42
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);
47     }
48
49     @Test
50     public void testCorrectMandatoryLeafWrite() throws DataValidationFailedException {
51         final DataTree inMemoryDataTree = initDataTree(true);
52         final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
53
54         final ContainerNode container = Builders
55                 .containerBuilder()
56                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
57                 .withChild(
58                         Builders.choiceBuilder()
59                                 .withNodeIdentifier(choice1Id)
60                                 .withChild(
61                                         Builders.containerBuilder()
62                                                 .withNodeIdentifier(
63                                                         new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
64                                                                 "case2-cont")))
65                                                 .withChild(
66                                                         leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"),
67                                                                 "leaf-value"))
68                                                 .withChild(
69                                                         leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
70                                                                 "leaf-value2")).build()).build()).build();
71
72         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
73         modificationTree.write(TestModel.TEST_PATH, container);
74         modificationTree.ready();
75
76         inMemoryDataTree.validate(modificationTree);
77         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
78         inMemoryDataTree.commit(prepare);
79     }
80
81     @Test
82     public void testCorrectMandatoryLeafChoiceWrite() throws DataValidationFailedException {
83         final DataTree inMemoryDataTree = initDataTree(true);
84         // Container write
85         final ContainerNode container = Builders.containerBuilder()
86                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
87
88         final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
89         modificationTree1.write(TestModel.TEST_PATH, container);
90         modificationTree1.ready();
91
92         inMemoryDataTree.validate(modificationTree1);
93         final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
94         inMemoryDataTree.commit(prepare1);
95
96         // Choice write
97         final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
98         final ChoiceNode choice = Builders
99                 .choiceBuilder()
100                 .withNodeIdentifier(choice1Id)
101                 .withChild(
102                         Builders.containerBuilder()
103                                 .withNodeIdentifier(
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"))
107                                 .build()).build();
108
109         final DataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
110         modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
111         modificationTree2.ready();
112
113         inMemoryDataTree.validate(modificationTree2);
114         final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
115         inMemoryDataTree.commit(prepare2);
116     }
117
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"));
122
123         final ContainerNode container = Builders
124                 .containerBuilder()
125                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
126                 .withChild(
127                         Builders.choiceBuilder()
128                                 .withNodeIdentifier(choice1Id)
129                                 .withChild(
130                                         Builders.containerBuilder()
131                                                 .withNodeIdentifier(
132                                                         new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
133                                                                 "case2-cont")))
134                                                 .withChild(
135                                                         leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
136                                                                 "leaf-value2")).build()).build()).build();
137         try {
138             final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
139             modificationTree.write(TestModel.TEST_PATH, container);
140             modificationTree.ready();
141
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",
149                     e.getMessage());
150             throw e;
151         }
152     }
153
154     @Test
155     public void testDisabledValidation() throws DataValidationFailedException {
156         final DataTree inMemoryDataTree = initDataTree(false);
157         final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
158
159         final ContainerNode container = Builders
160                 .containerBuilder()
161                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
162                 .withChild(
163                         Builders.choiceBuilder()
164                                 .withNodeIdentifier(choice1Id)
165                                 .withChild(
166                                         Builders.containerBuilder()
167                                                 .withNodeIdentifier(
168                                                         new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
169                                                                 "case2-cont")))
170                                                 .withChild(
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();
176
177         inMemoryDataTree.validate(modificationTree);
178         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
179         inMemoryDataTree.commit(prepare);
180     }
181
182     @Test(expected = IllegalArgumentException.class)
183     public void testMandatoryLeafViolationChoiceWrite() throws DataValidationFailedException {
184         final DataTree inMemoryDataTree = initDataTree(true);
185         // Container write
186         final ContainerNode container = Builders.containerBuilder()
187                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
188
189         final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
190         modificationTree1.write(TestModel.TEST_PATH, container);
191         modificationTree1.ready();
192
193         inMemoryDataTree.validate(modificationTree1);
194         final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
195         inMemoryDataTree.commit(prepare1);
196
197         // Choice write
198         final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
199         final ChoiceNode choice = Builders
200                 .choiceBuilder()
201                 .withNodeIdentifier(choice1Id)
202                 .withChild(
203                         Builders.containerBuilder()
204                                 .withNodeIdentifier(
205                                         new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
206                                 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
207                                 .build()).build();
208
209         try {
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",
220                     e.getMessage());
221             throw e;
222         }
223     }
224
225     @Test
226     public void testDisabledValidationChoiceWrite() throws DataValidationFailedException {
227         final DataTree inMemoryDataTree = initDataTree(false);
228         // Container write
229         final ContainerNode container = Builders.containerBuilder()
230                 .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
231
232         final DataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
233         modificationTree1.write(TestModel.TEST_PATH, container);
234         modificationTree1.ready();
235
236         inMemoryDataTree.validate(modificationTree1);
237         final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
238         inMemoryDataTree.commit(prepare1);
239
240         // Choice write
241         final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
242         final ChoiceNode choice = Builders
243                 .choiceBuilder()
244                 .withNodeIdentifier(choice1Id)
245                 .withChild(
246                         Builders.containerBuilder()
247                                 .withNodeIdentifier(
248                                         new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
249                                 .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
250                                 .build()).build();
251
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);
258     }
259 }