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