2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.junit.Assert.fail;
15 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
16 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
18 import java.util.Optional;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
23 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
26 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
27 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
28 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
29 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
30 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
31 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
32 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
33 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
34 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 public class ConcurrentTreeModificationTest {
39 private static final Logger LOG = LoggerFactory.getLogger(ConcurrentTreeModificationTest.class);
41 private static final Short ONE_ID = 1;
42 private static final Short TWO_ID = 2;
44 private static final YangInstanceIdentifier OUTER_LIST_1_PATH = YangInstanceIdentifier.builder(
45 TestModel.OUTER_LIST_PATH)
46 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID)
49 private static final YangInstanceIdentifier OUTER_LIST_2_PATH = YangInstanceIdentifier.builder(
50 TestModel.OUTER_LIST_PATH)
51 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID)
54 private static final MapEntryNode FOO_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID)
55 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).build())
58 private static final MapEntryNode BAR_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID)
59 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).build())
62 private SchemaContext schemaContext;
63 private DataTree inMemoryDataTree;
66 public void prepare() {
67 schemaContext = TestModel.createTestContext();
68 assertNotNull("Schema context must not be null.", schemaContext);
69 inMemoryDataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_OPERATIONAL,
73 private static ContainerNode createFooTestContainerNode() {
74 return ImmutableContainerNodeBuilder.create()
75 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
77 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
78 .withChild(FOO_NODE).build()).build();
81 private static ContainerNode createBarTestContainerNode() {
82 return ImmutableContainerNodeBuilder
84 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
86 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
87 .withChild(BAR_NODE).build()).build();
90 private static <T> T assertPresentAndType(final Optional<?> potential, final Class<T> type) {
91 assertNotNull(potential);
92 assertTrue(potential.isPresent());
93 assertTrue(type.isInstance(potential.get()));
94 return type.cast(potential.get());
98 public void writeWrite1stLevelEmptyTreeTest() throws DataValidationFailedException {
99 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
101 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
102 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
104 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
105 modificationTree2.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
107 modificationTree1.ready();
108 modificationTree2.ready();
109 inMemoryDataTree.validate(modificationTree1);
110 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
111 inMemoryDataTree.commit(prepare1);
114 inMemoryDataTree.validate(modificationTree2);
115 fail("Exception should have been thrown.");
116 } catch (final ConflictingModificationAppliedException ex) {
117 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
119 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
120 inMemoryDataTree.commit(prepare2);
122 final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
123 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
127 public void writeMerge1stLevelEmptyTreeTest() throws DataValidationFailedException {
128 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
130 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
131 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
133 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
134 modificationTree2.merge(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
136 modificationTree1.ready();
137 modificationTree2.ready();
139 inMemoryDataTree.validate(modificationTree1);
140 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
141 inMemoryDataTree.commit(prepare1);
143 inMemoryDataTree.validate(modificationTree2);
144 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
145 inMemoryDataTree.commit(prepare2);
147 final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
148 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
152 public void writeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
153 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
155 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
156 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
158 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
159 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
160 modificationTree1.ready();
161 modificationTree2.ready();
163 inMemoryDataTree.validate(modificationTree1);
164 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
165 inMemoryDataTree.commit(prepare1);
168 inMemoryDataTree.validate(modificationTree2);
169 fail("Exception should have been thrown.");
170 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
171 inMemoryDataTree.commit(prepare2);
172 } catch (final ConflictingModificationAppliedException ex) {
173 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
176 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
177 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
178 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
182 public void writeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
183 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
185 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
186 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
188 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
189 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
190 modificationTree1.ready();
191 modificationTree2.ready();
193 inMemoryDataTree.validate(modificationTree1);
194 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
195 inMemoryDataTree.commit(prepare1);
197 inMemoryDataTree.validate(modificationTree2);
198 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
199 inMemoryDataTree.commit(prepare2);
201 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
202 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
203 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
207 public void mergeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
208 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
210 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
211 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
213 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
214 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
215 modificationTree1.ready();
216 modificationTree2.ready();
218 inMemoryDataTree.validate(modificationTree1);
219 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
220 inMemoryDataTree.commit(prepare1);
223 inMemoryDataTree.validate(modificationTree2);
224 fail("Exception should have been thrown.");
225 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
226 inMemoryDataTree.commit(prepare2);
227 } catch (final ConflictingModificationAppliedException ex) {
228 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
231 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
232 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
233 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
237 public void mergeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
238 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
240 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
241 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
243 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
244 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
245 modificationTree1.ready();
246 modificationTree2.ready();
248 inMemoryDataTree.validate(modificationTree1);
249 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
250 inMemoryDataTree.commit(prepare1);
252 inMemoryDataTree.validate(modificationTree2);
253 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
254 inMemoryDataTree.commit(prepare2);
256 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
257 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
258 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
262 public void writeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
263 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
264 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
265 initialDataTreeModification.ready();
266 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
267 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
269 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
270 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
272 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
273 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
274 modificationTree1.ready();
275 modificationTree2.ready();
277 inMemoryDataTree.validate(modificationTree1);
278 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
279 inMemoryDataTree.commit(prepare1);
282 inMemoryDataTree.validate(modificationTree2);
283 fail("Exception should have been thrown.");
284 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
285 inMemoryDataTree.commit(prepare2);
286 } catch (final ConflictingModificationAppliedException ex) {
287 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
290 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
291 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
292 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
296 public void writeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
297 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
298 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
299 initialDataTreeModification.ready();
300 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
301 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
303 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
304 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
306 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
307 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
308 modificationTree1.ready();
309 modificationTree2.ready();
311 inMemoryDataTree.validate(modificationTree1);
312 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
313 inMemoryDataTree.commit(prepare1);
315 inMemoryDataTree.validate(modificationTree2);
316 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
317 inMemoryDataTree.commit(prepare2);
319 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
320 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
321 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
325 public void mergeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
326 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
327 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
328 initialDataTreeModification.ready();
329 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
330 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
332 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
333 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
335 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
336 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
337 modificationTree1.ready();
338 modificationTree2.ready();
340 inMemoryDataTree.validate(modificationTree1);
341 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
342 inMemoryDataTree.commit(prepare1);
345 inMemoryDataTree.validate(modificationTree2);
346 fail("Exception should have been thrown.");
347 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
348 inMemoryDataTree.commit(prepare2);
349 } catch (final ConflictingModificationAppliedException ex) {
350 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
354 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
355 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
356 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
360 public void mergeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
361 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
362 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
363 initialDataTreeModification.ready();
364 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
365 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
367 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
368 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
370 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
371 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
372 modificationTree1.ready();
373 modificationTree2.ready();
375 inMemoryDataTree.validate(modificationTree1);
376 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
377 inMemoryDataTree.commit(prepare1);
379 inMemoryDataTree.validate(modificationTree2);
380 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
381 inMemoryDataTree.commit(prepare2);
383 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
384 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
385 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
389 public void deleteWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
390 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
391 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
392 initialDataTreeModification.ready();
393 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
394 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
396 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
397 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
399 modificationTree1.delete(TestModel.TEST_PATH);
400 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
401 modificationTree1.ready();
402 modificationTree2.ready();
404 inMemoryDataTree.validate(modificationTree1);
405 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
406 inMemoryDataTree.commit(prepare1);
409 inMemoryDataTree.validate(modificationTree2);
410 fail("Exception should have been thrown.");
411 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
412 inMemoryDataTree.commit(prepare2);
413 } catch (final ConflictingModificationAppliedException ex) {
414 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
418 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
419 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
423 public void deleteMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
424 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
425 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
426 initialDataTreeModification.ready();
427 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
428 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
430 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
431 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
433 modificationTree1.delete(TestModel.TEST_PATH);
434 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
435 modificationTree1.ready();
436 modificationTree2.ready();
438 inMemoryDataTree.validate(modificationTree1);
439 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
440 inMemoryDataTree.commit(prepare1);
442 inMemoryDataTree.validate(modificationTree2);
443 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
444 inMemoryDataTree.commit(prepare2);
446 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
447 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
451 public void writeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
452 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
453 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
454 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
456 initialDataTreeModification.ready();
457 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
458 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
460 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
461 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
463 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
464 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
465 modificationTree1.ready();
466 modificationTree2.ready();
468 inMemoryDataTree.validate(modificationTree1);
469 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
470 inMemoryDataTree.commit(prepare1);
472 inMemoryDataTree.validate(modificationTree2);
473 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
474 inMemoryDataTree.commit(prepare2);
476 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
477 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
478 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
482 public void writeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
483 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
484 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
485 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
487 initialDataTreeModification.ready();
488 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
489 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
491 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
492 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
494 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
495 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
496 modificationTree1.ready();
497 modificationTree2.ready();
499 inMemoryDataTree.validate(modificationTree1);
500 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
501 inMemoryDataTree.commit(prepare1);
503 inMemoryDataTree.validate(modificationTree2);
504 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
505 inMemoryDataTree.commit(prepare2);
507 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
508 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
509 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
513 public void mergeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
514 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
515 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
516 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
518 initialDataTreeModification.ready();
519 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
520 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
522 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
523 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
525 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
526 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
527 modificationTree1.ready();
528 modificationTree2.ready();
530 inMemoryDataTree.validate(modificationTree1);
531 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
532 inMemoryDataTree.commit(prepare1);
534 inMemoryDataTree.validate(modificationTree2);
535 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
536 inMemoryDataTree.commit(prepare2);
538 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
539 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
540 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
544 public void mergeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
545 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
546 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
547 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
549 initialDataTreeModification.ready();
550 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
551 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
553 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
554 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
556 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
557 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
558 modificationTree1.ready();
559 modificationTree2.ready();
561 inMemoryDataTree.validate(modificationTree1);
562 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
563 inMemoryDataTree.commit(prepare1);
565 inMemoryDataTree.validate(modificationTree2);
566 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
567 inMemoryDataTree.commit(prepare2);
569 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
570 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
571 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
575 public void deleteWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
576 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
577 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
578 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
580 initialDataTreeModification.ready();
581 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
582 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
584 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
585 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
587 modificationTree1.delete(TestModel.TEST_PATH);
588 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
589 modificationTree1.ready();
590 modificationTree2.ready();
592 inMemoryDataTree.validate(modificationTree1);
593 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
594 inMemoryDataTree.commit(prepare1);
597 inMemoryDataTree.validate(modificationTree2);
598 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
599 inMemoryDataTree.commit(prepare2);
600 fail("Exception should have been thrown");
601 } catch (final ConflictingModificationAppliedException e) {
602 LOG.debug("Exception was thrown because path no longer exist in tree", e);
605 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
606 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
610 public void deleteMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
611 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
612 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
613 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
615 initialDataTreeModification.ready();
616 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
617 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
619 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
620 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
622 modificationTree1.delete(TestModel.TEST_PATH);
623 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
624 modificationTree1.ready();
625 modificationTree2.ready();
627 inMemoryDataTree.validate(modificationTree1);
628 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
629 inMemoryDataTree.commit(prepare1);
632 inMemoryDataTree.validate(modificationTree2);
633 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
634 inMemoryDataTree.commit(prepare2);
635 fail("Exception should have been thrown");
636 } catch (final ConflictingModificationAppliedException e) {
637 LOG.debug("Exception was thrown because path no longer exist in tree", e);
640 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
641 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());