128d08a4d97b6db3739d1f6935a26bacff21765b
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / LocalTransactionContextTest.java
1 /*
2  * Copyright (c) 2015 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.controller.cluster.datastore;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.doThrow;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.verify;
15
16 import akka.actor.ActorSelection;
17 import com.google.common.util.concurrent.SettableFuture;
18 import java.util.Optional;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.Mock;
23 import org.mockito.junit.MockitoJUnitRunner;
24 import org.opendaylight.controller.cluster.datastore.messages.DataExists;
25 import org.opendaylight.controller.cluster.datastore.messages.ReadData;
26 import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadTransaction;
27 import org.opendaylight.mdsal.dom.spi.store.DOMStoreReadWriteTransaction;
28 import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
29 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import scala.concurrent.Future;
33
34 @RunWith(MockitoJUnitRunner.StrictStubs.class)
35 public class LocalTransactionContextTest {
36
37     @Mock
38     private OperationLimiter limiter;
39
40     @Mock
41     private DOMStoreReadWriteTransaction readWriteTransaction;
42
43     @Mock
44     private LocalTransactionReadySupport mockReadySupport;
45
46     private LocalTransactionContext localTransactionContext;
47
48     @Before
49     public void setUp() {
50         localTransactionContext = new LocalTransactionContext(readWriteTransaction, limiter.getIdentifier(),
51                 mockReadySupport) {
52             @Override
53             protected DOMStoreWriteTransaction getWriteDelegate() {
54                 return readWriteTransaction;
55             }
56
57             @Override
58             protected DOMStoreReadTransaction getReadDelegate() {
59                 return readWriteTransaction;
60             }
61         };
62     }
63
64     @Test
65     public void testWrite() {
66         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
67         NormalizedNode normalizedNode = mock(NormalizedNode.class);
68         localTransactionContext.executeWrite(yangInstanceIdentifier, normalizedNode, null);
69         verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
70     }
71
72     @Test
73     public void testMerge() {
74         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
75         NormalizedNode normalizedNode = mock(NormalizedNode.class);
76         localTransactionContext.executeMerge(yangInstanceIdentifier, normalizedNode, null);
77         verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
78     }
79
80     @Test
81     public void testDelete() {
82         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
83         localTransactionContext.executeDelete(yangInstanceIdentifier, null);
84         verify(readWriteTransaction).delete(yangInstanceIdentifier);
85     }
86
87     @Test
88     public void testRead() {
89         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
90         NormalizedNode normalizedNode = mock(NormalizedNode.class);
91         doReturn(FluentFutures.immediateFluentFuture(Optional.of(normalizedNode))).when(readWriteTransaction)
92             .read(yangInstanceIdentifier);
93         localTransactionContext.executeRead(new ReadData(yangInstanceIdentifier, DataStoreVersions.CURRENT_VERSION),
94                 SettableFuture.create(), null);
95         verify(readWriteTransaction).read(yangInstanceIdentifier);
96     }
97
98     @Test
99     public void testExists() {
100         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
101         doReturn(FluentFutures.immediateTrueFluentFuture()).when(readWriteTransaction).exists(yangInstanceIdentifier);
102         localTransactionContext.executeRead(new DataExists(yangInstanceIdentifier, DataStoreVersions.CURRENT_VERSION),
103                 SettableFuture.create(), null);
104         verify(readWriteTransaction).exists(yangInstanceIdentifier);
105     }
106
107     @Test
108     public void testReady() {
109         final LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
110         doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit(Optional.empty());
111         doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction, null);
112
113         Future<ActorSelection> future = localTransactionContext.readyTransaction(null, Optional.empty());
114         assertTrue(future.isCompleted());
115
116         verify(mockReadySupport).onTransactionReady(readWriteTransaction, null);
117     }
118
119     @Test
120     public void testReadyWithWriteError() {
121         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
122         NormalizedNode normalizedNode = mock(NormalizedNode.class);
123         RuntimeException error = new RuntimeException("mock");
124         doThrow(error).when(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
125
126         localTransactionContext.executeWrite(yangInstanceIdentifier, normalizedNode, null);
127         localTransactionContext.executeWrite(yangInstanceIdentifier, normalizedNode, null);
128
129         verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
130
131         doReadyWithExpectedError(error);
132     }
133
134     @Test
135     public void testReadyWithMergeError() {
136         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
137         NormalizedNode normalizedNode = mock(NormalizedNode.class);
138         RuntimeException error = new RuntimeException("mock");
139         doThrow(error).when(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
140
141         localTransactionContext.executeMerge(yangInstanceIdentifier, normalizedNode, null);
142         localTransactionContext.executeMerge(yangInstanceIdentifier, normalizedNode, null);
143
144         verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
145
146         doReadyWithExpectedError(error);
147     }
148
149     @Test
150     public void testReadyWithDeleteError() {
151         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
152         RuntimeException error = new RuntimeException("mock");
153         doThrow(error).when(readWriteTransaction).delete(yangInstanceIdentifier);
154
155         localTransactionContext.executeDelete(yangInstanceIdentifier, null);
156         localTransactionContext.executeDelete(yangInstanceIdentifier, null);
157
158         verify(readWriteTransaction).delete(yangInstanceIdentifier);
159
160         doReadyWithExpectedError(error);
161     }
162
163     private void doReadyWithExpectedError(final RuntimeException expError) {
164         LocalThreePhaseCommitCohort mockCohort = mock(LocalThreePhaseCommitCohort.class);
165         doReturn(akka.dispatch.Futures.successful(null)).when(mockCohort).initiateCoordinatedCommit(Optional.empty());
166         doReturn(mockCohort).when(mockReadySupport).onTransactionReady(readWriteTransaction, expError);
167
168         localTransactionContext.readyTransaction(null, Optional.empty());
169     }
170 }