package org.infinispan.distribution.topologyaware; import static org.testng.Assert.assertTrue; import java.util.List; import org.infinispan.distribution.ch.ConsistentHashFactory; import org.infinispan.distribution.ch.impl.DefaultConsistentHash; import org.infinispan.distribution.ch.impl.TopologyAwareSyncConsistentHashFactory; import org.infinispan.remoting.transport.Address; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; import org.testng.annotations.Test; /** * @author Mircea.Markus@jboss.com * @author Dan Berindei * @since 5.2 */ @Test(groups = "unit", testName = "distribution.topologyaware.TopologyAwareSyncConsistentHashFactoryTest") public class TopologyAwareSyncConsistentHashFactoryTest extends TopologyAwareConsistentHashFactoryTest { private Log log = LogFactory.getLog(TopologyAwareSyncConsistentHashFactoryTest.class); public TopologyAwareSyncConsistentHashFactoryTest() { // Increase the number of segments to eliminate collisions (which would cause extra segment movements, // causing testConsistencyAfterLeave to fail.) numSegments = 1000; } @Override protected ConsistentHashFactory<DefaultConsistentHash> createConsistentHashFactory() { return new TopologyAwareSyncConsistentHashFactory(); } @Override protected void assertDistribution(int numOwners, List<Address> currentMembers) { TopologyAwareOwnershipStatistics stats = new TopologyAwareOwnershipStatistics(ch); log.tracef("Ownership stats: " + stats); for (Address node : currentMembers) { int maxPrimarySegments = stats.computeExpectedSegments(numSegments, 1, node); int maxSegments = stats.computeExpectedSegments(numSegments, numOwners, node); assertTrue(0.65 * maxPrimarySegments <= stats.getPrimaryOwned(node)); assertTrue(stats.getPrimaryOwned(node) <= 1.2 * maxPrimarySegments); assertTrue(0.65 * maxSegments <= stats.getOwned(node)); assertTrue(stats.getOwned(node) <= 1.2 * maxSegments); } } }