package net.tomp2p.p2p;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import net.tomp2p.Utils2;
import net.tomp2p.futures.FutureTracker;
import net.tomp2p.message.TrackerData;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerMap;
import net.tomp2p.storage.Data;
import org.junit.Assert;
import org.junit.Test;
public class TestTracker {
@Test
public void testTracker() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(0, 1, 1);
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 1, 0);
Number160 trackerID = new Number160(rnd);
System.err.println("about to store " + trackerID);
// FutureTracker ft = nodes[300].addToTracker(trackerID, "test",
// null, rc, tc);
FutureTracker ft = nodes[300].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
tc = new TrackerConfiguration(1, 1, 0, 1);
ft = nodes[301].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft.awaitUninterruptibly();
System.err.println(ft.getFailedReason());
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(1, ft.getRawPeersOnTracker().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker2() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(1, 1, 1);
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 2, 0, 1000, 2);
Number160 trackerID = new Number160(rnd);
System.err.println("about to store " + trackerID);
FutureTracker ft = nodes[300].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(2, ft.getDirectTrackers().size());
tc = new TrackerConfiguration(1, 1, 1, 3, 1000, 2);
ft = nodes[301].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(1, ft.getRawPeersOnTracker().size());
Assert.assertEquals(1, ft.getPotentialTrackers().size());
Assert.assertEquals(1, ft.getDirectTrackers().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker2_5() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(1, 1, 1);
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 2, 0, 1000, 2);
Number160 trackerID = new Number160(rnd);
System.err.println("about to store " + trackerID);
FutureTracker ft = nodes[300].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(2, ft.getDirectTrackers().size());
tc = new TrackerConfiguration(1, 1, 2, 3, 1000, 2);
ft = nodes[301].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(1, ft.getRawPeersOnTracker().size());
Assert.assertEquals(0, ft.getPotentialTrackers().size());
Assert.assertEquals(2, ft.getDirectTrackers().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker3() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(1, 1, 1);
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 2, 0);
Number160 trackerID = new Number160(rnd);
System.err.println("about to store " + trackerID);
FutureTracker ft = nodes[300].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
System.err.println("add the peer to the tracker: " + nodes[300].getPeerAddress());
ft.awaitUninterruptibly();
ft = nodes[301].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
System.err.println("add the peer to the tracker: " + nodes[301].getPeerAddress());
ft.awaitUninterruptibly();
ft = nodes[302].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).start();
System.err.println("add the peer to the tracker: " + nodes[302].getPeerAddress());
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(2, ft.getDirectTrackers().size());
tc = new TrackerConfiguration(1, 1, 2, 2);
ft = nodes[299].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
// we return there 1 because we use bloomfilters to not return
// already known peers
Assert.assertEquals(1, ft.getRawPeersOnTracker().size());
// but here we expect 3 peers, since 3 peers are on the tracker
Assert.assertEquals(3, ft.getRawPeersOnTracker().values().iterator().next().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker4() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 1000, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
// nodes[i].getPeerBean().getTrackerStorage()
// .setTrackerStoreSize(nodes[i].getPeerBean().getTrackerStorage().getTrackerSize());
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(1, 1, 1);
// 3 is good!
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 20, 0, 20, 2);
Number160 trackerID = new Number160(rnd);
Set<Number160> tmp = new HashSet<Number160>();
for (int i = 0; i <= 300; i++) {
FutureTracker ft = nodes[300 + i].addTracker(trackerID)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setTrackerConfiguration(tc).start();
ft.awaitUninterruptibly();
System.err.println("added " + nodes[300 + i].getPeerAddress().getPeerId() + " on "
+ ft.getDirectTrackers());
tmp.add(nodes[300 + i].getPeerAddress().getPeerId());
Assert.assertEquals(true, ft.isSuccess());
// Assert.assertEquals(true, ft.getDirectTrackers().size() == 2
// || ft.getDirectTrackers().size() == 3);
}
for (int i = 0; i <= 300; i++) {
FutureTracker ft = nodes[600 - i].addTracker(trackerID)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setTrackerConfiguration(tc).start();
ft.awaitUninterruptibly();
System.err.println("added " + nodes[300 + i].getPeerAddress().getPeerId() + " on "
+ ft.getDirectTrackers());
tmp.add(nodes[600 - i].getPeerAddress().getPeerId());
Assert.assertEquals(true, ft.isSuccess());
// Assert.assertEquals(true, ft.getDirectTrackers().size() == 2
// || ft.getDirectTrackers().size() == 3);
}
for (int i = 0; i < nodes.length; i++) {
boolean secondary = nodes[i].getPeerBean().trackerStorage()
.isSecondaryTracker(trackerID, Number160.createHash("test"));
TrackerData tdr = nodes[i].getPeerBean().trackerStorage()
.meshPeers(trackerID, Number160.createHash("test"));
TrackerData tdr2 = nodes[i].getPeerBean().trackerStorage()
.secondaryPeers(trackerID, Number160.createHash("test"));
if (tdr != null)
System.err.println("size[" + i + "] (" + secondary + "): " + tdr.size() + "/"
+ tdr2.size());
else
System.err.println("size[" + i + "] (" + secondary + "): " + 0);
}
System.err.println("SEARCH>>");
tc = new TrackerConfiguration(1, 1, 30, 301, 0, 20);
FutureTracker ft1 = nodes[299].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft1.awaitUninterruptibly();
Assert.assertEquals(true, ft1.isSuccess());
for (TrackerData pa : ft1.getTrackers()) {
for (PeerAddress pas : pa.getPeerAddresses().keySet()) {
System.err.println("found on DHT1: " + pas.getPeerId());
tmp.remove(pas.getPeerId());
}
}
// ctg.setUseSecondaryTrackers(true);
FutureTracker ft2 = nodes[299].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setEvaluatingScheme(new VotingSchemeTracker()).setKnownPeers(ft1.getKnownPeers())
.start();
ft2.awaitUninterruptibly();
System.err.println("Reason: " + ft2.getFailedReason());
Assert.assertEquals(true, ft2.isSuccess());
for (TrackerData pa : ft2.getTrackers()) {
for (PeerAddress pas : pa.getPeerAddresses().keySet()) {
if (tmp.remove(pas.getPeerId()))
System.err.println("found on DHT2: " + pas.getPeerId());
}
}
/*
* for (Number480 n480 : nodes[299].getPeerBean().getTrackerStorage().getKeys(new Number320(trackerID,
* ctg.getDomain()))) { System.err.println("found locally: " + n480); tmp.remove(n480.getContentKey()); }
*/
for (Number160 number160 : tmp) {
System.err.println("not found: " + number160 + " out of 301");
}
System.err.println("not found: " + tmp.size());
Assert.assertEquals(true, tmp.size() < 160);
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker5() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
RoutingConfiguration rc = new RoutingConfiguration(1, 1, 1);
TrackerConfiguration tc = new TrackerConfiguration(1, 1, 2, 0);
Number160 trackerID = new Number160(rnd);
FutureTracker ft = nodes[300].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setAttachement(new Data(",.peoueuaoeue")).start();
ft.awaitUninterruptibly();
ft = nodes[301].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setAttachement(new Data(",.peoueuaoeue")).start();
ft.awaitUninterruptibly();
ft = nodes[302].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setAttachement(new Data(",.peoueuaoeue")).start();
ft.awaitUninterruptibly();
ft = nodes[303].addTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc)
.setAttachement(new Data(",.peoueuaoeue")).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(2, ft.getDirectTrackers().size());
tc = new TrackerConfiguration(1, 1, 0, 1);
ft = nodes[199].getTracker(trackerID).setDomainKey(Number160.createHash("test"))
.setRoutingConfiguration(rc).setTrackerConfiguration(tc).setExpectAttachement()
.setEvaluatingScheme(new VotingSchemeTracker()).start();
ft.awaitUninterruptibly();
Assert.assertEquals(true, ft.isSuccess());
Assert.assertEquals(1, ft.getRawPeersOnTracker().size());
Assert.assertEquals(",.peoueuaoeue", ft.getTrackers().iterator().next().getPeerAddresses()
.values().iterator().next().object());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTracker6() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Number160 key = new Number160(44);
FutureTracker future = master.addTracker(key).setDomainKey(Number160.createHash("test")).start();
future.awaitUninterruptibly();
Assert.assertTrue(future.isSuccess());
//
FutureTracker future2 = master.getTracker(key).setDomainKey(Number160.createHash("test")).start();
future2.awaitUninterruptibly();
System.err.println(future2.getFailedReason());
Assert.assertTrue(future2.isSuccess());
Assert.assertEquals(future2.getPeersOnTracker().size(), 1);
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testTrackerResponsibility() throws Exception {
final Random rnd = new Random(42L);
Peer master = null;
try {
Number160 trackerID = new Number160(rnd);
master = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001).makeAndListen();
Peer[] nodes = createNodes(master, 500, rnd);
FutureTracker futureTracker = nodes[0].addTracker(trackerID).start();
futureTracker.awaitUninterruptibly();
// perfect routing
for (int i = 0; i < nodes.length; i++) {
for (int j = 0; j < nodes.length; j++) {
if (i != j)
nodes[i].getPeerBean().peerMap().peerFound(nodes[j].getPeerAddress(), null);
}
}
FutureTracker ft = nodes[30].getTracker(trackerID).start();
ft.awaitUninterruptibly();
Assert.assertEquals(1, ft.getTrackers().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testBadDistribution() throws Exception {
Peer[] peers = null;
try {
Random rnd = new Random(13414144);
peers = Utils2.createAndAttachNodes(100, 4001, rnd);
Utils2.bootstrap(peers);
// Random rnd = new Random(12112);
Number160 key = new Number160(rnd);
Thread.sleep(1000);
System.out.println("start tracker");
FutureTracker ft1 = peers[42].addTracker(key).start();
ft1.awaitUninterruptibly();
Thread.sleep(1000);
System.out.println("searching for key " + key);
FutureTracker ft = peers[55].getTracker(key).start();
SortedSet<PeerAddress> pa2 = new TreeSet<PeerAddress>(PeerMap.createComparator(key));
pa2.addAll(peers[55].getPeerBean().peerMap().getAll());
ft.awaitUninterruptibly();
Collection<TrackerData> trackerDatas = ft.getTrackers();
Assert.assertEquals(1, trackerDatas.size());
} finally {
// 0 is the master
peers[0].shutdown().await();
}
}
private Peer[] createNodes(Peer master, int nr, Random rnd) throws Exception {
Peer[] nodes = new Peer[nr];
for (int i = 0; i < nr; i++) {
nodes[i] = new PeerMaker(new Number160(rnd)).p2pId(1).masterPeer(master).makeAndListen();
}
return nodes;
}
}