2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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
8 package org.opendaylight.controller.cluster.databroker.actors.dds;
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;
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.tree.api.DataTreeSnapshot;
46 public class RemoteProxyTransactionTest extends AbstractProxyTransactionTest<RemoteProxyTransaction> {
49 protected RemoteProxyTransaction createTransaction(final ProxyHistory parent, final TransactionIdentifier id,
50 final DataTreeSnapshot snapshot) {
51 return new RemoteProxyTransaction(parent, TRANSACTION_ID, false, false, false);
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);
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);
78 public void testWrite() {
79 final YangInstanceIdentifier path = PATH_1;
80 testModification(() -> transaction.write(path, DATA_1), TransactionWrite.class, path);
85 public void testMerge() {
86 final YangInstanceIdentifier path = PATH_2;
87 testModification(() -> transaction.merge(path, DATA_2), TransactionMerge.class, path);
92 public void testDelete() {
93 final YangInstanceIdentifier path = PATH_3;
94 testModification(() -> transaction.delete(path), TransactionDelete.class, path);
99 public void testDirectCommit() throws Exception {
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);
112 public void testCanCommit() {
113 testRequestResponse(transaction::canCommit, ModifyTransactionRequest.class,
114 TransactionCanCommitSuccess::new);
119 public void testPreCommit() {
120 testRequestResponse(transaction::preCommit, TransactionPreCommitRequest.class,
121 TransactionPreCommitSuccess::new);
126 public void testDoCommit() {
127 testRequestResponse(transaction::doCommit, TransactionDoCommitRequest.class, TransactionCommitSuccess::new);
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);
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);
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());
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());
175 public void testForwardToRemoteModifyAbort() {
176 final TestProbe probe = createProbe();
177 final ModifyTransactionRequestBuilder builder =
178 new ModifyTransactionRequestBuilder(TRANSACTION_ID, probe.ref());
179 builder.setSequence(0L);
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());
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());
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());
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());
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());
227 private <T extends TransactionModification> void testModification(final Runnable modification, final Class<T> cls,
228 final YangInstanceIdentifier expectedPath) {
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))));