import com.google.common.base.Stopwatch;
import com.google.common.util.concurrent.Uninterruptibles;
import java.util.concurrent.TimeUnit;
+import org.hamcrest.Description;
import org.junit.Assert;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Matchers;
import org.opendaylight.controller.cluster.datastore.AbstractActorTest;
import org.opendaylight.controller.cluster.datastore.ShardDataTree;
+import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.EntityOwners;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.EntityType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.clustering.entity.owners.rev150804.entity.owners.entity.type.entity.Candidate;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
*/
public class AbstractEntityOwnershipTest extends AbstractActorTest {
protected void verifyEntityCandidate(NormalizedNode<?, ?> node, String entityType,
- YangInstanceIdentifier entityId, String candidateName) {
+ YangInstanceIdentifier entityId, String candidateName, boolean expectPresent) {
try {
assertNotNull("Missing " + EntityOwners.QNAME.toString(), node);
assertTrue(node instanceof ContainerNode);
ContainerNode entityOwnersNode = (ContainerNode) node;
MapEntryNode entityTypeEntry = getMapEntryNodeChild(entityOwnersNode, EntityType.QNAME,
- ENTITY_TYPE_QNAME, entityType);
+ ENTITY_TYPE_QNAME, entityType, true);
- MapEntryNode entityEntry = getMapEntryNodeChild(entityTypeEntry, ENTITY_QNAME, ENTITY_ID_QNAME, entityId);
+ MapEntryNode entityEntry = getMapEntryNodeChild(entityTypeEntry, ENTITY_QNAME, ENTITY_ID_QNAME,
+ entityId, true);
- getMapEntryNodeChild(entityEntry, Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName);
+ getMapEntryNodeChild(entityEntry, Candidate.QNAME, CANDIDATE_NAME_QNAME, candidateName, expectPresent);
} catch(AssertionError e) {
throw new AssertionError("Verification of entity candidate failed - returned data was: " + node, e);
}
}
protected void verifyEntityCandidate(String entityType, YangInstanceIdentifier entityId, String candidateName,
- Function<YangInstanceIdentifier,NormalizedNode<?,?>> reader) {
+ Function<YangInstanceIdentifier,NormalizedNode<?,?>> reader, boolean expectPresent) {
AssertionError lastError = null;
Stopwatch sw = Stopwatch.createStarted();
while(sw.elapsed(TimeUnit.MILLISECONDS) <= 5000) {
NormalizedNode<?, ?> node = reader.apply(ENTITY_OWNERS_PATH);
try {
- verifyEntityCandidate(node, entityType, entityId, candidateName);
+ verifyEntityCandidate(node, entityType, entityId, candidateName, expectPresent);
return;
} catch (AssertionError e) {
lastError = e;
throw lastError;
}
+ protected void verifyEntityCandidate(String entityType, YangInstanceIdentifier entityId, String candidateName,
+ Function<YangInstanceIdentifier,NormalizedNode<?,?>> reader) {
+ verifyEntityCandidate(entityType, entityId, candidateName, reader, true);
+ }
+
protected MapEntryNode getMapEntryNodeChild(DataContainerNode<? extends PathArgument> parent, QName childMap,
- QName child, Object key) {
+ QName child, Object key, boolean expectPresent) {
Optional<DataContainerChild<? extends PathArgument, ?>> childNode =
parent.getChild(new NodeIdentifier(childMap));
assertEquals("Missing " + childMap.toString(), true, childNode.isPresent());
MapNode entityTypeMapNode = (MapNode) childNode.get();
Optional<MapEntryNode> entityTypeEntry = entityTypeMapNode.getChild(new NodeIdentifierWithPredicates(
childMap, child, key));
- if(!entityTypeEntry.isPresent()) {
+ if(expectPresent && !entityTypeEntry.isPresent()) {
fail("Missing " + childMap.toString() + " entry for " + key + ". Actual: " + entityTypeMapNode.getValue());
+ } else if(!expectPresent && entityTypeEntry.isPresent()) {
+ fail("Found unexpected " + childMap.toString() + " entry for " + key);
}
- return entityTypeEntry.get();
+
+ return entityTypeEntry.isPresent() ? entityTypeEntry.get() : null;
}
static void verifyOwner(String expected, String entityType, YangInstanceIdentifier entityId,
static void writeNode(YangInstanceIdentifier path, NormalizedNode<?, ?> node, ShardDataTree shardDataTree)
throws DataValidationFailedException {
- DataTreeModification modification = shardDataTree.getDataTree().takeSnapshot().newModification();
+ DataTreeModification modification = shardDataTree.newModification();
modification.merge(path, node);
commit(shardDataTree, modification);
}
static void deleteNode(YangInstanceIdentifier path, ShardDataTree shardDataTree)
throws DataValidationFailedException {
- DataTreeModification modification = shardDataTree.getDataTree().takeSnapshot().newModification();
+ DataTreeModification modification = shardDataTree.newModification();
modification.delete(path);
commit(shardDataTree, modification);
}
static void commit(ShardDataTree shardDataTree, DataTreeModification modification)
throws DataValidationFailedException {
- modification.ready();
+ shardDataTree.notifyListeners(shardDataTree.commit(modification));
+ }
- shardDataTree.getDataTree().validate(modification);
- DataTreeCandidateTip candidate = shardDataTree.getDataTree().prepare(modification);
- shardDataTree.getDataTree().commit(candidate);
- shardDataTree.notifyListeners(candidate);
+ static EntityOwnershipChange ownershipChange(final Entity expEntity, final boolean expWasOwner,
+ final boolean expIsOwner, final boolean expHasOwner) {
+ return Matchers.argThat(new ArgumentMatcher<EntityOwnershipChange>() {
+ @Override
+ public boolean matches(Object argument) {
+ EntityOwnershipChange change = (EntityOwnershipChange) argument;
+ return expEntity.equals(change.getEntity()) && expWasOwner == change.wasOwner() &&
+ expIsOwner == change.isOwner() && expHasOwner == change.hasOwner();
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendValue(new EntityOwnershipChange(expEntity, expWasOwner, expIsOwner, expHasOwner));
+ }
+ });
+ }
+
+ static EntityOwnershipChange ownershipChange(final Entity expEntity) {
+ return Matchers.argThat(new ArgumentMatcher<EntityOwnershipChange>() {
+ @Override
+ public boolean matches(Object argument) {
+ EntityOwnershipChange change = (EntityOwnershipChange) argument;
+ return expEntity.equals(change.getEntity());
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendValue(new EntityOwnershipChange(expEntity, false, false, false));
+ }
+ });
}
}