X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Futils%2FActorContextTest.java;h=3b64bde8a5b21c14756b9e35f6e80fb372ab802c;hp=031463b2b958efc9803830a56ee4436eacd32674;hb=c3ea6ff9c64bcd51e46767a18a1370a2b3819dca;hpb=9c34ce103df5efac991297dc25a64c9b8d6019f3 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/ActorContextTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/ActorContextTest.java index 031463b2b9..3b64bde8a5 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/ActorContextTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/utils/ActorContextTest.java @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + package org.opendaylight.controller.cluster.datastore.utils; import static org.junit.Assert.assertEquals; @@ -28,13 +36,13 @@ import com.typesafe.config.ConfigFactory; import java.util.Arrays; import java.util.Map; import java.util.concurrent.TimeUnit; -import org.apache.commons.lang.time.StopWatch; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import org.opendaylight.controller.cluster.datastore.AbstractActorTest; import org.opendaylight.controller.cluster.datastore.ClusterWrapper; import org.opendaylight.controller.cluster.datastore.Configuration; +import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.DatastoreContext; import org.opendaylight.controller.cluster.datastore.exceptions.NoShardLeaderException; import org.opendaylight.controller.cluster.datastore.exceptions.NotInitializedException; @@ -327,41 +335,12 @@ public class ActorContextTest extends AbstractActorTest{ assertEquals(expected, actual); } - @Test - public void testRateLimiting(){ - DatastoreContext dataStoreContext = DatastoreContext.newBuilder().dataStoreType("config"). - transactionCreationInitialRateLimit(155L).build(); - - ActorContext actorContext = - new ActorContext(getSystem(), mock(ActorRef.class), mock(ClusterWrapper.class), - mock(Configuration.class), dataStoreContext); - - // Check that the initial value is being picked up from DataStoreContext - assertEquals(dataStoreContext.getTransactionCreationInitialRateLimit(), actorContext.getTxCreationLimit(), 1e-15); - - actorContext.setTxCreationLimit(1.0); - - assertEquals(1.0, actorContext.getTxCreationLimit(), 1e-15); - - - StopWatch watch = new StopWatch(); - - watch.start(); - - actorContext.acquireTxCreationPermit(); - actorContext.acquireTxCreationPermit(); - actorContext.acquireTxCreationPermit(); - - watch.stop(); - - assertTrue("did not take as much time as expected", watch.getTime() > 1000); - } @Test public void testClientDispatcherIsGlobalDispatcher(){ ActorContext actorContext = new ActorContext(getSystem(), mock(ActorRef.class), mock(ClusterWrapper.class), - mock(Configuration.class), DatastoreContext.newBuilder().build()); + mock(Configuration.class), DatastoreContext.newBuilder().build(), new PrimaryShardInfoFutureCache()); assertEquals(getSystem().dispatchers().defaultGlobalDispatcher(), actorContext.getClientDispatcher()); @@ -373,7 +352,7 @@ public class ActorContextTest extends AbstractActorTest{ ActorContext actorContext = new ActorContext(actorSystem, mock(ActorRef.class), mock(ClusterWrapper.class), - mock(Configuration.class), DatastoreContext.newBuilder().build()); + mock(Configuration.class), DatastoreContext.newBuilder().build(), new PrimaryShardInfoFutureCache()); assertNotEquals(actorSystem.dispatchers().defaultGlobalDispatcher(), actorContext.getClientDispatcher()); @@ -386,7 +365,7 @@ public class ActorContextTest extends AbstractActorTest{ new JavaTestKit(getSystem()) {{ ActorContext actorContext = new ActorContext(getSystem(), getRef(), mock(ClusterWrapper.class), mock(Configuration.class), DatastoreContext.newBuilder(). - operationTimeoutInSeconds(5).shardTransactionCommitTimeoutInSeconds(7).build()); + operationTimeoutInSeconds(5).shardTransactionCommitTimeoutInSeconds(7).build(), new PrimaryShardInfoFutureCache()); assertEquals("getOperationDuration", 5, actorContext.getOperationDuration().toSeconds()); assertEquals("getTransactionCommitOperationTimeout", 7, @@ -417,12 +396,13 @@ public class ActorContextTest extends AbstractActorTest{ shardLeaderElectionTimeout(100, TimeUnit.MILLISECONDS).build(); final String expPrimaryPath = "akka://test-system/find-primary-shard"; + final short expPrimaryVersion = DataStoreVersions.CURRENT_VERSION; ActorContext actorContext = new ActorContext(getSystem(), shardManager, mock(ClusterWrapper.class), - mock(Configuration.class), dataStoreContext) { + mock(Configuration.class), dataStoreContext, new PrimaryShardInfoFutureCache()) { @Override protected Future doAsk(ActorRef actorRef, Object message, Timeout timeout) { - return Futures.successful((Object) new RemotePrimaryShardFound(expPrimaryPath)); + return Futures.successful((Object) new RemotePrimaryShardFound(expPrimaryPath, expPrimaryVersion)); } }; @@ -433,6 +413,7 @@ public class ActorContextTest extends AbstractActorTest{ assertEquals("LocalShardDataTree present", false, actual.getLocalShardDataTree().isPresent()); assertTrue("Unexpected PrimaryShardActor path " + actual.getPrimaryShardActor().path(), expPrimaryPath.endsWith(actual.getPrimaryShardActor().pathString())); + assertEquals("getPrimaryShardVersion", expPrimaryVersion, actual.getPrimaryShardVersion()); Future cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); @@ -440,9 +421,7 @@ public class ActorContextTest extends AbstractActorTest{ assertEquals(cachedInfo, actual); - // Wait for 200 Milliseconds. The cached entry should have been removed. - - Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS); + actorContext.getPrimaryShardInfoCache().remove("foobar"); cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); @@ -462,7 +441,7 @@ public class ActorContextTest extends AbstractActorTest{ final String expPrimaryPath = "akka://test-system/find-primary-shard"; ActorContext actorContext = new ActorContext(getSystem(), shardManager, mock(ClusterWrapper.class), - mock(Configuration.class), dataStoreContext) { + mock(Configuration.class), dataStoreContext, new PrimaryShardInfoFutureCache()) { @Override protected Future doAsk(ActorRef actorRef, Object message, Timeout timeout) { return Futures.successful((Object) new LocalPrimaryShardFound(expPrimaryPath, mockDataTree)); @@ -477,6 +456,7 @@ public class ActorContextTest extends AbstractActorTest{ assertSame("LocalShardDataTree", mockDataTree, actual.getLocalShardDataTree().get()); assertTrue("Unexpected PrimaryShardActor path " + actual.getPrimaryShardActor().path(), expPrimaryPath.endsWith(actual.getPrimaryShardActor().pathString())); + assertEquals("getPrimaryShardVersion", DataStoreVersions.CURRENT_VERSION, actual.getPrimaryShardVersion()); Future cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); @@ -484,9 +464,7 @@ public class ActorContextTest extends AbstractActorTest{ assertEquals(cachedInfo, actual); - // Wait for 200 Milliseconds. The cached entry should have been removed. - - Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS); + actorContext.getPrimaryShardInfoCache().remove("foobar"); cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); @@ -495,68 +473,44 @@ public class ActorContextTest extends AbstractActorTest{ @Test public void testFindPrimaryShardAsyncPrimaryNotFound() throws Exception { - - TestActorRef shardManager = - TestActorRef.create(getSystem(), Props.create(MessageCollectorActor.class)); - - DatastoreContext dataStoreContext = DatastoreContext.newBuilder().dataStoreType("config"). - shardLeaderElectionTimeout(100, TimeUnit.MILLISECONDS).build(); - - ActorContext actorContext = - new ActorContext(getSystem(), shardManager, mock(ClusterWrapper.class), - mock(Configuration.class), dataStoreContext) { - @Override - protected Future doAsk(ActorRef actorRef, Object message, Timeout timeout) { - return Futures.successful((Object) new PrimaryNotFoundException("not found")); - } - }; - - - Future foobar = actorContext.findPrimaryShardAsync("foobar"); - - try { - Await.result(foobar, Duration.apply(100, TimeUnit.MILLISECONDS)); - fail("Expected PrimaryNotFoundException"); - } catch(PrimaryNotFoundException e){ - - } - - Future cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); - - assertNull(cached); + testFindPrimaryExceptions(new PrimaryNotFoundException("not found")); } @Test public void testFindPrimaryShardAsyncActorNotInitialized() throws Exception { + testFindPrimaryExceptions(new NotInitializedException("not initialized")); + } - TestActorRef shardManager = - TestActorRef.create(getSystem(), Props.create(MessageCollectorActor.class)); - - DatastoreContext dataStoreContext = DatastoreContext.newBuilder().dataStoreType("config"). - shardLeaderElectionTimeout(100, TimeUnit.MILLISECONDS).build(); - - ActorContext actorContext = - new ActorContext(getSystem(), shardManager, mock(ClusterWrapper.class), - mock(Configuration.class), dataStoreContext) { - @Override - protected Future doAsk(ActorRef actorRef, Object message, Timeout timeout) { - return Futures.successful((Object) new NotInitializedException("not iniislized")); - } - }; + private void testFindPrimaryExceptions(final Object expectedException) throws Exception { + TestActorRef shardManager = + TestActorRef.create(getSystem(), Props.create(MessageCollectorActor.class)); + DatastoreContext dataStoreContext = DatastoreContext.newBuilder().dataStoreType("config"). + shardLeaderElectionTimeout(100, TimeUnit.MILLISECONDS).build(); - Future foobar = actorContext.findPrimaryShardAsync("foobar"); + ActorContext actorContext = + new ActorContext(getSystem(), shardManager, mock(ClusterWrapper.class), + mock(Configuration.class), dataStoreContext, new PrimaryShardInfoFutureCache()) { + @Override + protected Future doAsk(ActorRef actorRef, Object message, Timeout timeout) { + return Futures.successful(expectedException); + } + }; - try { - Await.result(foobar, Duration.apply(100, TimeUnit.MILLISECONDS)); - fail("Expected NotInitializedException"); - } catch(NotInitializedException e){ + Future foobar = actorContext.findPrimaryShardAsync("foobar"); + try { + Await.result(foobar, Duration.apply(100, TimeUnit.MILLISECONDS)); + fail("Expected" + expectedException.getClass().toString()); + } catch(Exception e){ + if(!expectedException.getClass().isInstance(e)) { + fail("Expected Exception of type " + expectedException.getClass().toString()); } + } - Future cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); + Future cached = actorContext.getPrimaryShardInfoCache().getIfPresent("foobar"); - assertNull(cached); + assertNull(cached); } @Test @@ -567,8 +521,10 @@ public class ActorContextTest extends AbstractActorTest{ TestActorRef shardManagerActorRef = TestActorRef.create(getSystem(), MockShardManager.props()); MockShardManager shardManagerActor = shardManagerActorRef.underlyingActor(); - shardManagerActor.addFindPrimaryResp("shard1", new RemotePrimaryShardFound(shardActorRef1.path().toString())); - shardManagerActor.addFindPrimaryResp("shard2", new RemotePrimaryShardFound(shardActorRef2.path().toString())); + shardManagerActor.addFindPrimaryResp("shard1", new RemotePrimaryShardFound(shardActorRef1.path().toString(), + DataStoreVersions.CURRENT_VERSION)); + shardManagerActor.addFindPrimaryResp("shard2", new RemotePrimaryShardFound(shardActorRef2.path().toString(), + DataStoreVersions.CURRENT_VERSION)); shardManagerActor.addFindPrimaryResp("shard3", new NoShardLeaderException("not found")); Configuration mockConfig = mock(Configuration.class); @@ -577,7 +533,7 @@ public class ActorContextTest extends AbstractActorTest{ ActorContext actorContext = new ActorContext(getSystem(), shardManagerActorRef, mock(ClusterWrapper.class), mockConfig, - DatastoreContext.newBuilder().shardInitializationTimeout(200, TimeUnit.MILLISECONDS).build()); + DatastoreContext.newBuilder().shardInitializationTimeout(200, TimeUnit.MILLISECONDS).build(), new PrimaryShardInfoFutureCache()); actorContext.broadcast(new TestMessage());