bfa2fc4d4bc26c42195635e53b695cdf8d19d94f
[mdsal.git] / dom / mdsal-dom-inmemory-datastore / src / test / java / org / opendaylight / mdsal / dom / store / inmemory / InMemoryShardDataModificationCursorTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.dom.store.inmemory;
9
10 import static org.mockito.Mockito.doNothing;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.times;
14 import static org.mockito.Mockito.verify;
15 import static org.opendaylight.mdsal.dom.store.inmemory.TestUtils.NORMALIZED_NODE;
16 import static org.opendaylight.mdsal.dom.store.inmemory.TestUtils.PATH_ARGUMENT;
17 import static org.opendaylight.mdsal.dom.store.inmemory.TestUtils.WRITEABLE_MODIFICATION_NODE;
18 import static org.opendaylight.mdsal.dom.store.inmemory.TestUtils.WRITE_CURSOR_STRATEGY;
19 import static org.opendaylight.mdsal.dom.store.inmemory.TestUtils.resetMocks;
20
21 import com.google.common.collect.ImmutableList;
22 import com.google.common.collect.ImmutableMap;
23 import java.lang.reflect.Field;
24 import java.util.Deque;
25 import java.util.HashMap;
26 import java.util.Map;
27 import org.junit.After;
28 import org.junit.Test;
29 import org.opendaylight.mdsal.dom.spi.shard.AbstractDataModificationCursor;
30 import org.opendaylight.mdsal.dom.spi.shard.WriteCursorStrategy;
31 import org.opendaylight.mdsal.dom.spi.shard.WriteableModificationNode;
32 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
33 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModificationCursor;
34
35 public class InMemoryShardDataModificationCursorTest {
36
37     @Test
38     public void basicTest() throws Exception {
39         final DataTreeModificationCursor dataTreeModificationCursor = mock(DataTreeModificationCursor.class);
40         final DataTreeModificationCursorAdaptor dataTreeModificationCursorAdaptor =
41                 DataTreeModificationCursorAdaptor.of(dataTreeModificationCursor);
42         final ShardRootModificationContext shardRootModificationContext = mock(ShardRootModificationContext.class);
43         final Map<PathArgument, WriteableModificationNode> children = new HashMap<>();
44         children.put(PATH_ARGUMENT, WRITEABLE_MODIFICATION_NODE);
45         final ShardDataModification root = new ShardDataModification(shardRootModificationContext, children,
46                 ImmutableMap.of());
47
48         doReturn(dataTreeModificationCursorAdaptor).when(shardRootModificationContext).cursor();
49         InmemoryDOMDataTreeShardWriteTransaction inmemoryDOMDataTreeShardWriteTransaction =
50                 mock(InmemoryDOMDataTreeShardWriteTransaction.class);
51         InMemoryShardDataModificationCursor shardDataModificationCursor =
52                 new InMemoryShardDataModificationCursor(root, inmemoryDOMDataTreeShardWriteTransaction);
53
54         final Field stackField = AbstractDataModificationCursor.class.getDeclaredField("stack");
55         stackField.setAccessible(true);
56
57         final Deque<WriteCursorStrategy> stack =
58                 (Deque<WriteCursorStrategy>) stackField.get(shardDataModificationCursor);
59         stack.clear();
60         stack.push(WRITE_CURSOR_STRATEGY);
61         stackField.set(shardDataModificationCursor, stack);
62
63         doNothing().when(WRITE_CURSOR_STRATEGY).delete(PATH_ARGUMENT);
64         doNothing().when(WRITE_CURSOR_STRATEGY).merge(PATH_ARGUMENT, NORMALIZED_NODE);
65         doNothing().when(WRITE_CURSOR_STRATEGY).write(PATH_ARGUMENT, NORMALIZED_NODE);
66         doReturn("testPathArgument").when(PATH_ARGUMENT).toString();
67
68         shardDataModificationCursor.delete(PATH_ARGUMENT);
69         verify(WRITE_CURSOR_STRATEGY).delete(PATH_ARGUMENT);
70         shardDataModificationCursor.merge(PATH_ARGUMENT, NORMALIZED_NODE);
71         verify(WRITE_CURSOR_STRATEGY).merge(PATH_ARGUMENT, NORMALIZED_NODE);
72         shardDataModificationCursor.write(PATH_ARGUMENT, NORMALIZED_NODE);
73         verify(WRITE_CURSOR_STRATEGY).write(PATH_ARGUMENT, NORMALIZED_NODE);
74
75         doReturn(WRITE_CURSOR_STRATEGY).when(WRITE_CURSOR_STRATEGY).enter(PATH_ARGUMENT);
76         shardDataModificationCursor.enter(ImmutableList.of(PATH_ARGUMENT));
77         shardDataModificationCursor.enter(PATH_ARGUMENT, PATH_ARGUMENT);
78         verify(WRITE_CURSOR_STRATEGY, times(3)).enter(PATH_ARGUMENT);
79
80         doNothing().when(inmemoryDOMDataTreeShardWriteTransaction).cursorClosed();
81         shardDataModificationCursor.close();
82         verify(inmemoryDOMDataTreeShardWriteTransaction).cursorClosed();
83
84         doNothing().when(WRITE_CURSOR_STRATEGY).exit();
85         shardDataModificationCursor.exit(1);
86         verify(WRITE_CURSOR_STRATEGY).exit();
87     }
88
89     @After
90     public void reset() {
91         resetMocks();
92     }
93 }