+ @Test
+ public void testWaitTillReadyBlocking(){
+ doReturn(datastoreContext).when(actorContext).getDatastoreContext();
+ doReturn(shardElectionTimeout).when(datastoreContext).getShardLeaderElectionTimeout();
+ doReturn(FiniteDuration.apply(50, TimeUnit.MILLISECONDS)).when(shardElectionTimeout).duration();
+ DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
+
+ long start = System.currentTimeMillis();
+
+ distributedDataStore.waitTillReady();
+
+ long end = System.currentTimeMillis();
+
+ assertTrue("Expected to be blocked for 50 millis", (end-start) >= 50);
+ }
+
+ @Test
+ public void testWaitTillReadyCountDown(){
+ final DistributedDataStore distributedDataStore = new DistributedDataStore(actorContext);
+ doReturn(datastoreContext).when(actorContext).getDatastoreContext();
+ doReturn(shardElectionTimeout).when(datastoreContext).getShardLeaderElectionTimeout();
+ doReturn(FiniteDuration.apply(5000, TimeUnit.MILLISECONDS)).when(shardElectionTimeout).duration();
+
+ Executors.newSingleThreadExecutor().submit(new Runnable() {
+ @Override
+ public void run() {
+ Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
+ distributedDataStore.getWaitTillReadyCountDownLatch().countDown();
+ }
+ });
+
+ long start = System.currentTimeMillis();
+
+ distributedDataStore.waitTillReady();
+
+ long end = System.currentTimeMillis();
+
+ assertTrue("Expected to be released in 500 millis", (end-start) < 5000);
+
+ }
+