X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDataTreeChangeListenerProxyTest.java;h=558171ebbe4aa929b1dcf89b74a57f893646bb3c;hb=9905bf0575ff196a531eb114e89b1bdb7226bc6c;hp=c66c3cd0aeb264291fad8aeddb3e3da7b68f1aad;hpb=5e7cf2452ef634dc934a3ea5a2dd95059fbab68c;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerProxyTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerProxyTest.java index c66c3cd0ae..558171ebbe 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerProxyTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/DataTreeChangeListenerProxyTest.java @@ -7,6 +7,9 @@ */ package org.opendaylight.controller.cluster.datastore; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; @@ -19,14 +22,15 @@ import akka.actor.Props; import akka.actor.Terminated; import akka.dispatch.ExecutionContexts; import akka.dispatch.Futures; -import akka.testkit.JavaTestKit; +import akka.testkit.javadsl.TestKit; import akka.util.Timeout; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.Uninterruptibles; +import java.time.Duration; import java.util.concurrent.TimeUnit; -import org.junit.Assert; import org.junit.Test; import org.mockito.stubbing.Answer; +import org.opendaylight.controller.cluster.common.actor.Dispatchers; import org.opendaylight.controller.cluster.datastore.config.Configuration; import org.opendaylight.controller.cluster.datastore.exceptions.NotInitializedException; import org.opendaylight.controller.cluster.datastore.messages.CloseDataTreeNotificationListenerRegistration; @@ -36,228 +40,206 @@ import org.opendaylight.controller.cluster.datastore.messages.LocalShardNotFound import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeChangeListener; import org.opendaylight.controller.cluster.datastore.messages.RegisterDataTreeNotificationListenerReply; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; -import org.opendaylight.controller.cluster.datastore.utils.Dispatchers; import org.opendaylight.controller.cluster.raft.utils.DoNothingActor; import org.opendaylight.controller.md.cluster.datastore.model.TestModel; -import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener; +import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; +import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import scala.concurrent.ExecutionContextExecutor; import scala.concurrent.Future; -import scala.concurrent.duration.FiniteDuration; public class DataTreeChangeListenerProxyTest extends AbstractActorTest { private final DOMDataTreeChangeListener mockListener = mock(DOMDataTreeChangeListener.class); @Test(timeout = 10000) public void testSuccessfulRegistration() { - new JavaTestKit(getSystem()) { - { - ActorContext actorContext = new ActorContext(getSystem(), getRef(), mock(ClusterWrapper.class), - mock(Configuration.class)); + final TestKit kit = new TestKit(getSystem()); + ActorContext actorContext = new ActorContext(getSystem(), kit.getRef(), mock(ClusterWrapper.class), + mock(Configuration.class)); - final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); - final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( - actorContext, mockListener, path); + final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); + final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( + actorContext, mockListener, path); - new Thread(() -> proxy.init("shard-1")).start(); + new Thread(() -> proxy.init("shard-1")).start(); - FiniteDuration timeout = duration("5 seconds"); - FindLocalShard findLocalShard = expectMsgClass(timeout, FindLocalShard.class); - Assert.assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); + Duration timeout = Duration.ofSeconds(5); + FindLocalShard findLocalShard = kit.expectMsgClass(timeout, FindLocalShard.class); + assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); - reply(new LocalShardFound(getRef())); + kit.reply(new LocalShardFound(kit.getRef())); - RegisterDataTreeChangeListener registerMsg = expectMsgClass(timeout, - RegisterDataTreeChangeListener.class); - Assert.assertEquals("getPath", path, registerMsg.getPath()); - Assert.assertEquals("isRegisterOnAllInstances", false, registerMsg.isRegisterOnAllInstances()); + RegisterDataTreeChangeListener registerMsg = kit.expectMsgClass(timeout, + RegisterDataTreeChangeListener.class); + assertEquals("getPath", path, registerMsg.getPath()); + assertFalse("isRegisterOnAllInstances", registerMsg.isRegisterOnAllInstances()); - reply(new RegisterDataTreeNotificationListenerReply(getRef())); + kit.reply(new RegisterDataTreeNotificationListenerReply(kit.getRef())); - for (int i = 0; i < 20 * 5 && proxy.getListenerRegistrationActor() == null; i++) { - Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS); - } + for (int i = 0; i < 20 * 5 && proxy.getListenerRegistrationActor() == null; i++) { + Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS); + } - Assert.assertEquals("getListenerRegistrationActor", getSystem().actorSelection(getRef().path()), - proxy.getListenerRegistrationActor()); + assertEquals("getListenerRegistrationActor", getSystem().actorSelection(kit.getRef().path()), + proxy.getListenerRegistrationActor()); - watch(proxy.getDataChangeListenerActor()); + kit.watch(proxy.getDataChangeListenerActor()); - proxy.close(); + proxy.close(); - // The listener registration actor should get a Close message - expectMsgClass(timeout, CloseDataTreeNotificationListenerRegistration.class); + // The listener registration actor should get a Close message + kit.expectMsgClass(timeout, CloseDataTreeNotificationListenerRegistration.class); - // The DataChangeListener actor should be terminated - expectMsgClass(timeout, Terminated.class); + // The DataChangeListener actor should be terminated + kit.expectMsgClass(timeout, Terminated.class); - proxy.close(); + proxy.close(); - expectNoMsg(); - } - }; + kit.expectNoMessage(); } @Test(timeout = 10000) public void testSuccessfulRegistrationForClusteredListener() { - new JavaTestKit(getSystem()) { - { - ActorContext actorContext = new ActorContext(getSystem(), getRef(), mock(ClusterWrapper.class), - mock(Configuration.class)); + final TestKit kit = new TestKit(getSystem()); + ActorContext actorContext = new ActorContext(getSystem(), kit.getRef(), mock(ClusterWrapper.class), + mock(Configuration.class)); - ClusteredDOMDataTreeChangeListener mockClusteredListener = mock( - ClusteredDOMDataTreeChangeListener.class); + ClusteredDOMDataTreeChangeListener mockClusteredListener = mock( + ClusteredDOMDataTreeChangeListener.class); - final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); - final DataTreeChangeListenerProxy proxy = - new DataTreeChangeListenerProxy<>(actorContext, mockClusteredListener, path); + final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); + final DataTreeChangeListenerProxy proxy = + new DataTreeChangeListenerProxy<>(actorContext, mockClusteredListener, path); - new Thread(() -> proxy.init("shard-1")).start(); + new Thread(() -> proxy.init("shard-1")).start(); - FiniteDuration timeout = duration("5 seconds"); - FindLocalShard findLocalShard = expectMsgClass(timeout, FindLocalShard.class); - Assert.assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); + Duration timeout = Duration.ofSeconds(5); + FindLocalShard findLocalShard = kit.expectMsgClass(timeout, FindLocalShard.class); + assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); - reply(new LocalShardFound(getRef())); + kit.reply(new LocalShardFound(kit.getRef())); - RegisterDataTreeChangeListener registerMsg = expectMsgClass(timeout, - RegisterDataTreeChangeListener.class); - Assert.assertEquals("getPath", path, registerMsg.getPath()); - Assert.assertEquals("isRegisterOnAllInstances", true, registerMsg.isRegisterOnAllInstances()); + RegisterDataTreeChangeListener registerMsg = kit.expectMsgClass(timeout, + RegisterDataTreeChangeListener.class); + assertEquals("getPath", path, registerMsg.getPath()); + assertTrue("isRegisterOnAllInstances", registerMsg.isRegisterOnAllInstances()); - proxy.close(); - } - }; + proxy.close(); } @Test(timeout = 10000) public void testLocalShardNotFound() { - new JavaTestKit(getSystem()) { - { - ActorContext actorContext = new ActorContext(getSystem(), getRef(), mock(ClusterWrapper.class), - mock(Configuration.class)); + final TestKit kit = new TestKit(getSystem()); + ActorContext actorContext = new ActorContext(getSystem(), kit.getRef(), mock(ClusterWrapper.class), + mock(Configuration.class)); - final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); - final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( - actorContext, mockListener, path); + final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); + final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( + actorContext, mockListener, path); - new Thread(() -> proxy.init("shard-1")).start(); + new Thread(() -> proxy.init("shard-1")).start(); - FiniteDuration timeout = duration("5 seconds"); - FindLocalShard findLocalShard = expectMsgClass(timeout, FindLocalShard.class); - Assert.assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); + Duration timeout = Duration.ofSeconds(5); + FindLocalShard findLocalShard = kit.expectMsgClass(timeout, FindLocalShard.class); + assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); - reply(new LocalShardNotFound("shard-1")); + kit.reply(new LocalShardNotFound("shard-1")); - expectNoMsg(duration("1 seconds")); + kit.expectNoMessage(Duration.ofSeconds(1)); - proxy.close(); - } - }; + proxy.close(); } @Test(timeout = 10000) public void testLocalShardNotInitialized() { - new JavaTestKit(getSystem()) { - { - ActorContext actorContext = new ActorContext(getSystem(), getRef(), mock(ClusterWrapper.class), - mock(Configuration.class)); + final TestKit kit = new TestKit(getSystem()); + ActorContext actorContext = new ActorContext(getSystem(), kit.getRef(), mock(ClusterWrapper.class), + mock(Configuration.class)); - final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); - final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( - actorContext, mockListener, path); + final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); + final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( + actorContext, mockListener, path); - new Thread(() -> proxy.init("shard-1")).start(); + new Thread(() -> proxy.init("shard-1")).start(); - FiniteDuration timeout = duration("5 seconds"); - FindLocalShard findLocalShard = expectMsgClass(timeout, FindLocalShard.class); - Assert.assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); + Duration timeout = Duration.ofSeconds(5); + FindLocalShard findLocalShard = kit.expectMsgClass(timeout, FindLocalShard.class); + assertEquals("getShardName", "shard-1", findLocalShard.getShardName()); - reply(new NotInitializedException("not initialized")); + kit.reply(new NotInitializedException("not initialized")); - new Within(duration("1 seconds")) { - @Override - protected void run() { - expectNoMsg(); - } - }; + kit.within(Duration.ofSeconds(1), () -> { + kit.expectNoMessage(); + return null; + }); - proxy.close(); - } - }; + proxy.close(); } @Test public void testFailedRegistration() { - new JavaTestKit(getSystem()) { - { - ActorSystem mockActorSystem = mock(ActorSystem.class); + final TestKit kit = new TestKit(getSystem()); + ActorSystem mockActorSystem = mock(ActorSystem.class); - ActorRef mockActor = getSystem().actorOf(Props.create(DoNothingActor.class), "testFailedRegistration"); - doReturn(mockActor).when(mockActorSystem).actorOf(any(Props.class)); - ExecutionContextExecutor executor = ExecutionContexts.fromExecutor(MoreExecutors.directExecutor()); + ActorRef mockActor = getSystem().actorOf(Props.create(DoNothingActor.class), "testFailedRegistration"); + doReturn(mockActor).when(mockActorSystem).actorOf(any(Props.class)); + ExecutionContextExecutor executor = ExecutionContexts.fromExecutor(MoreExecutors.directExecutor()); - ActorContext actorContext = mock(ActorContext.class); - final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); + ActorContext actorContext = mock(ActorContext.class); + final YangInstanceIdentifier path = YangInstanceIdentifier.of(TestModel.TEST_QNAME); - doReturn(executor).when(actorContext).getClientDispatcher(); - doReturn(DatastoreContext.newBuilder().build()).when(actorContext).getDatastoreContext(); - doReturn(mockActorSystem).when(actorContext).getActorSystem(); + doReturn(executor).when(actorContext).getClientDispatcher(); + doReturn(DatastoreContext.newBuilder().build()).when(actorContext).getDatastoreContext(); + doReturn(mockActorSystem).when(actorContext).getActorSystem(); - String shardName = "shard-1"; - final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( - actorContext, mockListener, path); + String shardName = "shard-1"; + final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( + actorContext, mockListener, path); - doReturn(duration("5 seconds")).when(actorContext).getOperationDuration(); - doReturn(Futures.successful(getRef())).when(actorContext).findLocalShardAsync(eq(shardName)); - doReturn(Futures.failed(new RuntimeException("mock"))).when(actorContext) - .executeOperationAsync(any(ActorRef.class), any(Object.class), any(Timeout.class)); - doReturn(mock(DatastoreContext.class)).when(actorContext).getDatastoreContext(); + doReturn(kit.duration("5 seconds")).when(actorContext).getOperationDuration(); + doReturn(Futures.successful(kit.getRef())).when(actorContext).findLocalShardAsync(eq(shardName)); + doReturn(Futures.failed(new RuntimeException("mock"))).when(actorContext).executeOperationAsync( + any(ActorRef.class), any(Object.class), any(Timeout.class)); + doReturn(mock(DatastoreContext.class)).when(actorContext).getDatastoreContext(); - proxy.init("shard-1"); + proxy.init("shard-1"); - Assert.assertEquals("getListenerRegistrationActor", null, proxy.getListenerRegistrationActor()); + assertEquals("getListenerRegistrationActor", null, proxy.getListenerRegistrationActor()); - proxy.close(); - } - }; + proxy.close(); } @Test public void testCloseBeforeRegistration() { - new JavaTestKit(getSystem()) { - { - ActorContext actorContext = mock(ActorContext.class); - - String shardName = "shard-1"; - - doReturn(DatastoreContext.newBuilder().build()).when(actorContext).getDatastoreContext(); - doReturn(getSystem().dispatchers().defaultGlobalDispatcher()).when(actorContext).getClientDispatcher(); - doReturn(getSystem()).when(actorContext).getActorSystem(); - doReturn(Dispatchers.DEFAULT_DISPATCHER_PATH).when(actorContext).getNotificationDispatcherPath(); - doReturn(getSystem().actorSelection(getRef().path())).when(actorContext) - .actorSelection(getRef().path()); - doReturn(duration("5 seconds")).when(actorContext).getOperationDuration(); - doReturn(Futures.successful(getRef())).when(actorContext).findLocalShardAsync(eq(shardName)); - - final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( - actorContext, mockListener, YangInstanceIdentifier.of(TestModel.TEST_QNAME)); - - Answer> answer = invocation -> { - proxy.close(); - return Futures.successful((Object) new RegisterDataTreeNotificationListenerReply(getRef())); - }; + final TestKit kit = new TestKit(getSystem()); + ActorContext actorContext = mock(ActorContext.class); + + String shardName = "shard-1"; + + doReturn(DatastoreContext.newBuilder().build()).when(actorContext).getDatastoreContext(); + doReturn(getSystem().dispatchers().defaultGlobalDispatcher()).when(actorContext).getClientDispatcher(); + doReturn(getSystem()).when(actorContext).getActorSystem(); + doReturn(Dispatchers.DEFAULT_DISPATCHER_PATH).when(actorContext).getNotificationDispatcherPath(); + doReturn(getSystem().actorSelection(kit.getRef().path())).when(actorContext).actorSelection( + kit.getRef().path()); + doReturn(kit.duration("5 seconds")).when(actorContext).getOperationDuration(); + doReturn(Futures.successful(kit.getRef())).when(actorContext).findLocalShardAsync(eq(shardName)); + + final DataTreeChangeListenerProxy proxy = new DataTreeChangeListenerProxy<>( + actorContext, mockListener, YangInstanceIdentifier.of(TestModel.TEST_QNAME)); + + Answer> answer = invocation -> { + proxy.close(); + return Futures.successful((Object) new RegisterDataTreeNotificationListenerReply(kit.getRef())); + }; - doAnswer(answer).when(actorContext).executeOperationAsync(any(ActorRef.class), any(Object.class), - any(Timeout.class)); + doAnswer(answer).when(actorContext).executeOperationAsync(any(ActorRef.class), any(Object.class), + any(Timeout.class)); - proxy.init(shardName); + proxy.init(shardName); - expectMsgClass(duration("5 seconds"), CloseDataTreeNotificationListenerRegistration.class); + kit.expectMsgClass(Duration.ofSeconds(5), CloseDataTreeNotificationListenerRegistration.class); - Assert.assertEquals("getListenerRegistrationActor", null, proxy.getListenerRegistrationActor()); - } - }; + assertEquals("getListenerRegistrationActor", null, proxy.getListenerRegistrationActor()); } }