Split out yang-data-tree-impl
[yangtools.git] / data / yang-data-tree-ri / src / test / java / org / opendaylight / yangtools / yang / data / tree / impl / Bug5968Test.java
1 /*
2  * Copyright (c) 2016 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.tree.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.fail;
12
13 import com.google.common.collect.ImmutableMap;
14 import org.junit.AfterClass;
15 import org.junit.BeforeClass;
16 import org.junit.Test;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
21 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
25 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
26 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
27 import org.opendaylight.yangtools.yang.data.tree.api.DataTree;
28 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
29 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
30 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification;
31 import org.opendaylight.yangtools.yang.data.tree.api.DataValidationFailedException;
32 import org.opendaylight.yangtools.yang.data.tree.impl.di.InMemoryDataTreeFactory;
33 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
34
35 public class Bug5968Test {
36     private static final String NS = "bug5968";
37     private static final String REV = "2016-07-28";
38     private static final QName ROOT = QName.create(NS, REV, "root");
39     private static final QName MY_LIST = QName.create(NS, REV, "my-list");
40     private static final QName LIST_ID = QName.create(NS, REV, "list-id");
41     private static final QName MANDATORY_LEAF = QName.create(NS, REV, "mandatory-leaf");
42     private static final QName COMMON_LEAF = QName.create(NS, REV, "common-leaf");
43
44     private static EffectiveModelContext SCHEMA_CONTEXT;
45
46     @BeforeClass
47     public static void beforeClass() {
48         SCHEMA_CONTEXT = TestModel.createTestContext("/bug5968.yang");
49     }
50
51     @AfterClass
52     public static void afterClass() {
53         SCHEMA_CONTEXT = null;
54     }
55
56     private static DataTree initDataTree(final EffectiveModelContext schemaContext, final boolean withMapNode)
57             throws DataValidationFailedException {
58         final DataTree inMemoryDataTree = new InMemoryDataTreeFactory().create(
59                 DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
60
61         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> root = Builders.containerBuilder()
62                 .withNodeIdentifier(new NodeIdentifier(ROOT));
63         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
64         modificationTree.write(
65                 YangInstanceIdentifier.of(ROOT),
66                 withMapNode ? root.withChild(
67                         Builders.mapBuilder().withNodeIdentifier(new NodeIdentifier(MY_LIST)).build()).build() : root
68                         .build());
69         modificationTree.ready();
70
71         inMemoryDataTree.validate(modificationTree);
72         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
73         inMemoryDataTree.commit(prepare);
74
75         return inMemoryDataTree;
76     }
77
78     private static DataTree emptyDataTree(final EffectiveModelContext schemaContext)
79             throws DataValidationFailedException {
80         return new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_CONFIGURATION, schemaContext);
81     }
82
83     @Test
84     public void writeInvalidContainerTest() throws DataValidationFailedException {
85         final DataTree inMemoryDataTree = emptyDataTree(SCHEMA_CONTEXT);
86
87         final SystemMapNode myList = createMap(true);
88         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> root = Builders.containerBuilder()
89                 .withNodeIdentifier(new NodeIdentifier(ROOT)).withChild(myList);
90
91         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
92         modificationTree.write(YangInstanceIdentifier.of(ROOT), root.build());
93
94         try {
95             modificationTree.ready();
96             inMemoryDataTree.validate(modificationTree);
97             final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
98             inMemoryDataTree.commit(prepare);
99             fail("Should fail due to missing mandatory leaf.");
100         } catch (final IllegalArgumentException e) {
101             assertEquals("Node (bug5968?revision=2016-07-28)my-list[{(bug5968?revision=2016-07-28)list-id=1}] is "
102                 + "missing mandatory descendant /(bug5968?revision=2016-07-28)mandatory-leaf", e.getMessage());
103         }
104     }
105
106     @Test
107     public void writeInvalidMapTest() throws DataValidationFailedException {
108         final DataTree inMemoryDataTree = emptyDataTree(SCHEMA_CONTEXT);
109         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
110         writeMap(modificationTree, true);
111
112         try {
113             modificationTree.ready();
114             inMemoryDataTree.validate(modificationTree);
115             final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
116             inMemoryDataTree.commit(prepare);
117             fail("Should fail due to missing mandatory leaf.");
118         } catch (final IllegalArgumentException e) {
119             assertEquals("Node (bug5968?revision=2016-07-28)my-list[{(bug5968?revision=2016-07-28)list-id=1}] is "
120                 + "missing mandatory descendant /(bug5968?revision=2016-07-28)mandatory-leaf", e.getMessage());
121         }
122     }
123
124     @Test
125     public void writeInvalidMapEntryTest() throws DataValidationFailedException {
126         final DataTree inMemoryDataTree = initDataTree(SCHEMA_CONTEXT, true);
127         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
128
129         writeMapEntry(modificationTree, "1", null, "common-value");
130
131         try {
132             modificationTree.ready();
133             inMemoryDataTree.validate(modificationTree);
134             final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
135             inMemoryDataTree.commit(prepare);
136             fail("Should fail due to missing mandatory leaf.");
137         } catch (final IllegalArgumentException e) {
138             assertEquals("Node (bug5968?revision=2016-07-28)my-list[{(bug5968?revision=2016-07-28)list-id=1}] is "
139                 + "missing mandatory descendant /(bug5968?revision=2016-07-28)mandatory-leaf", e.getMessage());
140         }
141     }
142
143     private static void writeMap(final DataTreeModification modificationTree, final boolean mandatoryDataMissing) {
144         modificationTree.write(YangInstanceIdentifier.of(ROOT).node(MY_LIST), createMap(mandatoryDataMissing));
145     }
146
147     private static SystemMapNode createMap(final boolean mandatoryDataMissing) {
148         return Builders.mapBuilder()
149             .withNodeIdentifier(new NodeIdentifier(MY_LIST))
150             .withChild(mandatoryDataMissing ? createMapEntry("1", "common-value")
151                 : createMapEntry("1", "mandatory-value", "common-value"))
152             .build();
153     }
154
155     private static void writeMapEntry(final DataTreeModification modificationTree, final Object listIdValue,
156             final Object mandatoryLeafValue, final Object commonLeafValue) throws DataValidationFailedException {
157         final MapEntryNode taskEntryNode = mandatoryLeafValue == null ? createMapEntry(listIdValue, commonLeafValue)
158                 : createMapEntry(listIdValue, mandatoryLeafValue, commonLeafValue);
159
160         modificationTree.write(
161                 YangInstanceIdentifier.of(ROOT).node(MY_LIST)
162                         .node(NodeIdentifierWithPredicates.of(MY_LIST, ImmutableMap.of(LIST_ID, listIdValue))),
163                 taskEntryNode);
164     }
165
166     private static MapEntryNode createMapEntry(final Object listIdValue, final Object mandatoryLeafValue,
167             final Object commonLeafValue) {
168         return Builders.mapEntryBuilder()
169                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(MY_LIST, ImmutableMap.of(LIST_ID, listIdValue)))
170                 .withChild(ImmutableNodes.leafNode(LIST_ID, listIdValue))
171                 .withChild(ImmutableNodes.leafNode(MANDATORY_LEAF, mandatoryLeafValue))
172                 .withChild(ImmutableNodes.leafNode(COMMON_LEAF, commonLeafValue)).build();
173     }
174
175     private static MapEntryNode createMapEntry(final Object listIdValue, final Object commonLeafValue) {
176         return Builders.mapEntryBuilder()
177                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(MY_LIST, ImmutableMap.of(LIST_ID, listIdValue)))
178                 .withChild(ImmutableNodes.leafNode(LIST_ID, listIdValue))
179                 .withChild(ImmutableNodes.leafNode(COMMON_LEAF, commonLeafValue)).build();
180     }
181
182     @Test
183     public void writeValidContainerTest() throws DataValidationFailedException {
184         final DataTree inMemoryDataTree = emptyDataTree(SCHEMA_CONTEXT);
185
186         final SystemMapNode myList = createMap(false);
187         final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> root = Builders.containerBuilder()
188                 .withNodeIdentifier(new NodeIdentifier(ROOT)).withChild(myList);
189
190         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
191         modificationTree.write(YangInstanceIdentifier.of(ROOT), root.build());
192         modificationTree.ready();
193         inMemoryDataTree.validate(modificationTree);
194         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
195         inMemoryDataTree.commit(prepare);
196     }
197
198     @Test
199     public void writeValidMapTest() throws DataValidationFailedException {
200         final DataTree inMemoryDataTree = emptyDataTree(SCHEMA_CONTEXT);
201         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
202         writeMap(modificationTree, false);
203
204         modificationTree.ready();
205         inMemoryDataTree.validate(modificationTree);
206         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
207         inMemoryDataTree.commit(prepare);
208     }
209
210     @Test
211     public void writeValidMapEntryTest() throws DataValidationFailedException {
212         final DataTree inMemoryDataTree = initDataTree(SCHEMA_CONTEXT, true);
213         final DataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
214
215         writeMapEntry(modificationTree, "1", "mandatory-value", "common-value");
216
217         modificationTree.ready();
218         inMemoryDataTree.validate(modificationTree);
219         final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
220         inMemoryDataTree.commit(prepare);
221     }
222 }