2731b7d315700a6af8d032161325ce77e56ea755
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / databroker / actors / dds / RemoteProxyTransactionTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.databroker.actors.dds;
9
10 import static org.hamcrest.CoreMatchers.both;
11 import static org.hamcrest.CoreMatchers.hasItem;
12 import static org.hamcrest.CoreMatchers.isA;
13 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.assertFutureEquals;
14
15 import akka.testkit.TestProbe;
16 import com.google.common.util.concurrent.FluentFuture;
17 import com.google.common.util.concurrent.ListenableFuture;
18 import java.util.List;
19 import java.util.Optional;
20 import org.junit.Assert;
21 import org.junit.Test;
22 import org.opendaylight.controller.cluster.access.commands.ExistsTransactionRequest;
23 import org.opendaylight.controller.cluster.access.commands.ExistsTransactionSuccess;
24 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequest;
25 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequestBuilder;
26 import org.opendaylight.controller.cluster.access.commands.PersistenceProtocol;
27 import org.opendaylight.controller.cluster.access.commands.ReadTransactionRequest;
28 import org.opendaylight.controller.cluster.access.commands.ReadTransactionSuccess;
29 import org.opendaylight.controller.cluster.access.commands.TransactionAbortRequest;
30 import org.opendaylight.controller.cluster.access.commands.TransactionCanCommitSuccess;
31 import org.opendaylight.controller.cluster.access.commands.TransactionCommitSuccess;
32 import org.opendaylight.controller.cluster.access.commands.TransactionDelete;
33 import org.opendaylight.controller.cluster.access.commands.TransactionDoCommitRequest;
34 import org.opendaylight.controller.cluster.access.commands.TransactionMerge;
35 import org.opendaylight.controller.cluster.access.commands.TransactionModification;
36 import org.opendaylight.controller.cluster.access.commands.TransactionPreCommitRequest;
37 import org.opendaylight.controller.cluster.access.commands.TransactionPreCommitSuccess;
38 import org.opendaylight.controller.cluster.access.commands.TransactionWrite;
39 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
40 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
41 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
42 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
43
44 public class RemoteProxyTransactionTest extends AbstractProxyTransactionTest<RemoteProxyTransaction> {
45
46     @Override
47     protected RemoteProxyTransaction createTransaction(final ProxyHistory parent, final TransactionIdentifier id,
48                                                        final DataTreeSnapshot snapshot) {
49         return new RemoteProxyTransaction(parent, TRANSACTION_ID, false, false, false);
50     }
51
52     @Override
53     @Test
54     public void testExists() throws Exception {
55         final TransactionTester<RemoteProxyTransaction> tester = getTester();
56         final FluentFuture<Boolean> exists = transaction.exists(PATH_1);
57         final ExistsTransactionRequest req = tester.expectTransactionRequest(ExistsTransactionRequest.class);
58         final boolean existsResult = true;
59         tester.replySuccess(new ExistsTransactionSuccess(TRANSACTION_ID, req.getSequence(), existsResult));
60         assertFutureEquals(existsResult, exists);
61     }
62
63     @Override
64     @Test
65     public void testRead() throws Exception {
66         final TransactionTester<RemoteProxyTransaction> tester = getTester();
67         final FluentFuture<Optional<NormalizedNode<?, ?>>> read = transaction.read(PATH_2);
68         final ReadTransactionRequest req = tester.expectTransactionRequest(ReadTransactionRequest.class);
69         final Optional<NormalizedNode<?, ?>> result = Optional.of(DATA_1);
70         tester.replySuccess(new ReadTransactionSuccess(TRANSACTION_ID, req.getSequence(), result));
71         assertFutureEquals(result, read);
72     }
73
74     @Override
75     @Test
76     public void testWrite() {
77         final YangInstanceIdentifier path = PATH_1;
78         testModification(() -> transaction.write(path, DATA_1), TransactionWrite.class, path);
79     }
80
81     @Override
82     @Test
83     public void testMerge() {
84         final YangInstanceIdentifier path = PATH_2;
85         testModification(() -> transaction.merge(path, DATA_2), TransactionMerge.class, path);
86     }
87
88     @Override
89     @Test
90     public void testDelete() {
91         final YangInstanceIdentifier path = PATH_3;
92         testModification(() -> transaction.delete(path), TransactionDelete.class, path);
93     }
94
95     @Override
96     @Test
97     public void testDirectCommit() throws Exception {
98         transaction.seal();
99         final ListenableFuture<Boolean> result = transaction.directCommit();
100         final TransactionTester<RemoteProxyTransaction> tester = getTester();
101         final ModifyTransactionRequest req = tester.expectTransactionRequest(ModifyTransactionRequest.class);
102         Assert.assertTrue(req.getPersistenceProtocol().isPresent());
103         Assert.assertEquals(PersistenceProtocol.SIMPLE, req.getPersistenceProtocol().get());
104         tester.replySuccess(new TransactionCommitSuccess(TRANSACTION_ID, req.getSequence()));
105         assertFutureEquals(true, result);
106     }
107
108     @Override
109     @Test
110     public void testCanCommit() {
111         testRequestResponse(transaction::canCommit, ModifyTransactionRequest.class,
112                 TransactionCanCommitSuccess::new);
113     }
114
115     @Override
116     @Test
117     public void testPreCommit() {
118         testRequestResponse(transaction::preCommit, TransactionPreCommitRequest.class,
119                 TransactionPreCommitSuccess::new);
120     }
121
122     @Override
123     @Test
124     public void testDoCommit() {
125         testRequestResponse(transaction::doCommit, TransactionDoCommitRequest.class, TransactionCommitSuccess::new);
126     }
127
128     @Override
129     @Test
130     public void testForwardToRemoteAbort() {
131         final TestProbe probe = createProbe();
132         final TransactionAbortRequest request = new TransactionAbortRequest(TRANSACTION_ID, 0L, probe.ref());
133         testForwardToRemote(request, TransactionAbortRequest.class);
134
135     }
136
137     @Override
138     public void testForwardToRemoteCommit() {
139         final TestProbe probe = createProbe();
140         final TransactionAbortRequest request = new TransactionAbortRequest(TRANSACTION_ID, 0L, probe.ref());
141         testForwardToRemote(request, TransactionAbortRequest.class);
142     }
143
144     @Test
145     public void testForwardToRemoteModifyCommitSimple() {
146         final TestProbe probe = createProbe();
147         final ModifyTransactionRequestBuilder builder =
148                 new ModifyTransactionRequestBuilder(TRANSACTION_ID, probe.ref());
149         builder.setSequence(0L);
150         builder.setCommit(false);
151         final ModifyTransactionRequest request = builder.build();
152         final ModifyTransactionRequest received = testForwardToRemote(request, ModifyTransactionRequest.class);
153         Assert.assertEquals(request.getPersistenceProtocol(), received.getPersistenceProtocol());
154         Assert.assertEquals(request.getModifications(), received.getModifications());
155         Assert.assertEquals(request.getTarget(), received.getTarget());
156     }
157
158     @Test
159     public void testForwardToRemoteModifyCommit3Phase() {
160         final TestProbe probe = createProbe();
161         final ModifyTransactionRequestBuilder builder =
162                 new ModifyTransactionRequestBuilder(TRANSACTION_ID, probe.ref());
163         builder.setSequence(0L);
164         builder.setCommit(true);
165         final ModifyTransactionRequest request = builder.build();
166         final ModifyTransactionRequest received = testForwardToRemote(request, ModifyTransactionRequest.class);
167         Assert.assertEquals(request.getPersistenceProtocol(), received.getPersistenceProtocol());
168         Assert.assertEquals(request.getModifications(), received.getModifications());
169         Assert.assertEquals(request.getTarget(), received.getTarget());
170     }
171
172     @Test
173     public void testForwardToRemoteModifyAbort() {
174         final TestProbe probe = createProbe();
175         final ModifyTransactionRequestBuilder builder =
176                 new ModifyTransactionRequestBuilder(TRANSACTION_ID, probe.ref());
177         builder.setSequence(0L);
178         builder.setAbort();
179         final ModifyTransactionRequest request = builder.build();
180         final ModifyTransactionRequest received = testForwardToRemote(request, ModifyTransactionRequest.class);
181         Assert.assertEquals(request.getTarget(), received.getTarget());
182         Assert.assertTrue(received.getPersistenceProtocol().isPresent());
183         Assert.assertEquals(PersistenceProtocol.ABORT, received.getPersistenceProtocol().get());
184     }
185
186     @Test
187     public void testForwardToRemoteModifyRead() {
188         final TestProbe probe = createProbe();
189         final ReadTransactionRequest request =
190                 new ReadTransactionRequest(TRANSACTION_ID, 0L, probe.ref(), PATH_1, false);
191         final ReadTransactionRequest received = testForwardToRemote(request, ReadTransactionRequest.class);
192         Assert.assertEquals(request.getTarget(), received.getTarget());
193         Assert.assertEquals(request.getPath(), received.getPath());
194     }
195
196     @Test
197     public void testForwardToRemoteModifyExists() {
198         final TestProbe probe = createProbe();
199         final ExistsTransactionRequest request =
200                 new ExistsTransactionRequest(TRANSACTION_ID, 0L, probe.ref(), PATH_1, false);
201         final ExistsTransactionRequest received = testForwardToRemote(request, ExistsTransactionRequest.class);
202         Assert.assertEquals(request.getTarget(), received.getTarget());
203         Assert.assertEquals(request.getPath(), received.getPath());
204     }
205
206     @Test
207     public void testForwardToRemoteModifyPreCommit() {
208         final TestProbe probe = createProbe();
209         final TransactionPreCommitRequest request =
210                 new TransactionPreCommitRequest(TRANSACTION_ID, 0L, probe.ref());
211         final TransactionPreCommitRequest received = testForwardToRemote(request, TransactionPreCommitRequest.class);
212         Assert.assertEquals(request.getTarget(), received.getTarget());
213     }
214
215     @Test
216     public void testForwardToRemoteModifyDoCommit() {
217         final TestProbe probe = createProbe();
218         final TransactionDoCommitRequest request =
219                 new TransactionDoCommitRequest(TRANSACTION_ID, 0L, probe.ref());
220         final TransactionDoCommitRequest received = testForwardToRemote(request, TransactionDoCommitRequest.class);
221         Assert.assertEquals(request.getTarget(), received.getTarget());
222     }
223
224
225     private <T extends TransactionModification> void testModification(final Runnable modification,
226                                                                       final Class<T> cls,
227                                                                       final YangInstanceIdentifier expectedPath) {
228         modification.run();
229         final ModifyTransactionRequest request = transaction.commitRequest(false);
230         final List<TransactionModification> modifications = request.getModifications();
231         Assert.assertEquals(1, modifications.size());
232         Assert.assertThat(modifications, hasItem(both(isA(cls)).and(hasPath(expectedPath))));
233     }
234
235 }