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