838a169dbe1af622ce6ccdb61e9eecc90d5f7031
[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
9 package org.opendaylight.controller.cluster.datastore;
10
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;
31
32 public class LocalTransactionContextTest {
33
34     @Mock
35     OperationLimiter limiter;
36
37     @Mock
38     TransactionIdentifier identifier;
39
40     @Mock
41     DOMStoreReadWriteTransaction readWriteTransaction;
42
43     @Mock
44     LocalTransactionReadySupport mockReadySupport;
45
46     LocalTransactionContext localTransactionContext;
47
48     @Before
49     public void setUp() {
50         MockitoAnnotations.initMocks(this);
51         localTransactionContext = new LocalTransactionContext(readWriteTransaction, limiter.getIdentifier(), 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.builder().build();
67         NormalizedNode<?, ?> normalizedNode = mock(NormalizedNode.class);
68         localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
69         verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
70     }
71
72     @Test
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);
78     }
79
80     @Test
81     public void testDelete() {
82         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
83         localTransactionContext.deleteData(yangInstanceIdentifier);
84         verify(readWriteTransaction).delete(yangInstanceIdentifier);
85     }
86
87
88     @Test
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);
95     }
96
97     @Test
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);
103     }
104
105     @Test
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, null);
110
111         Future<ActorSelection> future = localTransactionContext.readyTransaction();
112         assertTrue(future.isCompleted());
113
114         verify(mockReadySupport).onTransactionReady(readWriteTransaction, null);
115     }
116
117     @Test
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);
123
124         localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
125         localTransactionContext.writeData(yangInstanceIdentifier, normalizedNode);
126
127         verify(readWriteTransaction).write(yangInstanceIdentifier, normalizedNode);
128
129         doReadyWithExpectedError(error);
130     }
131
132     @Test
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);
138
139         localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
140         localTransactionContext.mergeData(yangInstanceIdentifier, normalizedNode);
141
142         verify(readWriteTransaction).merge(yangInstanceIdentifier, normalizedNode);
143
144         doReadyWithExpectedError(error);
145     }
146
147     @Test
148     public void testReadyWithDeleteError() {
149         YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
150         RuntimeException error = new RuntimeException("mock");
151         doThrow(error).when(readWriteTransaction).delete(yangInstanceIdentifier);
152
153         localTransactionContext.deleteData(yangInstanceIdentifier);
154         localTransactionContext.deleteData(yangInstanceIdentifier);
155
156         verify(readWriteTransaction).delete(yangInstanceIdentifier);
157
158         doReadyWithExpectedError(error);
159     }
160
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, expError);
165
166         localTransactionContext.readyTransaction();
167     }
168 }