/* * Copyright (c) 2015 Brocade Communications 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.entityownership; import static org.junit.Assert.assertEquals; import static org.opendaylight.controller.cluster.entityownership.EntityOwnersModel.ENTITY_OWNERS_PATH; import static org.opendaylight.controller.cluster.entityownership.EntityOwnersModel.candidatePath; import static org.opendaylight.controller.cluster.entityownership.EntityOwnersModel.entityOwnersWithCandidate; import static org.opendaylight.controller.cluster.entityownership.EntityOwnersModel.entityPath; import akka.testkit.javadsl.TestKit; import com.google.common.collect.ImmutableSet; import java.time.Duration; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.opendaylight.controller.cluster.datastore.AbstractActorTest; import org.opendaylight.controller.cluster.datastore.Shard; import org.opendaylight.controller.cluster.datastore.ShardDataTree; import org.opendaylight.controller.cluster.entityownership.messages.CandidateAdded; import org.opendaylight.controller.cluster.entityownership.messages.CandidateRemoved; 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 CandidateListChangeListener. * * @author Thomas Pantelis */ public class CandidateListChangeListenerTest extends AbstractActorTest { private static final String ENTITY_TYPE = "test"; private static final YangInstanceIdentifier ENTITY_ID1 = 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 ShardDataTree shardDataTree; @Mock private Shard mockShard; @Before public void setup() { MockitoAnnotations.initMocks(this); shardDataTree = new ShardDataTree(mockShard, EOSTestUtils.SCHEMA_CONTEXT, TreeType.OPERATIONAL); } @Test public void testOnDataTreeChanged() throws Exception { TestKit kit = new TestKit(getSystem()); new CandidateListChangeListener(kit.getRef(), "test").init(shardDataTree); String memberName1 = "member-1"; writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, memberName1)); CandidateAdded candidateAdded = kit.expectMsgClass(CandidateAdded.class); assertEquals("getEntityId", entityPath(ENTITY_TYPE, ENTITY_ID1), candidateAdded.getEntityPath()); assertEquals("getNewCandidate", memberName1, candidateAdded.getNewCandidate()); assertEquals("getAllCandidates", ImmutableSet.of(memberName1), ImmutableSet.copyOf(candidateAdded.getAllCandidates())); writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, memberName1)); kit.expectNoMessage(Duration.ofMillis(500)); String memberName2 = "member-2"; writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID1, memberName2)); candidateAdded = kit.expectMsgClass(CandidateAdded.class); assertEquals("getEntityId", entityPath(ENTITY_TYPE, ENTITY_ID1), candidateAdded.getEntityPath()); assertEquals("getNewCandidate", memberName2, candidateAdded.getNewCandidate()); assertEquals("getAllCandidates", ImmutableSet.of(memberName1, memberName2), ImmutableSet.copyOf(candidateAdded.getAllCandidates())); writeNode(ENTITY_OWNERS_PATH, entityOwnersWithCandidate(ENTITY_TYPE, ENTITY_ID2, memberName1)); candidateAdded = kit.expectMsgClass(CandidateAdded.class); assertEquals("getEntityId", entityPath(ENTITY_TYPE, ENTITY_ID2), candidateAdded.getEntityPath()); assertEquals("getNewCandidate", memberName1, candidateAdded.getNewCandidate()); assertEquals("getAllCandidates", ImmutableSet.of(memberName1), ImmutableSet.copyOf(candidateAdded.getAllCandidates())); deleteNode(candidatePath(ENTITY_TYPE, ENTITY_ID1, memberName1)); CandidateRemoved candidateRemoved = kit.expectMsgClass(CandidateRemoved.class); assertEquals("getEntityId", entityPath(ENTITY_TYPE, ENTITY_ID1), candidateRemoved.getEntityPath()); assertEquals("getRemovedCandidate", memberName1, candidateRemoved.getRemovedCandidate()); assertEquals("getRemainingCandidates", ImmutableSet.of(memberName2), ImmutableSet.copyOf(candidateRemoved.getRemainingCandidates())); deleteNode(candidatePath(ENTITY_TYPE, ENTITY_ID1, memberName2)); candidateRemoved = kit.expectMsgClass(CandidateRemoved.class); assertEquals("getEntityId", entityPath(ENTITY_TYPE, ENTITY_ID1), candidateRemoved.getEntityPath()); assertEquals("getRemovedCandidate", memberName2, candidateRemoved.getRemovedCandidate()); assertEquals("getRemainingCandidates", ImmutableSet.of(), ImmutableSet.copyOf(candidateRemoved.getRemainingCandidates())); } private void writeNode(final YangInstanceIdentifier path, final NormalizedNode node) throws DataValidationFailedException { AbstractEntityOwnershipTest.writeNode(path, node, shardDataTree); } private void deleteNode(final YangInstanceIdentifier path) throws DataValidationFailedException { AbstractEntityOwnershipTest.deleteNode(path, shardDataTree); } }