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%2Fentityownership%2FEntityOwnershipListenerSupportTest.java;h=9e41757be19d8c1e24ca8fe0e7e3a897d169ed8c;hp=dbc5c2c0c0a2fc77c86709079ea26c4b79e7d5a7;hb=16263ee5c532e75ca6f14ed5fa9053a38694af14;hpb=c38bb5d90ebdb8e867cecc5b0dea0bfafe8ae621 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupportTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupportTest.java index dbc5c2c0c0..9e41757be1 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupportTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnershipListenerSupportTest.java @@ -8,24 +8,26 @@ package org.opendaylight.controller.cluster.datastore.entityownership; import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; +import akka.actor.ActorContext; import akka.actor.ActorRef; import akka.actor.Props; -import akka.actor.UntypedActorContext; import akka.testkit.JavaTestKit; import akka.testkit.TestActorRef; -import com.google.common.util.concurrent.Uninterruptibles; -import java.util.concurrent.TimeUnit; +import java.util.ArrayList; +import java.util.List; import org.junit.After; +import org.junit.Before; import org.junit.Test; -import org.opendaylight.controller.cluster.datastore.AbstractActorTest; import org.opendaylight.controller.cluster.raft.TestActorFactory; import org.opendaylight.controller.cluster.raft.utils.DoNothingActor; import org.opendaylight.controller.md.sal.common.api.clustering.Entity; +import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange; import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -37,8 +39,17 @@ import scala.collection.immutable.Iterable; * * @author Thomas Pantelis */ -public class EntityOwnershipListenerSupportTest extends AbstractActorTest { +public class EntityOwnershipListenerSupportTest extends AbstractEntityOwnershipTest { private final TestActorFactory actorFactory = new TestActorFactory(getSystem()); + private ActorContext actorContext; + + @Before + public void setup() { + TestActorRef actor = actorFactory.createTestActor( + Props.create(DoNothingActor.class), actorFactory.generateActorId("test")); + + actorContext = actor.underlyingActor().getContext(); + } @After public void tearDown() { @@ -47,96 +58,120 @@ public class EntityOwnershipListenerSupportTest extends AbstractActorTest { @Test public void testNotifyEntityOwnershipListeners() { - TestActorRef actor = actorFactory.createTestActor( - Props.create(DoNothingActor.class), actorFactory.generateActorId("test")); - - UntypedActorContext actorContext = actor.underlyingActor().getContext(); - EntityOwnershipListenerSupport support = new EntityOwnershipListenerSupport(actorContext); + EntityOwnershipListenerSupport support = new EntityOwnershipListenerSupport(actorContext, "test"); EntityOwnershipListener mockListener1 = mock(EntityOwnershipListener.class, "EntityOwnershipListener1"); EntityOwnershipListener mockListener2 = mock(EntityOwnershipListener.class, "EntityOwnershipListener2"); - Entity entity1 = new Entity("test", YangInstanceIdentifier.of(QName.create("test", "id1"))); - Entity entity2 = new Entity("test", YangInstanceIdentifier.of(QName.create("test", "id2"))); + EntityOwnershipListener mockListener1_2 = mock(EntityOwnershipListener.class, "EntityOwnershipListener1_2"); + String entityType1 = "type1"; + String entityType2 = "type2"; + Entity entity1 = new Entity(entityType1, YangInstanceIdentifier.of(QName.create("test", "id1"))); + Entity entity2 = new Entity(entityType2, YangInstanceIdentifier.of(QName.create("test", "id2"))); + Entity entity3 = new Entity("noListener", YangInstanceIdentifier.of(QName.create("test", "id5"))); // Add EntityOwnershipListener registrations. - support.addEntityOwnershipListener(entity1, mockListener1); - support.addEntityOwnershipListener(entity2, mockListener1); - support.addEntityOwnershipListener(entity1, mockListener2); + support.addEntityOwnershipListener(entityType1, mockListener1); + support.addEntityOwnershipListener(entityType1, mockListener1); // register again - should be noop + support.addEntityOwnershipListener(entityType1, mockListener1_2); + support.addEntityOwnershipListener(entityType2, mockListener2); - // Notify entity1 changed and verify both listeners are notified. + // Notify entity1 changed and verify appropriate listeners are notified. - support.notifyEntityOwnershipListeners(entity1, false, true); + support.notifyEntityOwnershipListeners(entity1, false, true, true); - verify(mockListener1, timeout(5000)).ownershipChanged(entity1, false, true); - verify(mockListener2, timeout(5000)).ownershipChanged(entity1, false, true); + verify(mockListener1, timeout(5000)).ownershipChanged(ownershipChange(entity1, false, true, true)); + verify(mockListener1_2, timeout(5000)).ownershipChanged(ownershipChange(entity1, false, true, true)); + verify(mockListener2, timeout(300).never()).ownershipChanged(any(EntityOwnershipChange.class)); assertEquals("# of listener actors", 2, actorContext.children().size()); + reset(mockListener1, mockListener2, mockListener1_2); - // Notify entity2 changed and verify only mockListener1 is notified. + // Notify entity2 changed and verify appropriate listeners are notified. - support.notifyEntityOwnershipListeners(entity2, false, true); + support.notifyEntityOwnershipListeners(entity2, false, true, true); - verify(mockListener1, timeout(5000)).ownershipChanged(entity2, false, true); - verify(mockListener2, never()).ownershipChanged(entity2, false, true); - assertEquals("# of listener actors", 2, actorContext.children().size()); + verify(mockListener2, timeout(5000)).ownershipChanged(ownershipChange(entity2, false, true, true)); + verify(mockListener1, timeout(300).never()).ownershipChanged(any(EntityOwnershipChange.class)); + verify(mockListener1_2, never()).ownershipChanged(any(EntityOwnershipChange.class)); + assertEquals("# of listener actors", 3, actorContext.children().size()); + reset(mockListener1, mockListener2, mockListener1_2); - // Notify entity3 changed and verify neither listener is notified. + // Notify entity3 changed and verify no listeners are notified. - Entity entity3 = new Entity("test", YangInstanceIdentifier.of(QName.create("test", "id3"))); - support.notifyEntityOwnershipListeners(entity3, false, true); + support.notifyEntityOwnershipListeners(entity3, true, false, true); - Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS); + verify(mockListener1, timeout(300).never()).ownershipChanged(any(EntityOwnershipChange.class)); + verify(mockListener2, never()).ownershipChanged(any(EntityOwnershipChange.class)); + verify(mockListener1_2, never()).ownershipChanged(any(EntityOwnershipChange.class)); + reset(mockListener1, mockListener2, mockListener1_2); - verify(mockListener1, never()).ownershipChanged(entity3, false, true); - verify(mockListener2, never()).ownershipChanged(entity3, false, true); + Iterable listenerActors = actorContext.children(); + assertEquals("# of listener actors", 3, listenerActors.size()); - reset(mockListener1, mockListener2); + // Unregister mockListener1, issue a change for entity1 and verify only remaining listeners are notified. - // Unregister mockListener1 for entity1, issue a change and verify only mockListener2 is notified. + support.removeEntityOwnershipListener(entityType1, mockListener1); + support.notifyEntityOwnershipListeners(entity1, true, false, true); - support.removeEntityOwnershipListener(entity1, mockListener1); + verify(mockListener1_2, timeout(5000)).ownershipChanged(ownershipChange(entity1, true, false, true)); + verify(mockListener1, timeout(300).never()).ownershipChanged(any(EntityOwnershipChange.class)); + reset(mockListener1, mockListener2, mockListener1_2); - support.notifyEntityOwnershipListeners(entity1, false, true); + // Unregister all listeners and verify their listener actors are destroyed. - verify(mockListener2, timeout(5000)).ownershipChanged(entity1, false, true); - verify(mockListener1, never()).ownershipChanged(entity1, false, true); + List watchers = new ArrayList<>(); + for(Iterator iter = listenerActors.iterator(); iter.hasNext();) { + JavaTestKit kit = new JavaTestKit(getSystem()); + kit.watch(iter.next()); + watchers.add(kit); + } - // Completely unregister both listeners and verify their listener actors are destroyed. - - Iterable listenerActors = actorContext.children(); - assertEquals("# of listener actors", 2, listenerActors.size()); + support.removeEntityOwnershipListener(entityType1, mockListener1_2); + support.removeEntityOwnershipListener(entityType1, mockListener1_2); // un-register again - should be noop + support.removeEntityOwnershipListener(entityType2, mockListener2); Iterator iter = listenerActors.iterator(); - ActorRef listenerActor1 = iter.next(); - ActorRef listenerActor2 = iter.next(); + for(JavaTestKit kit: watchers) { + kit.expectTerminated(JavaTestKit.duration("3 seconds"), iter.next()); + } - JavaTestKit kit1 = new JavaTestKit(getSystem()); - kit1.watch(listenerActor1); + assertEquals("# of listener actors", 0, actorContext.children().size()); - JavaTestKit kit2 = new JavaTestKit(getSystem()); - kit2.watch(listenerActor2); + // Re-register mockListener1 and verify it is notified. - support.removeEntityOwnershipListener(entity2, mockListener1); - support.removeEntityOwnershipListener(entity1, mockListener2); + reset(mockListener1, mockListener2); - kit1.expectTerminated(JavaTestKit.duration("3 seconds"), listenerActor1); - kit2.expectTerminated(JavaTestKit.duration("3 seconds"), listenerActor2); - assertEquals("# of listener actors", 0, actorContext.children().size()); + support.addEntityOwnershipListener(entityType1, mockListener1); + support.notifyEntityOwnershipListeners(entity1, false, false, true); - // Re-register mockListener1 for entity1 and verify it is notified. + verify(mockListener1, timeout(5000)).ownershipChanged(ownershipChange(entity1, false, false, true)); + verify(mockListener1_2, never()).ownershipChanged(any(EntityOwnershipChange.class)); + verify(mockListener2, never()).ownershipChanged(any(EntityOwnershipChange.class)); - reset(mockListener1, mockListener2); + // Quickly register and unregister mockListener2 - expecting no exceptions. - support.addEntityOwnershipListener(entity1, mockListener1); + support.addEntityOwnershipListener(entityType1, mockListener2); + support.removeEntityOwnershipListener(entityType1, mockListener2); + } - support.notifyEntityOwnershipListeners(entity1, false, true); + @Test + public void testHasCandidateForEntity() { + EntityOwnershipListenerSupport support = new EntityOwnershipListenerSupport(actorContext, "test"); + Entity entity = new Entity("type", YangInstanceIdentifier.of(QName.create("test", "id"))); - verify(mockListener1, timeout(5000)).ownershipChanged(entity1, false, true); - verify(mockListener2, never()).ownershipChanged(entity2, false, true); + assertEquals("hasCandidateForEntity", false, support.hasCandidateForEntity(entity)); - // Quickly register and unregister mockListener2 - expecting no exceptions. + support.setHasCandidateForEntity(entity); + support.setHasCandidateForEntity(entity); // set again - should be noop + assertEquals("hasCandidateForEntity", true, support.hasCandidateForEntity(entity)); + + support.unsetHasCandidateForEntity(entity); + assertEquals("hasCandidateForEntity", false, support.hasCandidateForEntity(entity)); + + support.unsetHasCandidateForEntity(entity); // unset again - should be noop + assertEquals("hasCandidateForEntity", false, support.hasCandidateForEntity(entity)); - support.addEntityOwnershipListener(entity1, mockListener2); - support.removeEntityOwnershipListener(entity1, mockListener2); + support.setHasCandidateForEntity(entity); + assertEquals("hasCandidateForEntity", true, support.hasCandidateForEntity(entity)); } }