1 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
3 import static org.junit.Assert.assertFalse;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertTrue;
6 import static org.junit.Assert.fail;
7 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
8 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
10 import com.google.common.base.Optional;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
15 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
18 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
19 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
20 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
21 import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
22 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
23 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 public class ConcurrentTreeModificationTest {
29 private static final Logger LOG = LoggerFactory.getLogger(ConcurrentTreeModificationTest.class);
31 private static final Short ONE_ID = 1;
32 private static final Short TWO_ID = 2;
34 private static final YangInstanceIdentifier OUTER_LIST_1_PATH = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
35 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID) //
38 private static final YangInstanceIdentifier OUTER_LIST_2_PATH = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
39 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID) //
42 private static final MapEntryNode FOO_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID) //
43 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME) //
47 private static final MapEntryNode BAR_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID) //
48 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME) //
52 private SchemaContext schemaContext;
53 private RootModificationApplyOperation rootOper;
54 private InMemoryDataTree inMemoryDataTree;
57 public void prepare() {
58 schemaContext = TestModel.createTestContext();
59 assertNotNull("Schema context must not be null.", schemaContext);
60 rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext,TreeType.OPERATIONAL));
61 inMemoryDataTree = (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create();
62 inMemoryDataTree.setSchemaContext(schemaContext);
65 private static ContainerNode createFooTestContainerNode() {
66 return ImmutableContainerNodeBuilder
68 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
70 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
71 .withChild(FOO_NODE).build()).build();
74 private static ContainerNode createBarTestContainerNode() {
75 return ImmutableContainerNodeBuilder
77 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
79 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
80 .withChild(BAR_NODE).build()).build();
83 private static <T> T assertPresentAndType(final Optional<?> potential, final Class<T> type) {
84 assertNotNull(potential);
85 assertTrue(potential.isPresent());
86 assertTrue(type.isInstance(potential.get()));
87 return type.cast(potential.get());
91 public void writeWrite1stLevelEmptyTreeTest() throws DataValidationFailedException {
92 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
94 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
96 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
99 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
100 modificationTree2.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
102 inMemoryDataTree.validate(modificationTree1);
103 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
104 inMemoryDataTree.commit(prepare1);
107 inMemoryDataTree.validate(modificationTree2);
108 fail("Exception should have been thrown.");
109 } catch (final ConflictingModificationAppliedException ex) {
110 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
112 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
113 inMemoryDataTree.commit(prepare2);
115 final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
116 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
120 public void writeMerge1stLevelEmptyTreeTest() throws DataValidationFailedException {
121 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
123 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
125 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
128 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
129 modificationTree2.merge(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
131 inMemoryDataTree.validate(modificationTree1);
132 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
133 inMemoryDataTree.commit(prepare1);
135 inMemoryDataTree.validate(modificationTree2);
136 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
137 inMemoryDataTree.commit(prepare2);
139 final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
140 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
144 public void writeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
145 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
147 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
149 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
152 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
153 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
155 inMemoryDataTree.validate(modificationTree1);
156 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
157 inMemoryDataTree.commit(prepare1);
160 inMemoryDataTree.validate(modificationTree2);
161 fail("Exception should have been thrown.");
162 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
163 inMemoryDataTree.commit(prepare2);
164 } catch (final ConflictingModificationAppliedException ex) {
165 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
168 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
169 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
170 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
174 public void writeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
175 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
177 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
179 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
182 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
183 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
185 inMemoryDataTree.validate(modificationTree1);
186 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
187 inMemoryDataTree.commit(prepare1);
189 inMemoryDataTree.validate(modificationTree2);
190 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
191 inMemoryDataTree.commit(prepare2);
193 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
194 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
195 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
199 public void mergeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
200 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
202 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
204 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
207 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
208 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
210 inMemoryDataTree.validate(modificationTree1);
211 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
212 inMemoryDataTree.commit(prepare1);
215 inMemoryDataTree.validate(modificationTree2);
216 fail("Exception should have been thrown.");
217 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
218 inMemoryDataTree.commit(prepare2);
219 } catch (final ConflictingModificationAppliedException ex) {
220 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
223 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
224 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
225 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
229 public void mergeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
230 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
232 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
234 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
237 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
238 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
240 inMemoryDataTree.validate(modificationTree1);
241 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
242 inMemoryDataTree.commit(prepare1);
244 inMemoryDataTree.validate(modificationTree2);
245 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
246 inMemoryDataTree.commit(prepare2);
248 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
249 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
250 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
254 public void writeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
255 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
256 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
257 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
258 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
260 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
262 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
265 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
266 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
268 inMemoryDataTree.validate(modificationTree1);
269 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
270 inMemoryDataTree.commit(prepare1);
273 inMemoryDataTree.validate(modificationTree2);
274 fail("Exception should have been thrown.");
275 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
276 inMemoryDataTree.commit(prepare2);
277 } catch (final ConflictingModificationAppliedException ex) {
278 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
281 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
282 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
283 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
287 public void writeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
288 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
289 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
290 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
291 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
293 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
295 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
298 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
299 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
301 inMemoryDataTree.validate(modificationTree1);
302 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
303 inMemoryDataTree.commit(prepare1);
305 inMemoryDataTree.validate(modificationTree2);
306 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
307 inMemoryDataTree.commit(prepare2);
309 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
310 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
311 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
316 public void mergeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
317 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
318 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
319 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
320 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
322 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
324 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
327 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
328 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
330 inMemoryDataTree.validate(modificationTree1);
331 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
332 inMemoryDataTree.commit(prepare1);
335 inMemoryDataTree.validate(modificationTree2);
336 fail("Exception should have been thrown.");
337 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
338 inMemoryDataTree.commit(prepare2);
339 } catch (final ConflictingModificationAppliedException ex) {
340 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
344 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
345 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
346 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
350 public void mergeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
351 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
352 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
353 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
354 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
356 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
358 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
361 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
362 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
364 inMemoryDataTree.validate(modificationTree1);
365 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
366 inMemoryDataTree.commit(prepare1);
368 inMemoryDataTree.validate(modificationTree2);
369 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
370 inMemoryDataTree.commit(prepare2);
372 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
373 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
374 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
378 public void deleteWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
379 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
380 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
381 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
382 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
384 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
386 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
389 modificationTree1.delete(TestModel.TEST_PATH);
390 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
392 inMemoryDataTree.validate(modificationTree1);
393 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
394 inMemoryDataTree.commit(prepare1);
397 inMemoryDataTree.validate(modificationTree2);
398 fail("Exception should have been thrown.");
399 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
400 inMemoryDataTree.commit(prepare2);
401 } catch (final ConflictingModificationAppliedException ex) {
402 LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
406 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
407 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
411 public void deleteMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
412 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
413 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
414 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
415 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
417 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
419 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
422 modificationTree1.delete(TestModel.TEST_PATH);
423 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
425 inMemoryDataTree.validate(modificationTree1);
426 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
427 inMemoryDataTree.commit(prepare1);
429 inMemoryDataTree.validate(modificationTree2);
430 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
431 inMemoryDataTree.commit(prepare2);
433 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
434 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
438 public void writeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
439 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
440 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
441 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
442 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
443 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
445 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
447 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
450 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
451 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
453 inMemoryDataTree.validate(modificationTree1);
454 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
455 inMemoryDataTree.commit(prepare1);
457 inMemoryDataTree.validate(modificationTree2);
458 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
459 inMemoryDataTree.commit(prepare2);
461 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
462 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
463 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
467 public void writeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
468 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
469 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
470 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
471 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
472 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
474 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
476 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
479 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
480 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
482 inMemoryDataTree.validate(modificationTree1);
483 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
484 inMemoryDataTree.commit(prepare1);
486 inMemoryDataTree.validate(modificationTree2);
487 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
488 inMemoryDataTree.commit(prepare2);
490 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
491 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
492 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
496 public void mergeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
497 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
498 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
499 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
500 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
501 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
503 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
505 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
508 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
509 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
511 inMemoryDataTree.validate(modificationTree1);
512 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
513 inMemoryDataTree.commit(prepare1);
515 inMemoryDataTree.validate(modificationTree2);
516 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
517 inMemoryDataTree.commit(prepare2);
519 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
520 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
521 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
525 public void mergeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
526 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
527 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
528 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
529 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
530 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
532 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
534 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
537 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
538 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
540 inMemoryDataTree.validate(modificationTree1);
541 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
542 inMemoryDataTree.commit(prepare1);
544 inMemoryDataTree.validate(modificationTree2);
545 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
546 inMemoryDataTree.commit(prepare2);
548 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
549 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
550 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
554 public void deleteWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
555 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
556 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
557 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
558 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
559 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
561 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
563 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
566 modificationTree1.delete(TestModel.TEST_PATH);
567 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
569 inMemoryDataTree.validate(modificationTree1);
570 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
571 inMemoryDataTree.commit(prepare1);
574 inMemoryDataTree.validate(modificationTree2);
575 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
576 inMemoryDataTree.commit(prepare2);
577 fail("Exception should have been thrown");
578 } catch (final Exception e) {
579 LOG.debug("Exception was thrown because path no longer exist in tree");
582 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
583 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
587 public void deleteMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
588 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
589 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
590 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
591 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
592 final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
594 final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
596 final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
599 modificationTree1.delete(TestModel.TEST_PATH);
600 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
602 inMemoryDataTree.validate(modificationTree1);
603 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
604 inMemoryDataTree.commit(prepare1);
607 inMemoryDataTree.validate(modificationTree2);
608 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
609 inMemoryDataTree.commit(prepare2);
610 fail("Exception should have been thrown");
611 } catch (final Exception e) {
612 LOG.debug("Exception was thrown because path no longer exist in tree");
615 final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
616 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());