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
8 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
10 import static org.junit.Assert.assertFalse;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.junit.Assert.fail;
14 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
15 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
17 import java.util.Optional;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
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.NormalizedNode;
24 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
26 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
27 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
28 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
29 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
30 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
31 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
32 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
36 public class ConcurrentTreeModificationTest extends AbstractTestModelTest {
37 private static final Logger LOG = LoggerFactory.getLogger(ConcurrentTreeModificationTest.class);
39 private static final Short ONE_ID = 1;
40 private static final Short TWO_ID = 2;
42 private static final YangInstanceIdentifier OUTER_LIST_1_PATH = YangInstanceIdentifier.builder(
43 TestModel.OUTER_LIST_PATH)
44 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID)
47 private static final YangInstanceIdentifier OUTER_LIST_2_PATH = YangInstanceIdentifier.builder(
48 TestModel.OUTER_LIST_PATH)
49 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID)
52 private static final MapEntryNode FOO_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID)
53 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).build())
56 private static final MapEntryNode BAR_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID)
57 .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).build())
60 private DataTree inMemoryDataTree;
64 public void prepare() {
65 inMemoryDataTree = new InMemoryDataTreeFactory().create(DataTreeConfiguration.DEFAULT_OPERATIONAL,
69 private static ContainerNode createFooTestContainerNode() {
70 return ImmutableContainerNodeBuilder.create()
71 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
73 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
74 .withChild(FOO_NODE).build()).build();
77 private static ContainerNode createBarTestContainerNode() {
78 return ImmutableContainerNodeBuilder
80 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
82 mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
83 .withChild(BAR_NODE).build()).build();
86 private static <T> T assertPresentAndType(final Optional<?> potential, final Class<T> type) {
87 assertNotNull(potential);
88 assertTrue(potential.isPresent());
89 assertTrue(type.isInstance(potential.get()));
90 return type.cast(potential.get());
94 public void writeWrite1stLevelEmptyTreeTest() throws DataValidationFailedException {
95 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
97 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
98 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
100 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
101 modificationTree2.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
103 modificationTree1.ready();
104 modificationTree2.ready();
105 inMemoryDataTree.validate(modificationTree1);
106 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
107 inMemoryDataTree.commit(prepare1);
110 inMemoryDataTree.validate(modificationTree2);
111 fail("Exception should have been thrown.");
112 } catch (final ConflictingModificationAppliedException ex) {
113 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
115 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
116 inMemoryDataTree.commit(prepare2);
118 final Optional<NormalizedNode> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
119 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
123 public void writeMerge1stLevelEmptyTreeTest() throws DataValidationFailedException {
124 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
126 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
127 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
129 modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
130 modificationTree2.merge(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
132 modificationTree1.ready();
133 modificationTree2.ready();
135 inMemoryDataTree.validate(modificationTree1);
136 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
137 inMemoryDataTree.commit(prepare1);
139 inMemoryDataTree.validate(modificationTree2);
140 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
141 inMemoryDataTree.commit(prepare2);
143 final Optional<NormalizedNode> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
144 assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
148 public void writeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
149 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
151 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
152 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
154 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
155 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
156 modificationTree1.ready();
157 modificationTree2.ready();
159 inMemoryDataTree.validate(modificationTree1);
160 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
161 inMemoryDataTree.commit(prepare1);
164 inMemoryDataTree.validate(modificationTree2);
165 fail("Exception should have been thrown.");
166 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
167 inMemoryDataTree.commit(prepare2);
168 } catch (final ConflictingModificationAppliedException ex) {
169 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
172 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
173 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
174 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
178 public void writeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
179 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
181 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
182 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
184 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
185 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
186 modificationTree1.ready();
187 modificationTree2.ready();
189 inMemoryDataTree.validate(modificationTree1);
190 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
191 inMemoryDataTree.commit(prepare1);
193 inMemoryDataTree.validate(modificationTree2);
194 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
195 inMemoryDataTree.commit(prepare2);
197 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
198 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
199 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
203 public void mergeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
204 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
206 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
207 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
209 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
210 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
211 modificationTree1.ready();
212 modificationTree2.ready();
214 inMemoryDataTree.validate(modificationTree1);
215 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
216 inMemoryDataTree.commit(prepare1);
219 inMemoryDataTree.validate(modificationTree2);
220 fail("Exception should have been thrown.");
221 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
222 inMemoryDataTree.commit(prepare2);
223 } catch (final ConflictingModificationAppliedException ex) {
224 LOG.debug("ConflictingModificationAppliedException - was thrown as expected", ex);
227 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
228 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
229 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
233 public void mergeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
234 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
236 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
237 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
239 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
240 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
241 modificationTree1.ready();
242 modificationTree2.ready();
244 inMemoryDataTree.validate(modificationTree1);
245 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
246 inMemoryDataTree.commit(prepare1);
248 inMemoryDataTree.validate(modificationTree2);
249 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
250 inMemoryDataTree.commit(prepare2);
252 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
253 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
254 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
258 public void writeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
259 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
260 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
261 initialDataTreeModification.ready();
262 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
263 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
265 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
266 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
268 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
269 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
270 modificationTree1.ready();
271 modificationTree2.ready();
273 inMemoryDataTree.validate(modificationTree1);
274 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
275 inMemoryDataTree.commit(prepare1);
278 inMemoryDataTree.validate(modificationTree2);
279 fail("Exception should have been thrown.");
280 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
281 inMemoryDataTree.commit(prepare2);
282 } catch (final ConflictingModificationAppliedException ex) {
283 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
286 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
287 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
288 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
292 public void writeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
293 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
294 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
295 initialDataTreeModification.ready();
296 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
297 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
299 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
300 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
302 modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
303 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
304 modificationTree1.ready();
305 modificationTree2.ready();
307 inMemoryDataTree.validate(modificationTree1);
308 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
309 inMemoryDataTree.commit(prepare1);
311 inMemoryDataTree.validate(modificationTree2);
312 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
313 inMemoryDataTree.commit(prepare2);
315 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
316 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
317 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
321 public void mergeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
322 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
323 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
324 initialDataTreeModification.ready();
325 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
326 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
328 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
329 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
331 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
332 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
333 modificationTree1.ready();
334 modificationTree2.ready();
336 inMemoryDataTree.validate(modificationTree1);
337 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
338 inMemoryDataTree.commit(prepare1);
341 inMemoryDataTree.validate(modificationTree2);
342 fail("Exception should have been thrown.");
343 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
344 inMemoryDataTree.commit(prepare2);
345 } catch (final ConflictingModificationAppliedException ex) {
346 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
350 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
351 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
352 assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
356 public void mergeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
357 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
358 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
359 initialDataTreeModification.ready();
360 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
361 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
363 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
364 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
366 modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
367 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
368 modificationTree1.ready();
369 modificationTree2.ready();
371 inMemoryDataTree.validate(modificationTree1);
372 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
373 inMemoryDataTree.commit(prepare1);
375 inMemoryDataTree.validate(modificationTree2);
376 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
377 inMemoryDataTree.commit(prepare2);
379 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
380 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
381 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
385 public void deleteWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
386 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
387 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
388 initialDataTreeModification.ready();
389 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
390 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
392 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
393 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
395 modificationTree1.delete(TestModel.TEST_PATH);
396 modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
397 modificationTree1.ready();
398 modificationTree2.ready();
400 inMemoryDataTree.validate(modificationTree1);
401 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
402 inMemoryDataTree.commit(prepare1);
405 inMemoryDataTree.validate(modificationTree2);
406 fail("Exception should have been thrown.");
407 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
408 inMemoryDataTree.commit(prepare2);
409 } catch (final ConflictingModificationAppliedException ex) {
410 LOG.debug("ConflictingModificationAppliedException was thrown as expected", ex);
414 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
415 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
419 public void deleteMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
420 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
421 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
422 initialDataTreeModification.ready();
423 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
424 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
426 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
427 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
429 modificationTree1.delete(TestModel.TEST_PATH);
430 modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
431 modificationTree1.ready();
432 modificationTree2.ready();
434 inMemoryDataTree.validate(modificationTree1);
435 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
436 inMemoryDataTree.commit(prepare1);
438 inMemoryDataTree.validate(modificationTree2);
439 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
440 inMemoryDataTree.commit(prepare2);
442 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
443 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
447 public void writeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
448 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
449 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
450 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
452 initialDataTreeModification.ready();
453 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
454 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
456 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
457 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
459 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
460 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
461 modificationTree1.ready();
462 modificationTree2.ready();
464 inMemoryDataTree.validate(modificationTree1);
465 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
466 inMemoryDataTree.commit(prepare1);
468 inMemoryDataTree.validate(modificationTree2);
469 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
470 inMemoryDataTree.commit(prepare2);
472 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
473 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
474 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
478 public void writeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
479 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
480 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
481 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
483 initialDataTreeModification.ready();
484 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
485 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
487 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
488 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
490 modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
491 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
492 modificationTree1.ready();
493 modificationTree2.ready();
495 inMemoryDataTree.validate(modificationTree1);
496 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
497 inMemoryDataTree.commit(prepare1);
499 inMemoryDataTree.validate(modificationTree2);
500 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
501 inMemoryDataTree.commit(prepare2);
503 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
504 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
505 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
509 public void mergeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
510 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
511 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
512 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
514 initialDataTreeModification.ready();
515 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
516 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
518 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
519 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
521 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
522 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
523 modificationTree1.ready();
524 modificationTree2.ready();
526 inMemoryDataTree.validate(modificationTree1);
527 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
528 inMemoryDataTree.commit(prepare1);
530 inMemoryDataTree.validate(modificationTree2);
531 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
532 inMemoryDataTree.commit(prepare2);
534 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
535 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
536 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
540 public void mergeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
541 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
542 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
543 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
545 initialDataTreeModification.ready();
546 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
547 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
549 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
550 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
552 modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
553 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
554 modificationTree1.ready();
555 modificationTree2.ready();
557 inMemoryDataTree.validate(modificationTree1);
558 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
559 inMemoryDataTree.commit(prepare1);
561 inMemoryDataTree.validate(modificationTree2);
562 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
563 inMemoryDataTree.commit(prepare2);
565 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
566 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
567 assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
571 public void deleteWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
572 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
573 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
574 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
576 initialDataTreeModification.ready();
577 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
578 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
580 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
581 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
583 modificationTree1.delete(TestModel.TEST_PATH);
584 modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
585 modificationTree1.ready();
586 modificationTree2.ready();
588 inMemoryDataTree.validate(modificationTree1);
589 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
590 inMemoryDataTree.commit(prepare1);
593 inMemoryDataTree.validate(modificationTree2);
594 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
595 inMemoryDataTree.commit(prepare2);
596 fail("Exception should have been thrown");
597 } catch (final ConflictingModificationAppliedException e) {
598 LOG.debug("Exception was thrown because path no longer exist in tree", e);
601 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
602 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
606 public void deleteMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
607 final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
608 initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
609 initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
611 initialDataTreeModification.ready();
612 inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
613 final DataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
615 final DataTreeModification modificationTree1 = initialDataTreeSnapshot.newModification();
616 final DataTreeModification modificationTree2 = initialDataTreeSnapshot.newModification();
618 modificationTree1.delete(TestModel.TEST_PATH);
619 modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
620 modificationTree1.ready();
621 modificationTree2.ready();
623 inMemoryDataTree.validate(modificationTree1);
624 final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
625 inMemoryDataTree.commit(prepare1);
628 inMemoryDataTree.validate(modificationTree2);
629 final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
630 inMemoryDataTree.commit(prepare2);
631 fail("Exception should have been thrown");
632 } catch (final ConflictingModificationAppliedException e) {
633 LOG.debug("Exception was thrown because path no longer exist in tree", e);
636 final DataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
637 assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());