package io.teknek.nibiru.router;
import io.teknek.nibiru.Configuration;
import io.teknek.nibiru.Destination;
import io.teknek.nibiru.Keyspace;
import io.teknek.nibiru.cluster.ClusterMember;
import io.teknek.nibiru.cluster.ClusterMembership;
import io.teknek.nibiru.metadata.KeyspaceMetaData;
import io.teknek.nibiru.partitioner.NaturalPartitioner;
import io.teknek.nibiru.partitioner.Partitioner;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import static org.junit.Assert.*;
import org.junit.Test;
public class TestTokenRouter {
private TokenRouter token;
private Partitioner partitioner;
private Keyspace keyspace;
public static TreeMap<String,String> threeNodeRing(){
TreeMap<String,String> tokenMap = new TreeMap<>();
tokenMap.put("c", "id1");
tokenMap.put("h", "id2");
tokenMap.put("r", "id3");
return tokenMap;
}
private static ClusterMembership threeLiveNodes(){
ClusterMembership mock = new ClusterMembership(null, null) {
public void init() {}
public void shutdown() {}
public List<ClusterMember> getLiveMembers() {
return Arrays.asList(
new ClusterMember("127.0.0.1", 2000, 1, "id1"),
new ClusterMember("127.0.0.2", 2000, 1, "id2"),
new ClusterMember("127.0.0.3", 2000, 1, "id3"));
}
public List<ClusterMember> getDeadMembers() { return null; }
};
return mock;
}
public void prepareRouter(int replicationFactor,
SortedMap<String,String> tokenMap){
token = new TokenRouter();
keyspace = new Keyspace(new Configuration());
KeyspaceMetaData meta = new KeyspaceMetaData();
Map<String,Object> props = new HashMap<>();
props.put(TokenRouter.TOKEN_MAP_KEY, tokenMap);
props.put(TokenRouter.REPLICATION_FACTOR, replicationFactor);
meta.setProperties(props);
keyspace.setKeyspaceMetadata(meta);
partitioner = new NaturalPartitioner();
}
private List<Destination> list(String ... destinations){
List<Destination> results = new java.util.ArrayList<>();
for (String dest: destinations){
results.add(new Destination(dest));
}
return results;
}
private List<Destination> locate(String row){
return token.routesTo(null, keyspace, threeLiveNodes(),
partitioner.partition(row));
}
@Test
public void testReplication1(){
prepareRouter(1, threeNodeRing());
assertEquals(list("id1"), locate("a"));
assertEquals(list("id1"), locate("aa"));
assertEquals(list("id2"), locate("h"));
assertEquals(list("id3"), locate("i"));
assertEquals(list("id1"), locate("z"));
}
@Test
public void testReplication2(){
prepareRouter(2, threeNodeRing());
assertEquals(list("id1", "id2"), locate("a"));
assertEquals(list("id1", "id2"), locate("aa"));
assertEquals(list("id2", "id3"), locate("h"));
assertEquals(list("id3", "id1"), locate("i"));
assertEquals(list("id1", "id2"), locate("z"));
}
}