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.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.mockito.Mockito.verify;
14 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.CLIENT_ID;
15 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.HISTORY_ID;
16 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.TRANSACTION_ID;
17 import static org.opendaylight.controller.cluster.databroker.actors.dds.TestUtils.getWithTimeout;
19 import akka.actor.ActorSystem;
20 import akka.testkit.TestProbe;
21 import akka.testkit.javadsl.TestKit;
22 import com.google.common.primitives.UnsignedLong;
23 import com.google.common.util.concurrent.ListenableFuture;
24 import java.util.Optional;
25 import org.junit.After;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.junit.MockitoJUnitRunner;
31 import org.opendaylight.controller.cluster.access.ABIVersion;
32 import org.opendaylight.controller.cluster.access.client.AbstractClientConnection;
33 import org.opendaylight.controller.cluster.access.client.AccessClientUtil;
34 import org.opendaylight.controller.cluster.access.client.ClientActorContext;
35 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequest;
36 import org.opendaylight.controller.cluster.access.commands.PersistenceProtocol;
37 import org.opendaylight.controller.cluster.access.commands.TransactionCommitSuccess;
38 import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
40 @RunWith(MockitoJUnitRunner.StrictStubs.class)
41 public class DirectTransactionCommitCohortTest {
43 private static final String PERSISTENCE_ID = "per-1";
46 private AbstractClientHistory history;
47 private ActorSystem system;
48 private TransactionTester<?> transaction;
49 private DirectTransactionCommitCohort cohort;
53 system = ActorSystem.apply();
54 final TestProbe clientContextProbe = new TestProbe(system, "clientContext");
55 final ClientActorContext context =
56 AccessClientUtil.createClientActorContext(system, clientContextProbe.ref(), CLIENT_ID, PERSISTENCE_ID);
57 transaction = createTransactionTester(new TestProbe(system, "backend"), context, history);
58 final AbstractProxyTransaction proxy = transaction.getTransaction();
60 cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
64 public void tearDown() {
65 TestKit.shutdownActorSystem(system);
69 public void testCanCommit() throws Exception {
70 final ListenableFuture<Boolean> canCommit = cohort.canCommit();
71 final ModifyTransactionRequest request = transaction.expectTransactionRequest(ModifyTransactionRequest.class);
72 assertTrue(request.getPersistenceProtocol().isPresent());
73 assertEquals(PersistenceProtocol.SIMPLE, request.getPersistenceProtocol().get());
74 final RequestSuccess<?, ?> success = new TransactionCommitSuccess(transaction.getTransaction().getIdentifier(),
75 transaction.getLastReceivedMessage().getSequence());
76 transaction.replySuccess(success);
77 assertEquals(Boolean.TRUE, getWithTimeout(canCommit));
81 public void testPreCommit() throws Exception {
82 final ListenableFuture<?> preCommit = cohort.preCommit();
83 assertNotNull(getWithTimeout(preCommit));
87 public void testAbort() throws Exception {
88 final ListenableFuture<?> abort = cohort.abort();
89 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
90 assertNotNull(getWithTimeout(abort));
94 public void testCommit() throws Exception {
95 final ListenableFuture<?> commit = cohort.commit();
96 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
97 assertNotNull(getWithTimeout(commit));
100 private static TransactionTester<?> createTransactionTester(final TestProbe backendProbe,
101 final ClientActorContext context,
102 final AbstractClientHistory history) {
103 final ShardBackendInfo backend = new ShardBackendInfo(backendProbe.ref(), 0L, ABIVersion.BORON,
104 "default", UnsignedLong.ZERO, Optional.empty(), 3);
105 final AbstractClientConnection<ShardBackendInfo> connection =
106 AccessClientUtil.createConnectedConnection(context, 0L, backend);
107 final ProxyHistory proxyHistory = ProxyHistory.createClient(history, connection, HISTORY_ID);
108 final RemoteProxyTransaction transaction =
109 new RemoteProxyTransaction(proxyHistory, TRANSACTION_ID, false, false, false);
110 return new TransactionTester<>(transaction, connection, backendProbe);