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.mockito.Mockito.verify;
11 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.CLIENT_ID;
12 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.HISTORY_ID;
13 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.TRANSACTION_ID;
14 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.getWithTimeout;
16 import akka.actor.ActorSystem;
17 import akka.testkit.JavaTestKit;
18 import akka.testkit.TestProbe;
19 import com.google.common.primitives.UnsignedLong;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import java.util.Optional;
22 import org.junit.After;
23 import org.junit.Assert;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mock;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.controller.cluster.access.ABIVersion;
29 import org.opendaylight.controller.cluster.access.client.AbstractClientConnection;
30 import org.opendaylight.controller.cluster.access.client.AccessClientUtil;
31 import org.opendaylight.controller.cluster.access.client.ClientActorContext;
32 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequest;
33 import org.opendaylight.controller.cluster.access.commands.PersistenceProtocol;
34 import org.opendaylight.controller.cluster.access.commands.TransactionCommitSuccess;
35 import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
37 public class DirectTransactionCommitCohortTest {
39 private static final String PERSISTENCE_ID = "per-1";
42 private AbstractClientHistory history;
43 private ActorSystem system;
44 private TransactionTester<?> transaction;
45 private DirectTransactionCommitCohort cohort;
48 public void setUp() throws Exception {
49 MockitoAnnotations.initMocks(this);
50 system = ActorSystem.apply();
51 final TestProbe clientContextProbe = new TestProbe(system, "clientContext");
52 final ClientActorContext context =
53 AccessClientUtil.createClientActorContext(system, clientContextProbe.ref(), CLIENT_ID, PERSISTENCE_ID);
54 transaction = createTransactionTester(new TestProbe(system, "backend"), context, history);
55 final AbstractProxyTransaction proxy = transaction.getTransaction();
57 cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
61 public void tearDown() throws Exception {
62 JavaTestKit.shutdownActorSystem(system);
66 public void testCanCommit() throws Exception {
67 final ListenableFuture<Boolean> canCommit = cohort.canCommit();
68 final ModifyTransactionRequest request = transaction.expectTransactionRequest(ModifyTransactionRequest.class);
69 Assert.assertTrue(request.getPersistenceProtocol().isPresent());
70 Assert.assertEquals(PersistenceProtocol.SIMPLE, request.getPersistenceProtocol().get());
71 final RequestSuccess<?, ?> success = new TransactionCommitSuccess(transaction.getTransaction().getIdentifier(),
72 transaction.getLastReceivedMessage().getSequence());
73 transaction.replySuccess(success);
74 Assert.assertTrue(getWithTimeout(canCommit));
78 public void testPreCommit() throws Exception {
79 final ListenableFuture<Void> preCommit = cohort.preCommit();
80 Assert.assertNull(getWithTimeout(preCommit));
84 public void testAbort() throws Exception {
85 final ListenableFuture<Void> abort = cohort.abort();
86 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
87 Assert.assertNull(getWithTimeout(abort));
91 public void testCommit() throws Exception {
92 final ListenableFuture<Void> commit = cohort.commit();
93 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
94 Assert.assertNull(getWithTimeout(commit));
97 private static TransactionTester<?> createTransactionTester(final TestProbe backendProbe,
98 final ClientActorContext context,
99 final AbstractClientHistory history) {
100 final ShardBackendInfo backend = new ShardBackendInfo(backendProbe.ref(), 0L, ABIVersion.BORON,
101 "default", UnsignedLong.ZERO, Optional.empty(), 3);
102 final AbstractClientConnection<ShardBackendInfo> connection =
103 AccessClientUtil.createConnectedConnection(context, 0L, backend);
104 final ProxyHistory proxyHistory = ProxyHistory.createClient(history, connection, HISTORY_ID);
105 final RemoteProxyTransaction transaction =
106 new RemoteProxyTransaction(proxyHistory, TRANSACTION_ID, false, false);
107 return new TransactionTester<>(transaction, connection, backendProbe);