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.mockito.Mockito.doReturn;
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;
39 import org.opendaylight.controller.cluster.datastore.DatastoreContext;
40 import org.opendaylight.controller.cluster.datastore.utils.ActorUtils;
42 @RunWith(MockitoJUnitRunner.StrictStubs.class)
43 public class DirectTransactionCommitCohortTest {
44 private static final String PERSISTENCE_ID = "per-1";
47 private AbstractClientHistory history;
49 private DatastoreContext datastoreContext;
51 private ActorUtils actorUtils;
53 private ActorSystem system;
54 private TransactionTester<?> transaction;
55 private DirectTransactionCommitCohort cohort;
59 system = ActorSystem.apply();
60 final TestProbe clientContextProbe = new TestProbe(system, "clientContext");
61 final ClientActorContext context =
62 AccessClientUtil.createClientActorContext(system, clientContextProbe.ref(), CLIENT_ID, PERSISTENCE_ID);
63 doReturn(1000).when(datastoreContext).getShardBatchedModificationCount();
64 doReturn(datastoreContext).when(actorUtils).getDatastoreContext();
65 doReturn(actorUtils).when(history).actorUtils();
67 transaction = createTransactionTester(new TestProbe(system, "backend"), context, history);
68 final AbstractProxyTransaction proxy = transaction.getTransaction();
70 cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
74 public void tearDown() {
75 TestKit.shutdownActorSystem(system);
79 public void testCanCommit() throws Exception {
80 final ListenableFuture<Boolean> canCommit = cohort.canCommit();
81 final ModifyTransactionRequest request = transaction.expectTransactionRequest(ModifyTransactionRequest.class);
82 assertEquals(Optional.of(PersistenceProtocol.SIMPLE), request.getPersistenceProtocol());
83 final RequestSuccess<?, ?> success = new TransactionCommitSuccess(transaction.getTransaction().getIdentifier(),
84 transaction.getLastReceivedMessage().getSequence());
85 transaction.replySuccess(success);
86 assertEquals(Boolean.TRUE, getWithTimeout(canCommit));
90 public void testPreCommit() throws Exception {
91 final ListenableFuture<?> preCommit = cohort.preCommit();
92 assertNotNull(getWithTimeout(preCommit));
96 public void testAbort() throws Exception {
97 final ListenableFuture<?> abort = cohort.abort();
98 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
99 assertNotNull(getWithTimeout(abort));
103 public void testCommit() throws Exception {
104 final ListenableFuture<?> commit = cohort.commit();
105 verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
106 assertNotNull(getWithTimeout(commit));
109 private static TransactionTester<?> createTransactionTester(final TestProbe backendProbe,
110 final ClientActorContext context,
111 final AbstractClientHistory history) {
112 final ShardBackendInfo backend = new ShardBackendInfo(backendProbe.ref(), 0L, ABIVersion.current(),
113 "default", UnsignedLong.ZERO, Optional.empty(), 3);
114 final AbstractClientConnection<ShardBackendInfo> connection =
115 AccessClientUtil.createConnectedConnection(context, 0L, backend);
116 final ProxyHistory proxyHistory = ProxyHistory.createClient(history, connection, HISTORY_ID);
117 final RemoteProxyTransaction transaction =
118 new RemoteProxyTransaction(proxyHistory, TRANSACTION_ID, false, false, false);
119 return new TransactionTester<>(transaction, connection, backendProbe);