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.controller.cluster.datastore;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.doThrow;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.verify;
16 import akka.actor.ActorSelection;
17 import com.google.common.base.Optional;
18 import com.google.common.util.concurrent.Futures;
19 import com.google.common.util.concurrent.SettableFuture;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.mockito.Mock;
23 import org.mockito.MockitoAnnotations;
24 import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier;
25 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
26 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
27 import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
30 import scala.concurrent.Future;
32 public class LocalTransactionContextTest {
35 OperationLimiter limiter;
38 TransactionIdentifier identifier;
41 DOMStoreReadWriteTransaction readWriteTransaction;
44 LocalTransactionReadySupport mockReadySupport;
46 LocalTransactionContext localTransactionContext;
50 MockitoAnnotations.initMocks(this);
51 localTransactionContext = new LocalTransactionContext(readWriteTransaction, limiter.getIdentifier(), mockReadySupport) {
53 protected DOMStoreWriteTransaction getWriteDelegate() {
54 return readWriteTransaction;
58 protected DOMStoreReadTransaction getReadDelegate() {
59 return readWriteTransaction;
65 public void testWrite() {
66 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
67 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
68 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
69 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
73 public void testMerge() {
74 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
75 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
76 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
77 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
81 public void testDelete() {
82 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
83 localTransactionContext.deleteData(yangInstanceIdentifier);
84 verify(readWriteTransaction).delete(yangInstanceIdentifier);
89 public void testRead() {
90 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
91 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
92 doReturn(Futures.immediateCheckedFuture(Optional.of(normalizedNode))).when(readWriteTransaction).read(yangInstanceIdentifier);
93 localTransactionContext.readData(yangInstanceIdentifier, SettableFuture.<Optional<NormalizedNode<?,?>>>create());
94 verify(readWriteTransaction).read(yangInstanceIdentifier);
98 public void testExists() {
99 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
100 doReturn(Futures.immediateCheckedFuture(true)).when(readWriteTransaction).exists(yangInstanceIdentifier);
101 localTransactionContext.dataExists(yangInstanceIdentifier, SettableFuture.<Boolean> create());
102 verify(readWriteTransaction).exists(yangInstanceIdentifier);
106 public void testReady() {
107 final LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
108 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit();
109 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction);
111 Future<ActorSelection> future = localTransactionContext.readyTransaction();
112 assertTrue(future.isCompleted());
114 verify(mockReadySupport).onTransactionReady(readWriteTransaction);
118 public void testReadyWithWriteError() {
119 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
120 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
121 RuntimeException error = new RuntimeException("mock");
122 doThrow(error).when(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
124 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
125 localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
127 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
129 doReadyWithExpectedError(error);
133 public void testReadyWithMergeError() {
134 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
135 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
136 RuntimeException error = new RuntimeException("mock");
137 doThrow(error).when(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
139 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
140 localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
142 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
144 doReadyWithExpectedError(error);
148 public void testReadyWithDeleteError() {
149 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
150 RuntimeException error = new RuntimeException("mock");
151 doThrow(error).when(readWriteTransaction).delete(yangInstanceIdentifier);
153 localTransactionContext.deleteData(yangInstanceIdentifier);
154 localTransactionContext.deleteData(yangInstanceIdentifier);
156 verify(readWriteTransaction).delete(yangInstanceIdentifier);
158 doReadyWithExpectedError(error);
161 private void doReadyWithExpectedError(RuntimeException expError) {
162 LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
163 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit();
164 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction);
166 localTransactionContext.readyTransaction();
168 verify(mockCohort).setOperationError(expError);