package org.infinispan.client.hotrod;
import static org.testng.Assert.assertEquals;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import org.infinispan.client.hotrod.impl.consistenthash.ConsistentHashV2;
import org.infinispan.commons.hash.Hash;
import org.testng.annotations.Test;
/**
* @author Mircea Markus
* @since 5.0
*/
@Test(groups = "unit", testName = "client.hotrod.ConsistentHashV2Test")
public class ConsistentHashV2Test {
private InetSocketAddress a1;
private InetSocketAddress a2;
private InetSocketAddress a3;
private InetSocketAddress a4;
private DummyHash hash;
private ConsistentHashV2 v1;
private void setUp(int numOwners) {
a1 = new InetSocketAddress(1);
a2 = new InetSocketAddress(2);
a3 = new InetSocketAddress(3);
a4 = new InetSocketAddress(4);
LinkedHashMap<SocketAddress, Set<Integer>> map = new LinkedHashMap<SocketAddress, Set<Integer>>();
map.put(a1, Collections.singleton(0));
map.put(a2, Collections.singleton(1000));
map.put(a3, Collections.singleton(2000));
map.put(a4, Collections.singleton(3000));
this.v1 = new ConsistentHashV2();
this.v1.init(map, numOwners, 10000);
hash = new DummyHash();
this.v1.setHash(hash);
}
public void simpleTest() {
setUp(1);
hash.value = 0;
assert v1.getServer(new byte[0]).equals(a1);
hash.value = 1;
assert v1.getServer(new byte[0]).equals(a2);
hash.value = 1001;
assert v1.getServer(new byte[0]).equals(a3);
hash.value = 2001;
assertEquals(v1.getServer(new byte[0]), a4);
hash.value = 3001;
assert v1.getServer(new byte[0]).equals(a1);
}
public void numOwners2Test() {
setUp(2);
hash.value = 0;
assert list(a1, a2).contains(v1.getServer(new byte[0]));
hash.value = 1;
assert list(a2, a3).contains(v1.getServer(new byte[0]));
hash.value = 1001;
assert list(a3, a4).contains(v1.getServer(new byte[0]));
hash.value = 2001;
assert list(a4, a1).contains(v1.getServer(new byte[0]));
hash.value = 3001;
assert list(a1, a2).contains(v1.getServer(new byte[0]));
}
public void numOwners3Test() {
setUp(3);
hash.value = 0;
assert list(a1, a2, a3).contains(v1.getServer(new byte[0]));
hash.value = 1;
assert list(a2, a3, a4).contains(v1.getServer(new byte[0]));
hash.value = 1001;
assert list(a3, a4, a1).contains(v1.getServer(new byte[0]));
hash.value = 2001;
assert list(a4, a1, a2).contains(v1.getServer(new byte[0]));
hash.value = 3001;
assert list(a1, a2, a3).contains(v1.getServer(new byte[0]));
}
//now a bit more extreme...
public void numOwners4Test() {
setUp(4);
List<InetSocketAddress> list = list(a1, a2, a3, a4);
hash.value = 0;
assert list.contains(v1.getServer(new byte[0]));
hash.value = 1;
assert list.contains(v1.getServer(new byte[0]));
hash.value = 1001;
assert list.contains(v1.getServer(new byte[0]));
hash.value = 2001;
assert list.contains(v1.getServer(new byte[0]));
hash.value = 3001;
assert list.contains(v1.getServer(new byte[0]));
}
private List<InetSocketAddress> list(InetSocketAddress... a) {
return Arrays.asList(a);
}
public void testCorrectHash() {
hash.value = 1;
v1.getServer(new byte[0]);
}
public static class DummyHash implements Hash {
public int value;
@Override
public int hash(byte[] payload) {
return value;
}
@Override
public int hash(int hashcode) {
return value;
}
@Override
public int hash(Object o) {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DummyHash dummyHash = (DummyHash) o;
if (value != dummyHash.value) return false;
return true;
}
@Override
public int hashCode() {
return value;
}
}
}