1 package org.opendaylight.controller.cluster.datastore;
3 import static org.junit.Assert.assertTrue;
4 import static org.mockito.Mockito.doReturn;
5 import static org.mockito.Mockito.times;
6 import static org.mockito.Mockito.verify;
7 import akka.util.Timeout;
8 import com.google.common.util.concurrent.Uninterruptibles;
9 import java.util.concurrent.Executors;
10 import java.util.concurrent.TimeUnit;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.mockito.Mock;
14 import org.mockito.MockitoAnnotations;
15 import org.opendaylight.controller.cluster.datastore.utils.ActorContext;
16 import org.opendaylight.controller.md.cluster.datastore.model.TestModel;
17 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
18 import scala.concurrent.duration.FiniteDuration;
20 public class DistributedDataStoreTest extends AbstractActorTest {
22 private SchemaContext schemaContext;
25 private ActorContext actorContext;
28 private DatastoreContext datastoreContext;
31 private Timeout shardElectionTimeout;
34 public void setUp() throws Exception {
35 MockitoAnnotations.initMocks(this);
37 schemaContext = TestModel.createTestContext();
39 doReturn(schemaContext).when(actorContext).getSchemaContext();
40 doReturn(DatastoreContext.newBuilder().build()).when(actorContext).getDatastoreContext();
44 public void testRateLimitingUsedInReadWriteTxCreation(){
45 DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
47 distributedDataStore.newReadWriteTransaction();
49 verify(actorContext, times(1)).acquireTxCreationPermit();
53 public void testRateLimitingUsedInWriteOnlyTxCreation(){
54 DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
56 distributedDataStore.newWriteOnlyTransaction();
58 verify(actorContext, times(1)).acquireTxCreationPermit();
63 public void testRateLimitingNotUsedInReadOnlyTxCreation(){
64 DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
66 distributedDataStore.newReadOnlyTransaction();
67 distributedDataStore.newReadOnlyTransaction();
68 distributedDataStore.newReadOnlyTransaction();
70 verify(actorContext, times(0)).acquireTxCreationPermit();
74 public void testWaitTillReadyBlocking(){
75 doReturn(datastoreContext).when(actorContext).getDatastoreContext();
76 doReturn(shardElectionTimeout).when(datastoreContext).getShardLeaderElectionTimeout();
77 doReturn(FiniteDuration.apply(50, TimeUnit.MILLISECONDS)).when(shardElectionTimeout).duration();
78 DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
80 long start = System.currentTimeMillis();
82 distributedDataStore.waitTillReady();
84 long end = System.currentTimeMillis();
86 assertTrue("Expected to be blocked for 50 millis", (end-start) >= 50);
90 public void testWaitTillReadyCountDown(){
91 final DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
92 doReturn(datastoreContext).when(actorContext).getDatastoreContext();
93 doReturn(shardElectionTimeout).when(datastoreContext).getShardLeaderElectionTimeout();
94 doReturn(FiniteDuration.apply(5000, TimeUnit.MILLISECONDS)).when(shardElectionTimeout).duration();
96 Executors.newSingleThreadExecutor().submit(new Runnable() {
99 Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
100 distributedDataStore.getWaitTillReadyCountDownLatch().countDown();
104 long start = System.currentTimeMillis();
106 distributedDataStore.waitTillReady();
108 long end = System.currentTimeMillis();
110 assertTrue("Expected to be released in 500 millis", (end-start) < 5000);