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;
17 import akka.actor.ActorSelection;
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.Futures;
20 import com.google.common.util.concurrent.SettableFuture;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.opendaylight.controller.cluster.datastore.messages.DataExists;
26 import org.opendaylight.controller.cluster.datastore.messages.ReadData;
27 import org.opendaylight.controller.cluster.datastore.modification.DeleteModification;
28 import org.opendaylight.controller.cluster.datastore.modification.MergeModification;
29 import org.opendaylight.controller.cluster.datastore.modification.WriteModification;
30 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction;
31 import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadWriteTransaction;
32 import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
33 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 import scala.concurrent.Future;
37 public class LocalTransactionContextTest {
40 private OperationLimiter limiter;
43 private DOMStoreReadWriteTransaction readWriteTransaction;
46 private LocalTransactionReadySupport mockReadySupport;
48 private LocalTransactionContext localTransactionContext;
52 MockitoAnnotations.initMocks(this);
53 localTransactionContext = new LocalTransactionContext(readWriteTransaction, limiter.getIdentifier(),
56 protected DOMStoreWriteTransaction getWriteDelegate() {
57 return readWriteTransaction;
61 protected DOMStoreReadTransaction getReadDelegate() {
62 return readWriteTransaction;
68 public void testWrite() {
69 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
70 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
71 localTransactionContext.executeModification(new WriteModification(yangInstanceIdentifier, normalizedNode),
73 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
77 public void testMerge() {
78 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
79 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
80 localTransactionContext.executeModification(new MergeModification(yangInstanceIdentifier, normalizedNode),
82 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
86 public void testDelete() {
87 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
88 localTransactionContext.executeModification(new DeleteModification(yangInstanceIdentifier), null);
89 verify(readWriteTransaction).delete(yangInstanceIdentifier);
94 public void testRead() {
95 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
96 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
97 doReturn(Futures.immediateCheckedFuture(Optional.of(normalizedNode))).when(readWriteTransaction)
98 .read(yangInstanceIdentifier);
99 localTransactionContext.executeRead(new ReadData(yangInstanceIdentifier, DataStoreVersions.CURRENT_VERSION),
100 SettableFuture.create(), null);
101 verify(readWriteTransaction).read(yangInstanceIdentifier);
105 public void testExists() {
106 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
107 doReturn(Futures.immediateCheckedFuture(true)).when(readWriteTransaction).exists(yangInstanceIdentifier);
108 localTransactionContext.executeRead(new DataExists(yangInstanceIdentifier, DataStoreVersions.CURRENT_VERSION),
109 SettableFuture.create(), null);
110 verify(readWriteTransaction).exists(yangInstanceIdentifier);
114 public void testReady() {
115 final LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
116 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit(
117 java.util.Optional.empty());
118 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction, null);
120 Future<ActorSelection> future = localTransactionContext.readyTransaction(null, java.util.Optional.empty());
121 assertTrue(future.isCompleted());
123 verify(mockReadySupport).onTransactionReady(readWriteTransaction, null);
127 public void testReadyWithWriteError() {
128 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
129 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
130 RuntimeException error = new RuntimeException("mock");
131 doThrow(error).when(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
133 localTransactionContext.executeModification(new WriteModification(yangInstanceIdentifier, normalizedNode),
135 localTransactionContext.executeModification(new WriteModification(yangInstanceIdentifier, normalizedNode),
138 verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
140 doReadyWithExpectedError(error);
144 public void testReadyWithMergeError() {
145 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
146 NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
147 RuntimeException error = new RuntimeException("mock");
148 doThrow(error).when(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
150 localTransactionContext.executeModification(new MergeModification(yangInstanceIdentifier, normalizedNode),
152 localTransactionContext.executeModification(new MergeModification(yangInstanceIdentifier, normalizedNode),
155 verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
157 doReadyWithExpectedError(error);
161 public void testReadyWithDeleteError() {
162 YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.EMPTY;
163 RuntimeException error = new RuntimeException("mock");
164 doThrow(error).when(readWriteTransaction).delete(yangInstanceIdentifier);
166 localTransactionContext.executeModification(new DeleteModification(yangInstanceIdentifier), null);
167 localTransactionContext.executeModification(new DeleteModification(yangInstanceIdentifier), null);
169 verify(readWriteTransaction).delete(yangInstanceIdentifier);
171 doReadyWithExpectedError(error);
174 private void doReadyWithExpectedError(final RuntimeException expError) {
175 LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
176 doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit(
177 java.util.Optional.empty());
178 doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction, expError);
180 localTransactionContext.readyTransaction(null, java.util.Optional.empty());