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%2Fentityownership%2FEntityOwnerChangeListenerTest.java;h=a8b3a677408c87554a20589f7b308298b20e2e3a;hb=12fcdfe39aa26dcba7fd3bb4d4c68e3d02e65c51;hp=e87b406f3903df3637486762c842dbd58478b2b9;hpb=00e97ff87662959a39218b47bac904235003dc8d;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnerChangeListenerTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnerChangeListenerTest.java index e87b406f39..a8b3a67740 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnerChangeListenerTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/entityownership/EntityOwnerChangeListenerTest.java @@ -17,15 +17,20 @@ import static org.opendaylight.controller.cluster.datastore.entityownership.Enti import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.entityEntryWithOwner; import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.entityOwnersWithCandidate; import static org.opendaylight.controller.cluster.datastore.entityownership.EntityOwnersModel.entityPath; + import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; +import org.opendaylight.controller.cluster.access.concepts.MemberName; +import org.opendaylight.controller.cluster.datastore.Shard; import org.opendaylight.controller.cluster.datastore.ShardDataTree; import org.opendaylight.controller.md.cluster.datastore.model.SchemaContextHelper; -import org.opendaylight.controller.md.sal.common.api.clustering.Entity; +import org.opendaylight.mdsal.eos.dom.api.DOMEntity; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; +import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType; /** * Unit tests for EntityOwnerChangeListener. @@ -41,57 +46,99 @@ public class EntityOwnerChangeListenerTest { YangInstanceIdentifier.of(QName.create("test", "2015-08-14", "entity1")); private static final YangInstanceIdentifier ENTITY_ID2 = YangInstanceIdentifier.of(QName.create("test", "2015-08-14", "entity2")); - private static final Entity ENTITY1 = new Entity(ENTITY_TYPE, ENTITY_ID1); - private static final Entity ENTITY2 = new Entity(ENTITY_TYPE, ENTITY_ID2); + private static final DOMEntity ENTITY1 = new DOMEntity(ENTITY_TYPE, ENTITY_ID1); + private static final DOMEntity ENTITY2 = new DOMEntity(ENTITY_TYPE, ENTITY_ID2); + + private final Shard mockShard = Mockito.mock(Shard.class); - private final ShardDataTree shardDataTree = new ShardDataTree(SchemaContextHelper.entityOwners()); + private final ShardDataTree shardDataTree = new ShardDataTree(mockShard, SchemaContextHelper.entityOwners(), + TreeType.OPERATIONAL); private final EntityOwnershipListenerSupport mockListenerSupport = mock(EntityOwnershipListenerSupport.class); private EntityOwnerChangeListener listener; @Before public void setup() { - listener = new EntityOwnerChangeListener(LOCAL_MEMBER_NAME, mockListenerSupport); + listener = new EntityOwnerChangeListener(MemberName.forName(LOCAL_MEMBER_NAME), mockListenerSupport); listener.init(shardDataTree); } @Test - public void testOnDataChanged() throws Exception { + public void testOnDataTreeChanged() throws Exception { writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, LOCAL_MEMBER_NAME)); writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID2, LOCAL_MEMBER_NAME)); - writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, REMOTE_MEMBER_NAME1)); + verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(DOMEntity.class), anyBoolean(), + anyBoolean(), anyBoolean()); - verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(Entity.class), anyBoolean(), anyBoolean()); + // Write local member as owner for entity 1 writeNode(entityPath(ENTITY_TYPE, ENTITY_ID1), entityEntryWithOwner(ENTITY_ID1, LOCAL_MEMBER_NAME)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, true, true); + + // Add remote member 1 as candidate for entity 1 - listener support should not get notified + + reset(mockListenerSupport); + writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, REMOTE_MEMBER_NAME1)); + verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(DOMEntity.class), anyBoolean(), + anyBoolean(), anyBoolean()); - verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, true); + // Change owner to remote member 1 for entity 1 reset(mockListenerSupport); writeNode(entityPath(ENTITY_TYPE, ENTITY_ID1), entityEntryWithOwner(ENTITY_ID1, REMOTE_MEMBER_NAME1)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, true, false, true); - verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, true, false); + // Change owner to remote member 2 for entity 1 reset(mockListenerSupport); writeNode(entityPath(ENTITY_TYPE, ENTITY_ID1), entityEntryWithOwner(ENTITY_ID1, REMOTE_MEMBER_NAME2)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, false, true); + + // Clear the owner for entity 1 + + reset(mockListenerSupport); + writeNode(entityPath(ENTITY_TYPE, ENTITY_ID1), entityEntryWithOwner(ENTITY_ID1, "")); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, false, false); - verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(Entity.class), anyBoolean(), anyBoolean()); + // Change owner to the local member for entity 1 writeNode(entityPath(ENTITY_TYPE, ENTITY_ID1), entityEntryWithOwner(ENTITY_ID1, LOCAL_MEMBER_NAME)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, true, true); - verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY1, false, true); + // Change owner to remote member 2 for entity 2 reset(mockListenerSupport); writeNode(entityPath(ENTITY_TYPE, ENTITY_ID2), entityEntryWithOwner(ENTITY_ID2, REMOTE_MEMBER_NAME1)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY2, false, false, true); - verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(Entity.class), anyBoolean(), anyBoolean()); + // Change owner to the local member for entity 2 reset(mockListenerSupport); writeNode(entityPath(ENTITY_TYPE, ENTITY_ID2), entityEntryWithOwner(ENTITY_ID2, LOCAL_MEMBER_NAME)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY2, false, true, true); - verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY2, false, true); + // Write local member owner for entity 2 again - expect no change + + reset(mockListenerSupport); + writeNode(entityPath(ENTITY_TYPE, ENTITY_ID2), entityEntryWithOwner(ENTITY_ID2, LOCAL_MEMBER_NAME)); + verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(DOMEntity.class), anyBoolean(), + anyBoolean(), anyBoolean()); + + // Clear the owner for entity 2 + + reset(mockListenerSupport); + writeNode(entityPath(ENTITY_TYPE, ENTITY_ID2), entityEntryWithOwner(ENTITY_ID2, null)); + verify(mockListenerSupport).notifyEntityOwnershipListeners(ENTITY2, true, false, false); + + // Clear the owner for entity 2 again - expect no change + + reset(mockListenerSupport); + writeNode(entityPath(ENTITY_TYPE, ENTITY_ID2), entityEntryWithOwner(ENTITY_ID2, null)); + verify(mockListenerSupport, never()).notifyEntityOwnershipListeners(any(DOMEntity.class), anyBoolean(), + anyBoolean(), anyBoolean()); } - private void writeNode(YangInstanceIdentifier path, NormalizedNode node) throws DataValidationFailedException { + private void writeNode(final YangInstanceIdentifier path, final NormalizedNode node) + throws DataValidationFailedException { AbstractEntityOwnershipTest.writeNode(path, node, shardDataTree); } }