package voldemort.store.slop.strategy;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
import voldemort.VoldemortTestConstants;
import voldemort.cluster.Cluster;
import voldemort.cluster.Node;
import voldemort.store.slop.strategy.HandoffToAnyStrategy;
import voldemort.store.slop.strategy.HintedHandoffStrategy;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class HandoffToAnyStrategyTest {
@Test
public void testRouteHint() {
Cluster cluster = VoldemortTestConstants.getNineNodeCluster();
HintedHandoffStrategy handoffStrategy = new HandoffToAnyStrategy(cluster, false, 0);
for(Node origin: cluster.getNodes()) {
List<Node> nodes = handoffStrategy.routeHint(origin);
assertTrue("hint preflist is correctly sized",
nodes.size() == cluster.getNumberOfNodes() - 1);
assertFalse("hint preflist doesn't include self", nodes.contains(origin));
}
}
@Test
public void testRouteHintWithZones() {
Cluster cluster = VoldemortTestConstants.getEightNodeClusterWithZones();
HintedHandoffStrategy handoffStrategy0 = new HandoffToAnyStrategy(cluster, true, 0);
HintedHandoffStrategy handoffStrategy1 = new HandoffToAnyStrategy(cluster, true, 1);
List<Node> zone0Nodes = Lists.newArrayList();
List<Node> zone1Nodes = Lists.newArrayList();
for(int nodeId: ImmutableList.of(0, 1, 2, 3))
zone0Nodes.add(cluster.getNodeById(nodeId));
for(int nodeId: ImmutableList.of(4, 5, 6, 7))
zone1Nodes.add(cluster.getNodeById(nodeId));
for(Node origin: zone0Nodes) {
List<Node> nodes = handoffStrategy0.routeHint(origin);
assertFalse("hint preflist doesn't include self", nodes.contains(origin));
for(Node node: nodes)
assertFalse("local hints not routed remotely", zone1Nodes.contains(node));
nodes = handoffStrategy1.routeHint(origin);
assertFalse("hint preflist doesn't include self", nodes.contains(origin));
for(Node node: nodes)
assertTrue("remote hints routed locally", zone1Nodes.contains(node));
}
for(Node origin: zone1Nodes) {
List<Node> nodes = handoffStrategy1.routeHint(origin);
assertFalse("hint preflist doesn't include self", nodes.contains(origin));
for(Node node: nodes)
assertFalse("local hints not routed remotely", zone0Nodes.contains(node));
nodes = handoffStrategy0.routeHint(origin);
assertFalse("hint preflist doesn't include self", nodes.contains(origin));
for(Node node: nodes)
assertTrue("remote hints routed locally", zone0Nodes.contains(node));
}
}
}