1 package org.opendaylight.controller.cluster.datastore;
3 import static org.junit.Assert.assertTrue;
4 import static org.mockito.Mockito.doReturn;
5 import static org.mockito.Mockito.doThrow;
6 import static org.mockito.Mockito.mock;
7 import static org.mockito.Mockito.verify;
8 import akka.actor.ActorSelection;
9 import com.google.common.base.Optional;
10 import com.google.common.util.concurrent.Futures;
11 import com.google.common.util.concurrent.SettableFuture;
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.mockito.Mock;
15 import org.mockito.MockitoAnnotations;
16 import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier;
17 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
18 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
19 import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
22 import scala.concurrent.Future;
24 public class LocalTransactionContextTest {
27 OperationLimiter limiter;
30 TransactionIdentifier identifier;
33 DOMStoreReadWriteTransaction readWriteTransaction;
36 LocalTransactionReadySupport mockReadySupport;
38 LocalTransactionContext localTransactionContext;
42 MockitoAnnotations.initMocks(this);
43 localTransactionContext = new LocalTransactionContext(readWriteTransaction, limiter.getIdentifier(), mockReadySupport) {
45 protected DOMStoreWriteTransaction getWriteDelegate() {
46 return readWriteTransaction;
50 protected DOMStoreReadTransaction getReadDelegate() {
51 return readWriteTransaction;
57 public void testWrite() {
58 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
59 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
60 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
61 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
65 public void testMerge() {
66 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
67 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
68 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
69 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
73 public void testDelete() {
74 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
75 localTransactionContext.deleteData(yangInstanceIdentifier);
76 verify(readWriteTransaction).delete(yangInstanceIdentifier);
81 public void testRead() {
82 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
83 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
84 doReturn(Futures.immediateCheckedFuture(Optional.of(normalizedNode))).when(readWriteTransaction).read(yangInstanceIdentifier);
85 localTransactionContext.readData(yangInstanceIdentifier, SettableFuture.<Optional<NormalizedNode<?,?>>>create());
86 verify(readWriteTransaction).read(yangInstanceIdentifier);
90 public void testExists() {
91 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
92 doReturn(Futures.immediateCheckedFuture(true)).when(readWriteTransaction).exists(yangInstanceIdentifier);
93 localTransactionContext.dataExists(yangInstanceIdentifier, SettableFuture.<Boolean> create());
94 verify(readWriteTransaction).exists(yangInstanceIdentifier);
98 public void testReady() {
99 final LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
100 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit();
101 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction);
103 Future<ActorSelection> future = localTransactionContext.readyTransaction();
104 assertTrue(future.isCompleted());
106 verify(mockReadySupport).onTransactionReady(readWriteTransaction);
110 public void testReadyWithWriteError() {
111 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
112 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
113 RuntimeException error = new RuntimeException("mock");
114 doThrow(error).when(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
116 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
117 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
119 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
121 doReadyWithExpectedError(error);
125 public void testReadyWithMergeError() {
126 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
127 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
128 RuntimeException error = new RuntimeException("mock");
129 doThrow(error).when(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
131 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
132 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
134 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
136 doReadyWithExpectedError(error);
140 public void testReadyWithDeleteError() {
141 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
142 RuntimeException error = new RuntimeException("mock");
143 doThrow(error).when(readWriteTransaction).delete(yangInstanceIdentifier);
145 localTransactionContext.deleteData(yangInstanceIdentifier);
146 localTransactionContext.deleteData(yangInstanceIdentifier);
148 verify(readWriteTransaction).delete(yangInstanceIdentifier);
150 doReadyWithExpectedError(error);
153 private void doReadyWithExpectedError(RuntimeException expError) {
154 LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
155 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit();
156 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction);
158 localTransactionContext.readyTransaction();
160 verify(mockCohort).setOperationError(expError);