1dd86b0028910beee395f43e3733647ad7294f4c
[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.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
40 @RunWith(MockitoJUnitRunner.StrictStubs.class)
41 public class DirectTransactionCommitCohortTest {
42
43     private static final String PERSISTENCE_ID = "per-1";
44
45     @Mock
46     private AbstractClientHistory history;
47     private ActorSystem system;
48     private TransactionTester<?> transaction;
49     private DirectTransactionCommitCohort cohort;
50
51     @Before
52     public void setUp() {
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();
59         proxy.seal();
60         cohort = new DirectTransactionCommitCohort(history, TRANSACTION_ID, proxy);
61     }
62
63     @After
64     public void tearDown() {
65         TestKit.shutdownActorSystem(system);
66     }
67
68     @Test
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));
78     }
79
80     @Test
81     public void testPreCommit() throws Exception {
82         final ListenableFuture<Void> preCommit = cohort.preCommit();
83         assertNull(getWithTimeout(preCommit));
84     }
85
86     @Test
87     public void testAbort() throws Exception {
88         final ListenableFuture<Void> abort = cohort.abort();
89         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
90         assertNull(getWithTimeout(abort));
91     }
92
93     @Test
94     public void testCommit() throws Exception {
95         final ListenableFuture<Void> commit = cohort.commit();
96         verify(history).onTransactionComplete(transaction.getTransaction().getIdentifier());
97         assertNull(getWithTimeout(commit));
98     }
99
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);
111     }
112
113 }