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