package net.tomp2p.p2p;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;
import net.tomp2p.Utils2;
import net.tomp2p.connection2.ChannelCreator;
import net.tomp2p.futures.BaseFuture;
import net.tomp2p.futures.FutureChannelCreator;
import net.tomp2p.futures.FutureRouting;
import net.tomp2p.futures.FutureWrapper;
import net.tomp2p.message.Message2.Type;
import net.tomp2p.p2p.builder.RoutingBuilder;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerMap;
import net.tomp2p.utils.Utils;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestRouting {
private static final Logger LOG = LoggerFactory.getLogger(TestRouting.class);
final private static Random rnd = new Random(43L);
@Test
public void testMerge() throws UnknownHostException {
// setup
SortedSet<PeerAddress> queue = new TreeSet<PeerAddress>(PeerMap.createComparator(new Number160(88)));
SortedSet<PeerAddress> neighbors = new TreeSet<PeerAddress>(
PeerMap.createComparator(new Number160(88)));
SortedSet<PeerAddress> already = new TreeSet<PeerAddress>(PeerMap.createComparator(new Number160(88)));
queue.add(Utils2.createAddress(12));
queue.add(Utils2.createAddress(14));
queue.add(Utils2.createAddress(16));
neighbors.add(Utils2.createAddress(88));
neighbors.add(Utils2.createAddress(12));
neighbors.add(Utils2.createAddress(16));
// do testing and verification
already.add(Utils2.createAddress(16));
boolean testb = RoutingMechanism.merge(queue, neighbors, already);
Assert.assertEquals(true, testb);
// next one
neighbors.add(Utils2.createAddress(89));
testb = RoutingMechanism.merge(queue, neighbors, already);
Assert.assertEquals(false, testb);
// next one
neighbors.add(Utils2.createAddress(88));
testb = RoutingMechanism.merge(queue, neighbors, already);
Assert.assertEquals(false, testb);
}
@Test
public void testEvaluate() throws UnknownHostException {
// setup
SortedSet<PeerAddress> queue = new TreeSet<PeerAddress>(PeerMap.createComparator(new Number160(88)));
SortedSet<PeerAddress> neighbors = new TreeSet<PeerAddress>(
PeerMap.createComparator(new Number160(88)));
SortedSet<PeerAddress> already = new TreeSet<PeerAddress>(PeerMap.createComparator(new Number160(88)));
queue.add(Utils2.createAddress(12));
queue.add(Utils2.createAddress(14));
queue.add(Utils2.createAddress(16));
neighbors.add(Utils2.createAddress(89));
neighbors.add(Utils2.createAddress(12));
neighbors.add(Utils2.createAddress(16));
already.add(Utils2.createAddress(16));
RoutingMechanism routingMechanism = new RoutingMechanism(null, null);
// do testing and verification
// AtomicInteger nrNoNewInformation = new AtomicInteger();
boolean testb = routingMechanism.evaluateInformation(neighbors, queue, already, 0);
Assert.assertEquals(0, routingMechanism.nrNoNewInfo());
Assert.assertEquals(false, testb);
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(1, routingMechanism.nrNoNewInfo());
Assert.assertEquals(false, testb);
neighbors.add(Utils2.createAddress(11));
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(2, routingMechanism.nrNoNewInfo());
Assert.assertEquals(true, testb);
neighbors.add(Utils2.createAddress(88));
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(0, routingMechanism.nrNoNewInfo());
Assert.assertEquals(false, testb);
//
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(1, routingMechanism.nrNoNewInfo());
neighbors.add(Utils2.createAddress(89));
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(2, routingMechanism.nrNoNewInfo());
neighbors.add(Utils2.createAddress(88));
testb = routingMechanism.evaluateInformation(neighbors, queue, already, 2);
Assert.assertEquals(3, routingMechanism.nrNoNewInfo());
Assert.assertEquals(true, testb);
}
@Test
public void testRouting1() throws Exception {
for (int i = 0; i < 20; i++) {
testRouting1(true, Type.REQUEST_1);
testRouting1(false, Type.REQUEST_1);
testRouting1(true, Type.REQUEST_2);
testRouting1(false, Type.REQUEST_2);
}
}
private void testRouting1(boolean tcp, Type request) throws Exception {
Peer[] peers = null;
ChannelCreator cc = null;
try {
// setup
peers = createSpecialPeers(7);
addToPeerMap(peers[0], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[1], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress());
addToPeerMap(peers[2], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress());
addToPeerMap(peers[3], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress());
addToPeerMap(peers[4], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress(),
peers[5].getPeerAddress());
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 2);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(2, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[6].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(2);
FutureRouting fr = peers[0].getDistributedRouting().route(routingBuilder, request, cc);
// new RoutingBuilder(peers[6].getPeerID(), null, null, 0, 0, 0, 100, 2, false), Type.REQUEST_2, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
Assert.assertEquals(peers[5].getPeerAddress(), ns.first());
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
for (Peer n : peers) {
n.shutdown().await();
}
}
}
@Test
public void testRouting2() throws Exception {
for (int i = 0; i < 20; i++) {
LOG.error("round "+i);
//testRouting2(true, Type.REQUEST_1);
//testRouting2(false, Type.REQUEST_1);
//testRouting2(true, Type.REQUEST_2);
testRouting2(false, Type.REQUEST_2);
}
}
/**
* In this test we have a peer that cannot be reached: Utils2.createAddress("0xffffff")
* @param tcp
* @param request
* @throws Exception
*/
private void testRouting2(boolean tcp, Type request) throws Exception {
Peer[] peers = null;
ChannelCreator cc = null;
try {
// setup
peers = createSpecialPeers(7);
addToPeerMap(peers[0], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[1], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress());
addToPeerMap(peers[2], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress());
addToPeerMap(peers[3], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress());
addToPeerMap(peers[4], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress(),
Utils2.createAddress("0xffffff"));
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 2);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(2, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[6].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(2);
FutureRouting fr = peers[0].getDistributedRouting().route(routingBuilder, request, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
// node5 cannot be reached, so it should not be part of the result
Assert.assertEquals(false, peers[5].getPeerAddress().equals(ns.first()));
Assert.assertEquals(true, peers[4].getPeerAddress().equals(ns.first()));
LOG.error("done!");
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
for (Peer n : peers) {
n.shutdown().await();
}
}
}
@Test
public void testRouting3() throws Exception {
for (int i = 0; i < 20; i++) {
testRouting3(true, Type.REQUEST_1);
testRouting3(false, Type.REQUEST_1);
testRouting3(true, Type.REQUEST_2);
testRouting3(false, Type.REQUEST_2);
}
}
private void testRouting3(boolean tcp, Type request) throws Exception {
Peer[] peers = null;
ChannelCreator cc = null;
try {
// setup
peers = createSpecialPeers(7);
addToPeerMap(peers[0], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[1], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress());
addToPeerMap(peers[2], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress(),
peers[5].getPeerAddress());
addToPeerMap(peers[3], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[4], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[5], peers[0].getPeerAddress(), peers[1].getPeerAddress());
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 1);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(1, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[6].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(1);
FutureRouting fr = peers[0].getDistributedRouting().route(routingBuilder, request, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
Assert.assertEquals(peers[5].getPeerAddress(), ns.first());
Assert.assertEquals(false, ns.contains(peers[3].getPeerAddress()));
Assert.assertEquals(false, ns.contains(peers[4].getPeerAddress()));
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
for (Peer n : peers) {
n.shutdown().await();
}
}
}
@Test
public void testRouting4() throws Exception {
for (int i = 0; i < 20; i++) {
testRouting4(true, Type.REQUEST_1);
testRouting4(false, Type.REQUEST_1);
testRouting4(true, Type.REQUEST_2);
testRouting4(false, Type.REQUEST_2);
}
}
private void testRouting4(boolean tcp, Type request) throws Exception {
Peer[] peers = null;
ChannelCreator cc = null;
try {
// setup
peers = createSpecialPeers(7);
addToPeerMap(peers[0], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[1], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress());
addToPeerMap(peers[2], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress(),
peers[5].getPeerAddress());
addToPeerMap(peers[3], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[4], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[5], peers[0].getPeerAddress(), peers[1].getPeerAddress());
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 2);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(2, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[6].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(2);
FutureRouting fr = peers[0].getDistributedRouting().route(routingBuilder, request, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
Assert.assertEquals(peers[5].getPeerAddress(), ns.first());
Assert.assertEquals(true, ns.contains(peers[0].getPeerAddress()));
Assert.assertEquals(true, ns.contains(peers[1].getPeerAddress()));
Assert.assertEquals(true, ns.contains(peers[2].getPeerAddress()));
Assert.assertEquals(false, ns.contains(peers[3].getPeerAddress()));
Assert.assertEquals(true, ns.contains(peers[4].getPeerAddress()));
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
for (Peer n : peers) {
n.shutdown().await();
}
}
}
@Test
public void testRouting5() throws Exception {
for (int i = 0; i < 20; i++) {
testRouting5(true, Type.REQUEST_1);
testRouting5(false, Type.REQUEST_1);
testRouting5(true, Type.REQUEST_2);
testRouting5(false, Type.REQUEST_2);
}
}
private void testRouting5(boolean tcp, Type request) throws Exception {
Peer[] peers = null;
ChannelCreator cc = null;
try {
// setup
peers = createSpecialPeers(7);
addToPeerMap(peers[0], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[1], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress());
addToPeerMap(peers[2], peers[0].getPeerAddress(), peers[1].getPeerAddress(),
peers[2].getPeerAddress(), peers[3].getPeerAddress(), peers[4].getPeerAddress(),
peers[5].getPeerAddress());
addToPeerMap(peers[3], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[4], peers[0].getPeerAddress(), peers[1].getPeerAddress());
addToPeerMap(peers[5], peers[0].getPeerAddress(), peers[1].getPeerAddress());
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 3);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(3, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[6].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(3);
FutureRouting fr = peers[0].getDistributedRouting().route(routingBuilder, request, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
Assert.assertEquals(peers[5].getPeerAddress(), ns.first());
Assert.assertEquals(true, ns.contains(peers[3].getPeerAddress()));
Assert.assertEquals(true, ns.contains(peers[4].getPeerAddress()));
Assert.assertEquals(6, ns.size());
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
for (Peer n : peers) {
n.shutdown().await();
}
}
}
/**
* Adds peers to a peer's map.
*
* @param peer
* The peer to which the peers will be added
* @param peers
* The peers that will be added
*/
private void addToPeerMap(Peer peer, PeerAddress... peers) {
for (int i = 0; i < peers.length; i++) {
peer.getPeerBean().peerMap().peerFound(peers[i], null);
}
}
private Peer[] createSpecialPeers(int nr) throws Exception {
StringBuilder sb = new StringBuilder("0x");
Peer[] peers = new Peer[nr];
for (int i = 0; i < nr; i++) {
sb.append("f");
peers[i] = new PeerMaker(new Number160(sb.toString())).ports(4001 + i).makeAndListen();
}
return peers;
}
@Test
public void testPerfectRouting() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(1000, rnd, 4001);
System.err.println("nodes created.");
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Collection<PeerAddress> pas = peers[30].getPeerBean().peerMap()
.closePeers(peers[30].getPeerID(), 20);
Iterator<PeerAddress> i = pas.iterator();
PeerAddress p1 = i.next();
Assert.assertEquals(peers[262].getPeerAddress(), p1);
} finally {
master.shutdown().await();
}
}
@Test
public void testRoutingBulk() throws Exception {
testRoutingBulk(true, Type.REQUEST_1);
testRoutingBulk(false, Type.REQUEST_1);
testRoutingBulk(true, Type.REQUEST_1);
testRoutingBulk(false, Type.REQUEST_2);
}
private void testRoutingBulk(boolean tcp, Type request) throws Exception {
Peer master = null;
ChannelCreator cc = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 1);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(1, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[20].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(1);
FutureRouting fr = peers[500].getDistributedRouting().route(routingBuilder, request, cc);
fr.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fr.isSuccess());
SortedSet<PeerAddress> ns = fr.getPotentialHits();
Assert.assertEquals(peers[20].getPeerAddress(), ns.first());
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testRoutingConcurrently() throws Exception {
for (int i = 0; i < 3; i++) {
testRoutingConcurrently(true, Type.REQUEST_1, 1);
testRoutingConcurrently(false, Type.REQUEST_1, 1);
testRoutingConcurrently(true, Type.REQUEST_1, 1);
testRoutingConcurrently(false, Type.REQUEST_2, 1);
testRoutingConcurrently(true, Type.REQUEST_1, 2);
testRoutingConcurrently(false, Type.REQUEST_1, 2);
testRoutingConcurrently(true, Type.REQUEST_1, 2);
testRoutingConcurrently(false, Type.REQUEST_2, 2);
}
}
private void testRoutingConcurrently(boolean tcp, Type request, int res) throws Exception {
final Random rnd1 = new Random(42L);
final Random rnd2 = new Random(43L);
final Random rnd3 = new Random(42L);
Peer master = null;
ChannelCreator cc = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
System.err.println("do routing.");
List<FutureRouting> frs = new ArrayList<FutureRouting>();
for (int i = 0; i < peers.length; i++) {
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, res);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(res, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(peers[rnd1.nextInt(peers.length)].getPeerID());
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(0);
routingBuilder.setMaxFailures(0);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(res);
FutureRouting frr = peers[rnd2.nextInt(peers.length)].getDistributedRouting().route(
routingBuilder, request, cc);
frs.add(frr);
Utils.addReleaseListener(cc, frr);
}
System.err.println("now checking if the tests were successful.");
for (int i = 0; i < peers.length; i++) {
frs.get(i).awaitListenersUninterruptibly();
Assert.assertEquals(true, frs.get(i).isSuccess());
SortedSet<PeerAddress> ns = frs.get(i).getPotentialHits();
Assert.assertEquals(peers[rnd3.nextInt(peers.length)].getPeerAddress(), ns.first());
}
System.err.println("done!");
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testRoutingBootstrap1() throws Exception {
testRoutingBootstrap1(true);
testRoutingBootstrap1(false);
}
private void testRoutingBootstrap1(boolean tcp) throws Exception {
Peer master = null;
ChannelCreator cc = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Collection<PeerAddress> peerAddresses = new ArrayList<PeerAddress>(1);
peerAddresses.add(master.getPeerAddress());
for (int i = 1; i < peers.length; i++) {
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 1);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(1, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setMaxDirectHits(0);
routingBuilder.setMaxNoNewInfo(5);
routingBuilder.setMaxFailures(100);
routingBuilder.setMaxSuccess(100);
routingBuilder.setParallel(1);
FutureWrapper<FutureRouting> fm = peers[i].getDistributedRouting().bootstrap(
peerAddresses, routingBuilder, cc);
fm.awaitUninterruptibly();
// do verification
Assert.assertEquals(true, fm.isSuccess());
Assert.assertEquals(true, fm.getWrappedFuture().isSuccess());
}
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testBootstrap() throws Exception {
Peer master = null;
Peer client = null;
try {
// Bindings b = new Bindings("wlan0");
master = new PeerMaker(new Number160(rnd)).ports(4000).makeAndListen();
client = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
BaseFuture tmp = client.ping().setBroadcast().setPort(4000).start();
tmp.awaitUninterruptibly();
System.err.println(tmp.getFailedReason());
Assert.assertEquals(true, tmp.isSuccess());
Assert.assertEquals(1, client.getPeerBean().peerMap().size());
} finally {
if (client != null) {
client.shutdown().await();
}
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testBootstrap2() throws Exception {
Peer master = null;
Peer client = null;
try {
master = new PeerMaker(new Number160(rnd)).ports(4002).makeAndListen();
client = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
BaseFuture tmp = client.ping().setBroadcast().setPort(4001).start();
tmp.awaitUninterruptibly();
Assert.assertEquals(false, tmp.isSuccess());
Assert.assertEquals(0, client.getPeerBean().peerMap().size());
} finally {
if (client != null) {
client.shutdown().await();
}
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testRoutingLoop() throws Exception {
testRoutingLoop(true);
testRoutingLoop(false);
}
private void testRoutingLoop(boolean tcp) throws Exception {
final Random rnd = new Random(43L);
for (int k = 0; k < 100; k++) {
Number160 find = Number160.createHash("findme");
Peer master = null;
ChannelCreator cc = null;
try {
System.err.println("round " + k);
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
Comparator<PeerAddress> cmp = PeerMap.createComparator(find);
SortedSet<PeerAddress> ss = new TreeSet<PeerAddress>(cmp);
for (int i = 0; i < peers.length; i++) {
ss.add(peers[i].getPeerAddress());
}
// do testing
if (tcp) {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(0, 2);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
} else {
FutureChannelCreator fcc = peers[0].getConnectionBean().reservation().create(2, 0);
fcc.awaitUninterruptibly();
cc = fcc.getChannelCreator();
}
RoutingBuilder routingBuilder = new RoutingBuilder();
if (tcp) {
routingBuilder.setForceTCP(true);
}
routingBuilder.setLocationKey(find);
routingBuilder.setMaxDirectHits(Integer.MAX_VALUE);
routingBuilder.setMaxNoNewInfo(5);
routingBuilder.setMaxFailures(10);
routingBuilder.setMaxSuccess(20);
routingBuilder.setParallel(2);
FutureRouting frr = peers[50].getDistributedRouting().route(routingBuilder, Type.REQUEST_1,
cc);
frr.awaitUninterruptibly();
SortedSet<PeerAddress> ss2 = frr.getPotentialHits();
// test the first 5 peers, because we set noNewInformation to 5,
// which means we find at least 5 entries.
for (int i = 0; i < 5; i++) {
PeerAddress pa = ss.first();
PeerAddress pa2 = ss2.first();
System.err.println("test " + pa + " - " + pa2);
Assert.assertEquals(pa.getPeerId(), pa2.getPeerId());
ss.remove(pa);
ss2.remove(pa2);
}
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (master != null) {
master.shutdown().awaitListenersUninterruptibly();
}
}
}
}
}