Rename ActorContext to ActorUtils
[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.assertNull;
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;
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.mockito.Mock;
29 import org.mockito.MockitoAnnotations;
30 import org.opendaylight.controller.cluster.access.ABIVersion;
31 import org.opendaylight.controller.cluster.access.client.AbstractClientConnection;
32 import org.opendaylight.controller.cluster.access.client.AccessClientUtil;
33 import org.opendaylight.controller.cluster.access.client.ClientActorContext;
34 import org.opendaylight.controller.cluster.access.commands.ModifyTransactionRequest;
35 import org.opendaylight.controller.cluster.access.commands.PersistenceProtocol;
36 import org.opendaylight.controller.cluster.access.commands.TransactionCommitSuccess;
37 import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
38
39 public class DirectTransactionCommitCohortTest {
40
41     private static final String PERSISTENCE_ID = "per-1";
42
43     @Mock
44     private AbstractClientHistory history;
45     private ActorSystem system;
46     private TransactionTester<?> transaction;
47     private DirectTransactionCommitCohort cohort;
48
49     @Before
50     public void setUp() {
51         MockitoAnnotations.initMocks(this);
52         system = ActorSystem.apply();
53         final TestProbe clientContextProbe = new TestProbe(system, "clientContext");
54         final ClientActorContext context =
55                 AccessClientUtil.createClientActorContext(system, clientContextProbe.ref(), CLIENT_ID, PERSISTENCE_ID);
56         transaction = createTransactionTester(new TestProbe(system, "backend"), context, history);
57         final AbstractProxyTransaction proxy = transaction.getTransaction();
58         proxy.seal();
59         cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
60     }
61
62     @After
63     public void tearDown() {
64         TestKit.shutdownActorSystem(system);
65     }
66
67     @Test
68     public void testCanCommit() throws Exception {
69         final ListenableFuture<Boolean> canCommit = cohort.canCommit();
70         final ModifyTransactionRequest request = transaction.expectTransactionRequest(ModifyTransactionRequest.class);
71         assertTrue(request.getPersistenceProtocol().isPresent());
72         assertEquals(PersistenceProtocol.SIMPLE, request.getPersistenceProtocol().get());
73         final RequestSuccess<?, ?> success = new TransactionCommitSuccess(transaction.getTransaction().getIdentifier(),
74                 transaction.getLastReceivedMessage().getSequence());
75         transaction.replySuccess(success);
76         assertEquals(Boolean.TRUE, getWithTimeout(canCommit));
77     }
78
79     @Test
80     public void testPreCommit() throws Exception {
81         final ListenableFuture<Void> preCommit = cohort.preCommit();
82         assertNull(getWithTimeout(preCommit));
83     }
84
85     @Test
86     public void testAbort() throws Exception {
87         final ListenableFuture<Void> abort = cohort.abort();
88         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
89         assertNull(getWithTimeout(abort));
90     }
91
92     @Test
93     public void testCommit() throws Exception {
94         final ListenableFuture<Void> commit = cohort.commit();
95         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
96         assertNull(getWithTimeout(commit));
97     }
98
99     private static TransactionTester<?> createTransactionTester(final TestProbe backendProbe,
100                                                                 final ClientActorContext context,
101                                                                 final AbstractClientHistory history) {
102         final ShardBackendInfo backend = new ShardBackendInfo(backendProbe.ref(), 0L, ABIVersion.BORON,
103                 "default", UnsignedLong.ZERO, Optional.empty(), 3);
104         final AbstractClientConnection<ShardBackendInfo> connection =
105                 AccessClientUtil.createConnectedConnection(context, 0L, backend);
106         final ProxyHistory proxyHistory = ProxyHistory.createClient(history, connection, HISTORY_ID);
107         final RemoteProxyTransaction transaction =
108                 new RemoteProxyTransaction(proxyHistory, TRANSACTION_ID, false, false, false);
109         return new TransactionTester<>(transaction, connection, backendProbe);
110     }
111
112 }