32f062ec6ba623fc6f9dbf9ec490e38cf20790fe
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / databroker / actors / dds / DirectTransactionCommitCohortTest.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.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;
18
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;
41
42 @RunWith(MockitoJUnitRunner.StrictStubs.class)
43 public class DirectTransactionCommitCohortTest {
44     private static final String PERSISTENCE_ID = "per-1";
45
46     @Mock
47     private AbstractClientHistory history;
48     @Mock
49     private DatastoreContext datastoreContext;
50     @Mock
51     private ActorUtils actorUtils;
52
53     private ActorSystem system;
54     private TransactionTester<?> transaction;
55     private DirectTransactionCommitCohort cohort;
56
57     @Before
58     public void setUp() {
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();
66
67         transaction = createTransactionTester(new TestProbe(system, "backend"), context, history);
68         final AbstractProxyTransaction proxy = transaction.getTransaction();
69         proxy.seal();
70         cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
71     }
72
73     @After
74     public void tearDown() {
75         TestKit.shutdownActorSystem(system);
76     }
77
78     @Test
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));
87     }
88
89     @Test
90     public void testPreCommit() throws Exception {
91         final ListenableFuture<?> preCommit = cohort.preCommit();
92         assertNotNull(getWithTimeout(preCommit));
93     }
94
95     @Test
96     public void testAbort() throws Exception {
97         final ListenableFuture<?> abort = cohort.abort();
98         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
99         assertNotNull(getWithTimeout(abort));
100     }
101
102     @Test
103     public void testCommit() throws Exception {
104         final ListenableFuture<?> commit = cohort.commit();
105         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
106         assertNotNull(getWithTimeout(commit));
107     }
108
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);
120     }
121
122 }