package net.tomp2p.p2p;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NavigableSet;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import net.tomp2p.Utils2;
import net.tomp2p.connection2.Bindings;
import net.tomp2p.connection2.ChannelCreator;
import net.tomp2p.connection2.PeerConnection;
import net.tomp2p.futures.BaseFuture;
import net.tomp2p.futures.BaseFutureAdapter;
import net.tomp2p.futures.FutureBootstrap;
import net.tomp2p.futures.FutureChannelCreator;
import net.tomp2p.futures.FutureDirect;
import net.tomp2p.futures.FutureDiscover;
import net.tomp2p.futures.FutureGet;
import net.tomp2p.futures.FuturePeerConnection;
import net.tomp2p.futures.FuturePut;
import net.tomp2p.futures.FutureRemove;
import net.tomp2p.futures.FutureResponse;
import net.tomp2p.futures.FutureShutdown;
import net.tomp2p.futures.FutureSuccessEvaluatorOperation;
import net.tomp2p.message.Buffer;
import net.tomp2p.p2p.builder.DHTBuilder;
import net.tomp2p.p2p.builder.PutBuilder;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.Number320;
import net.tomp2p.peers.Number480;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerMap;
import net.tomp2p.rpc.ObjectDataReply;
import net.tomp2p.rpc.RawDataReply;
import net.tomp2p.rpc.StorageRPC;
import net.tomp2p.storage.Data;
import net.tomp2p.storage.HashData;
import net.tomp2p.utils.Timings;
import net.tomp2p.utils.Utils;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
public class TestDHT {
final private static Random rnd = new Random(42L);
@Test
public void testPut() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
FuturePut fp = peers[444].put(peers[30].getPeerID())
.setData(Number160.createHash("test"),new Number160(5) , data).setRequestP2PConfiguration(pc)
.setRoutingConfiguration(rc).start();
fp.awaitUninterruptibly();
fp.getFutureRequests().awaitUninterruptibly();
System.err.println("Test " + fp.getFailedReason());
Assert.assertEquals(true, fp.isSuccess());
peers[30].getPeerBean()
.peerMap();
// search top 3
TreeMap<PeerAddress, Integer> tmp = new TreeMap<PeerAddress, Integer>(PeerMap.createComparator(peers[30].getPeerID()));
int i = 0;
for (Peer node : peers) {
tmp.put(node.getPeerAddress(), i);
i++;
}
Entry<PeerAddress, Integer> e = tmp.pollFirstEntry();
System.err.println("1 (" + e.getValue() + ")" + e.getKey());
Assert.assertEquals(peers[e.getValue()].getPeerAddress(), peers[30].getPeerAddress());
testForArray(peers[e.getValue()], peers[30].getPeerID(), true);
//
e = tmp.pollFirstEntry();
System.err.println("2 (" + e.getValue() + ")" + e.getKey());
testForArray(peers[e.getValue()], peers[30].getPeerID(), true);
//
e = tmp.pollFirstEntry();
System.err.println("3 " + e.getKey());
testForArray(peers[e.getValue()], peers[30].getPeerID(), true);
//
e = tmp.pollFirstEntry();
System.err.println("4 " + e.getKey());
testForArray(peers[e.getValue()], peers[30].getPeerID(), false);
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGetAlone() throws Exception {
Peer master = null;
try {
master = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
FuturePut fdht = master.put(Number160.ONE).setData(new Data("hallo")).start();
fdht.awaitUninterruptibly();
fdht.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fdht.isSuccess());
FutureGet fdht2 = master.get(Number160.ONE).start();
fdht2.awaitUninterruptibly();
System.err.println(fdht2.getFailedReason());
Assert.assertEquals(true, fdht2.isSuccess());
Data tmp = fdht2.getData();
Assert.assertEquals("hallo", tmp.object().toString());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPut2() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(500, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(0, 0, 1);
RequestP2PConfiguration pc = new RequestP2PConfiguration(1, 0, 0);
FuturePut fdht = peers[444].put(peers[30].getPeerID()).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fdht.awaitUninterruptibly();
fdht.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fdht.isSuccess());
peers[30].getPeerBean()
.peerMap();
// search top 3
TreeMap<PeerAddress, Integer> tmp = new TreeMap<PeerAddress, Integer>(
PeerMap.createComparator(peers[30].getPeerID()));
int i = 0;
for (Peer node : peers) {
tmp.put(node.getPeerAddress(), i);
i++;
}
Entry<PeerAddress, Integer> e = tmp.pollFirstEntry();
Assert.assertEquals(peers[e.getValue()].getPeerAddress(), peers[30].getPeerAddress());
testForArray(peers[e.getValue()], peers[30].getPeerID(), true);
//
e = tmp.pollFirstEntry();
testForArray(peers[e.getValue()], peers[30].getPeerID(), false);
//
e = tmp.pollFirstEntry();
testForArray(peers[e.getValue()], peers[30].getPeerID(), false);
//
e = tmp.pollFirstEntry();
testForArray(peers[e.getValue()], peers[30].getPeerID(), false);
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGet() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
Data data = new Data(new byte[44444]);
FuturePut fput = peers[444].put(peers[30].getPeerID()).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
rc = new RoutingConfiguration(0, 0, 10, 1);
pc = new RequestP2PConfiguration(1, 0, 0);
FutureGet fget = peers[555].get(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(1, fget.getRawData().size());
Assert.assertEquals(true, fget.isMinReached());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGet2() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(1000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
Data data = new Data(new byte[44444]);
FuturePut fput = peers[444].put(peers[30].getPeerID()).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
rc = new RoutingConfiguration(4, 0, 10, 1);
pc = new RequestP2PConfiguration(4, 0, 0);
FutureGet fget = peers[555].get(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(3, fget.getRawData().size());
Assert.assertEquals(false, fget.isMinReached());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGet3() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
FuturePut fput = peers[444].put(peers[30].getPeerID()).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
rc = new RoutingConfiguration(1, 0, 10, 1);
pc = new RequestP2PConfiguration(1, 0, 0);
for (int i = 0; i < 1000; i++) {
FutureGet fget = peers[100 + i].get(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(1, fget.getRawData().size());
Assert.assertEquals(true, fget.isMinReached());
}
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGetRemove() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
FuturePut fput = peers[444].put(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setData(new Number160(5), data).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
rc = new RoutingConfiguration(4, 0, 10, 1);
pc = new RequestP2PConfiguration(4, 0, 0);
FutureRemove frem = peers[222].remove(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
frem.awaitUninterruptibly();
Assert.assertEquals(true, frem.isSuccess());
Assert.assertEquals(3, frem.getRawKeys().size());
FutureGet fget = peers[555].get(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fget.awaitUninterruptibly();
Assert.assertEquals(false, fget.isSuccess());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testPutGetRemove2() throws Exception {
Peer master = null;
try {
// rnd.setSeed(253406013991563L);
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
FuturePut fput = peers[444].put(peers[30].getPeerID()).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
System.err.println("remove");
rc = new RoutingConfiguration(4, 0, 10, 1);
pc = new RequestP2PConfiguration(4, 0, 0);
FutureRemove frem = peers[222].remove(peers[30].getPeerID()).setReturnResults()
.setDomainKey(Number160.createHash("test")).setContentKey(new Number160(5))
.setRoutingConfiguration(rc).setRequestP2PConfiguration(pc).start();
frem.awaitUninterruptibly();
Assert.assertEquals(true, frem.isSuccess());
Assert.assertEquals(3, frem.getRawData().size());
System.err.println("get");
rc = new RoutingConfiguration(4, 0, 0, 1);
pc = new RequestP2PConfiguration(4, 0, 0);
FutureGet fget = peers[555].get(peers[30].getPeerID()).setDomainKey(Number160.createHash("test"))
.setContentKey(new Number160(5)).setRoutingConfiguration(rc)
.setRequestP2PConfiguration(pc).start();
fget.awaitUninterruptibly();
Assert.assertEquals(false, fget.isSuccess());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testDirect() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(1000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
final AtomicInteger ai = new AtomicInteger(0);
for (int i = 0; i < peers.length; i++) {
peers[i].setObjectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
ai.incrementAndGet();
return "ja";
}
});
}
// do testing
FutureDirect fdir = peers[400].send(new Number160(rnd)).setObject("hallo").start();
fdir.awaitUninterruptibly();
System.err.println(fdir.getFailedReason());
Assert.assertEquals(true, fdir.isSuccess());
Assert.assertEquals(true, ai.get() >= 3 && ai.get() <= 6);
System.err.println("called: "+ai.get());
Assert.assertEquals("ja", fdir.getObject());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testAddListGet() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Number160 nr = new Number160(rnd);
String toStore1 = "hallo1";
String toStore2 = "hallo1";
Data data1 = new Data(toStore1.getBytes());
Data data2 = new Data(toStore2.getBytes());
FuturePut fput = peers[30].add(nr).setData(data1).setList(true).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore1 + " (" + fput.isSuccess() + ")");
fput = peers[50].add(nr).setData(data2).setList(true).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore2 + " (" + fput.isSuccess() + ")");
FutureGet fget = peers[77].get(nr).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
// majority voting with getDataMap is not possible since we create
// random content key on the recipient
Assert.assertEquals(2, fget.getRawData().values().iterator().next().values().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testAddGet() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Number160 nr = new Number160(rnd);
String toStore1 = "hallo1";
String toStore2 = "hallo2";
Data data1 = new Data(toStore1.getBytes());
Data data2 = new Data(toStore2.getBytes());
FuturePut fput = peers[30].add(nr).setData(data1).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore1 + " (" + fput.isSuccess() + ")");
fput = peers[50].add(nr).setData(data2).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore2 + " (" + fput.isSuccess() + ")");
FutureGet fget = peers[77].get(nr).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testDigest() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Number160 nr = new Number160(rnd);
String toStore1 = "hallo1";
String toStore2 = "hallo2";
String toStore3 = "hallo3";
Data data1 = new Data(toStore1.getBytes());
Data data2 = new Data(toStore2.getBytes());
Data data3 = new Data(toStore3.getBytes());
FuturePut fput = peers[30].add(nr).setData(data1).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore1 + " (" + fput.isSuccess() + ")");
fput = peers[50].add(nr).setData(data2).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore2 + " (" + fput.isSuccess() + ")");
fput = peers[51].add(nr).setData(data3).start();
fput.awaitUninterruptibly();
System.out.println("added: " + toStore3 + " (" + fput.isSuccess() + ")");
FutureGet fget = peers[77].get(nr).setAll().setDigest().start();
fget.awaitUninterruptibly();
System.err.println(fget.getFailedReason());
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(3, fget.getDigest().getKeyDigest().size());
Number160 test = new Number160("0x37bb570100c9f5445b534757ebc613a32df3836d");
Set<Number160> test2 = new HashSet<Number160>();
test2.add(test);
fget = peers[67].get(nr).setDigest().setContentKeys(test2).start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(1, fget.getDigest().getKeyDigest().size());
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testData() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
ByteBuf c = Unpooled.buffer();
c.writeInt(77);
Buffer b = new Buffer(c);
peers[50].setRawDataReply(new RawDataReply() {
@Override
public Buffer reply(PeerAddress sender, Buffer requestBuffer, boolean complete) {
System.err.println(requestBuffer.buffer().readInt());
ByteBuf c = Unpooled.buffer();
c.writeInt(88);
Buffer ret = new Buffer(c);
return ret;
}
});
FutureResponse fd = master.sendDirect(peers[50].getPeerAddress()).setBuffer(b).start();
fd.await();
if (fd.getResponse().getBuffer(0) == null) {
System.err.println("damm");
Assert.fail();
}
int read = fd.getResponse().getBuffer(0).buffer().readInt();
Assert.assertEquals(88, read);
System.err.println("done");
// for(FutureBootstrap fb:tmp)
// fb.awaitUninterruptibly();
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testData2() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(200, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
ByteBuf c = Unpooled.buffer();
c.writeInt(77);
Buffer b = new Buffer(c);
peers[50].setRawDataReply(new RawDataReply() {
@Override
public Buffer reply(PeerAddress sender, Buffer requestBuffer, boolean complete) {
System.err.println("got it");
return requestBuffer;
}
});
FutureResponse fd = master.sendDirect(peers[50].getPeerAddress()).setBuffer(b).start();
fd.await();
System.err.println("done1");
Assert.assertEquals(true, fd.isSuccess());
Assert.assertNull(fd.getResponse().getBuffer(0));
// int read = fd.getBuffer().readInt();
// Assert.assertEquals(88, read);
System.err.println("done2");
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testObjectLoop() throws Exception {
for (int i = 0; i < 1000; i++) {
System.err.println("nr: " + i);
testObject();
}
}
@Test
public void testObject() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(100, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Number160 nr = new Number160(rnd);
String toStore1 = "hallo1";
String toStore2 = "hallo2";
Data data1 = new Data(toStore1);
Data data2 = new Data(toStore2);
System.err.println("begin add : ");
FuturePut fput = peers[30].add(nr).setData(data1).start();
fput.awaitUninterruptibly();
System.err.println("stop added: " + toStore1 + " (" + fput.isSuccess() + ")");
fput = peers[50].add(nr).setData(data2).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
System.err.println("added: " + toStore2 + " (" + fput.isSuccess() + ")");
FutureGet fget = peers[77].get(nr).setAll().start();
fget.awaitUninterruptibly();
fget.getFutureRequests().awaitUninterruptibly();
if (!fget.isSuccess())
System.err.println(fget.getFailedReason());
Assert.assertEquals(true, fget.isSuccess());
Assert.assertEquals(2, fget.getDataMap().size());
System.err.println("got it");
} finally {
if (master != null) {
master.shutdown().awaitListenersUninterruptibly();
}
}
}
@Test
public void testAddGetPermits() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(2000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
Number160 nr = new Number160(rnd);
List<FuturePut> list = new ArrayList<FuturePut>();
for (int i = 0; i < peers.length; i++) {
String toStore1 = "hallo" + i;
Data data1 = new Data(toStore1.getBytes());
FuturePut fput = peers[i].add(nr).setData(data1).start();
list.add(fput);
}
for (FuturePut futureDHT : list) {
futureDHT.awaitUninterruptibly();
Assert.assertEquals(true, futureDHT.isSuccess());
}
System.err.println("DONE");
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testhalt() throws Exception {
Peer master1 = null;
Peer master2 = null;
Peer master3 = null;
try {
master1 = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4001)
.makeAndListen();
master2 = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4002)
.makeAndListen();
master3 = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4003)
.makeAndListen();
// perfect routing
master1.getPeerBean().peerMap().peerFound(master2.getPeerAddress(), null);
master1.getPeerBean().peerMap().peerFound(master3.getPeerAddress(), null);
master2.getPeerBean().peerMap().peerFound(master1.getPeerAddress(), null);
master2.getPeerBean().peerMap().peerFound(master3.getPeerAddress(), null);
master3.getPeerBean().peerMap().peerFound(master1.getPeerAddress(), null);
master3.getPeerBean().peerMap().peerFound(master2.getPeerAddress(), null);
Number160 id = master2.getPeerID();
Data data = new Data(new byte[44444]);
RoutingConfiguration rc = new RoutingConfiguration(2, 10, 2);
RequestP2PConfiguration pc = new RequestP2PConfiguration(3, 5, 0);
FuturePut fput = master1.put(id).setData(new Number160(5), data)
.setDomainKey(Number160.createHash("test")).setRequestP2PConfiguration(pc)
.setRoutingConfiguration(rc).start();
fput.awaitUninterruptibly();
fput.getFutureRequests().awaitUninterruptibly();
//Collection<Number160> tmp = new ArrayList<Number160>();
//tmp.add(new Number160(5));
//
Assert.assertEquals(true, fput.isSuccess());
// search top 3
master2.shutdown().await();
//
FutureGet fget = master1.get(id).setRoutingConfiguration(rc).setRequestP2PConfiguration(pc)
.setDomainKey(Number160.createHash("test")).setContentKey(new Number160(5))
.start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
master1.getPeerBean().peerMap().peerFailed(master2.getPeerAddress(), true);
master3.getPeerBean().peerMap().peerFailed(master2.getPeerAddress(), true);
master2 = new PeerMaker(new Number160(rnd)).p2pId(1).ports(4002)
.makeAndListen();
master1.getPeerBean().peerMap().peerFound(master2.getPeerAddress(), null);
master3.getPeerBean().peerMap().peerFound(master2.getPeerAddress(), null);
master2.getPeerBean().peerMap().peerFound(master1.getPeerAddress(), null);
master2.getPeerBean().peerMap().peerFound(master3.getPeerAddress(), null);
System.err.println("no more exceptions here!!");
fget = master1.get(id).setRoutingConfiguration(rc).setRequestP2PConfiguration(pc)
.setDomainKey(Number160.createHash("test")).setContentKey(new Number160(5))
.start();
fget.awaitUninterruptibly();
Assert.assertEquals(true, fget.isSuccess());
} finally {
if (master1 != null) {
master1.shutdown().await();
}
if (master2 != null) {
master2.shutdown().await();
}
if (master3 != null) {
master3.shutdown().await();
}
}
}
@Test
public void testObjectSendExample() throws Exception {
Peer p1 = null;
Peer p2 = null;
try {
p1 = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
p2 = new PeerMaker(new Number160(rnd)).ports(4002).makeAndListen();
// attach reply handler
p2.setObjectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
System.out.println("request [" + request + "]");
return "world";
}
});
FutureResponse futureData = p1.sendDirect(p2.getPeerAddress()).setObject("hello").start();
futureData.awaitUninterruptibly();
System.out.println("reply [" + futureData.getResponse().getBuffer(0).object() + "]");
} finally {
if (p1 != null) {
p1.shutdown().await();
}
if (p2 != null) {
p2.shutdown().await();
}
}
}
@Test
public void testObjectSend() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(500, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
for (int i = 0; i < peers.length; i++) {
System.err.println("node " + i);
peers[i].setObjectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
return request;
}
});
peers[i].setRawDataReply(new RawDataReply() {
@Override
public Buffer reply(PeerAddress sender, Buffer requestBuffer, boolean complete)
throws Exception {
return requestBuffer;
}
});
}
// do testing
System.err.println("round start");
Random rnd = new Random(42L);
byte[] toStore1 = new byte[10 * 1024];
for (int j = 0; j < 5; j++) {
System.err.println("round " + j);
for (int i = 0; i < peers.length - 1; i++) {
send1(peers[rnd.nextInt(peers.length)], peers[rnd.nextInt(peers.length)], toStore1, 100);
send2(peers[rnd.nextInt(peers.length)], peers[rnd.nextInt(peers.length)],
Unpooled.wrappedBuffer(toStore1), 100);
System.err.println("round1 " + i);
}
}
System.err.println("DONE");
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
@Test
public void testKeys() throws Exception {
final Random rnd = new Random(42L);
Peer p1 = null;
Peer p2 = null;
try {
Number160 n1 = new Number160(rnd);
Data d1 = new Data("hello");
Data d2 = new Data("world!");
// setup (step 1)
p1 = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
FuturePut fput = p1.add(n1).setData(d1).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
p2 = new PeerMaker(new Number160(rnd)).ports(4002).makeAndListen();
p2.bootstrap().setPeerAddress(p1.getPeerAddress()).start().awaitUninterruptibly();
// test (step 2)
fput = p1.add(n1).setData(d2).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
FutureGet fget = p2.get(n1).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(2, fget.getDataMap().size());
// test (step 3)
FutureRemove frem = p1.remove(n1).setContentKey(d2.hash()).start();
frem.awaitUninterruptibly();
Assert.assertEquals(true, frem.isSuccess());
fget = p2.get(n1).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(1, fget.getDataMap().size());
// test (step 4)
fput = p1.add(n1).setData(d2).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
fget = p2.get(n1).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(2, fget.getDataMap().size());
// test (remove all)
frem = p1.remove(n1).setContentKey(d1.hash()).start();
frem.awaitUninterruptibly();
frem = p1.remove(n1).setContentKey(d2.hash()).start();
frem.awaitUninterruptibly();
fget = p2.get(n1).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(0, fget.getDataMap().size());
} finally {
if (p1 != null) {
p1.shutdown().await();
}
if (p2 != null) {
p2.shutdown().await();
}
}
}
@Test
public void testKeys2() throws Exception {
final Random rnd = new Random(42L);
Peer p1 = null;
Peer p2 = null;
try {
Number160 n1 = new Number160(rnd);
Number160 n2 = new Number160(rnd);
Data d1 = new Data("hello");
Data d2 = new Data("world!");
// setup (step 1)
p1 = new PeerMaker(new Number160(rnd)).ports(4001).makeAndListen();
FuturePut fput = p1.put(n1).setData(d1).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
p2 = new PeerMaker(new Number160(rnd)).ports(4002).makeAndListen();
p2.bootstrap().setPeerAddress(p1.getPeerAddress()).start().awaitUninterruptibly();
// test (step 2)
fput = p1.put(n2).setData(d2).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
FutureGet fget = p2.get(n2).start();
fget.awaitUninterruptibly();
Assert.assertEquals(1, fget.getDataMap().size());
// test (step 3)
FutureRemove frem = p1.remove(n2).start();
frem.awaitUninterruptibly();
Assert.assertEquals(true, frem.isSuccess());
fget = p2.get(n2).start();
fget.awaitUninterruptibly();
Assert.assertEquals(0, fget.getDataMap().size());
// test (step 4)
fput = p1.put(n2).setData(d2).start();
fput.awaitUninterruptibly();
Assert.assertEquals(true, fput.isSuccess());
fget = p2.get(n2).start();
fget.awaitUninterruptibly();
Assert.assertEquals(1, fget.getDataMap().size());
} finally {
if (p1 != null) {
p1.shutdown().await();
}
if (p2 != null) {
p2.shutdown().await();
}
}
}
@Test
public void testPutGetAll() throws Exception {
final AtomicBoolean running = new AtomicBoolean(true);
Peer master = null;
try {
// setup
final Peer[] peers = Utils2.createNodes(100, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
final Number160 key = Number160.createHash("test");
final Data data1 = new Data("test1");
data1.ttlSeconds(3);
final Data data2 = new Data("test2");
data2.ttlSeconds(3);
// add every second a two values
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (running.get()) {
peers[10].add(key).setData(data1).start().awaitUninterruptibly();
peers[10].add(key).setData(data2).start().awaitUninterruptibly();
Timings.sleepUninterruptibly(1000);
}
}
});
t.start();
// wait until the first data is stored.
Timings.sleep(1000);
for (int i = 0; i < 30; i++) {
FutureGet fget = peers[20 + i].get(key).setAll().start();
fget.awaitUninterruptibly();
Assert.assertEquals(2, fget.getDataMap().size());
Timings.sleep(1000);
}
} finally {
running.set(false);
if (master != null) {
master.shutdown().await();
}
}
}
/**
* This will probably fail on your machine since you have to have eth0 configured. This testcase is suited for
* running on the tomp2p.net server
*
* @throws Exception
*/
@Test
public void testBindings() throws Exception {
final Random rnd = new Random(42L);
Peer p1 = null;
Peer p2 = null;
try {
// setup (step 1)
Bindings b = new Bindings();
b.addInterface("eth0");
p1 = new PeerMaker(new Number160(rnd)).ports(4001).bindings(b).makeAndListen();
p2 = new PeerMaker(new Number160(rnd)).ports(4002).bindings(b).makeAndListen();
FutureBootstrap fb = p2.bootstrap().setPeerAddress(p1.getPeerAddress()).start();
fb.awaitUninterruptibly();
Assert.assertEquals(true, fb.isSuccess());
} finally {
if (p1 != null) {
p1.shutdown().await();
}
if (p2 != null) {
p2.shutdown().await();
}
}
}
//TODO: make this work
@Test
public void testBroadcast() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(1000, rnd, 4001);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
master.broadcast(Number160.createHash("blub")).start();
DefaultBroadcastHandler d = (DefaultBroadcastHandler) master.getBroadcastRPC()
.broadcastHandler();
int counter = 0;
while (d.getBroadcastCounter() < 900) {
Thread.sleep(200);
counter++;
if (counter > 100) {
System.err.println("did not broadcast to 1000 peers, but to " + d.getBroadcastCounter());
Assert.fail("did not broadcast to 1000 peers, but to " + d.getBroadcastCounter());
}
}
System.err.println("DONE");
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
/**
* Test the quit messages if they set a peer as offline.
*
* @throws Exception .
*/
@Test
public void testQuit() throws Exception {
Peer master = null;
try {
// setup
final int nrPeers = 200;
final int port = 4001;
Peer[] peers = Utils2.createNodes(nrPeers, rnd, port);
master = peers[0];
Utils2.perfectRouting(peers);
// do testing
final int peerTest = 10;
System.err.println("counter: " + countOnline(peers, peers[peerTest].getPeerAddress()));
FutureShutdown futureShutdown = peers[peerTest].announceShutdown().start();
futureShutdown.awaitUninterruptibly();
// we need to wait a bit, since the quit RPC is a fire and forget and we return immediately
Thread.sleep(2000);
int counter = countOnline(peers, peers[peerTest].getPeerAddress());
System.err.println("counter: " + counter);
Assert.assertEquals(6, nrPeers - counter);
} finally {
if (master != null) {
master.shutdown().await();
}
}
}
//TODO: make this work
@Test
public void testTooManyOpenFilesInSystem() throws Exception {
Peer master = null;
Peer slave = null;
try {
// since we have two peers, we need to reduce the connections -> we
// will have 300 * 2 (peer connection)
// plus 100 * 2 * 2. The last multiplication is due to discover,
// where the recipient creates a connection
// with its own limit. Since the limit is 1024 and we stop at 1000
// only for the connection, we may run into
// too many open files
PeerMaker masterMaker = new PeerMaker(new Number160(rnd)).ports(4001);
master = masterMaker.makeAndListen();
PeerMaker slaveMaker = new PeerMaker(new Number160(rnd)).ports(4002);
slave = slaveMaker.makeAndListen();
System.err.println("peers up and running");
slave.setRawDataReply(new RawDataReply() {
@Override
public Buffer reply(PeerAddress sender, Buffer requestBuffer, boolean last) throws Exception {
final byte[] b1 = new byte[10000];
int i = requestBuffer.buffer().getInt(0);
ByteBuf buf = Unpooled.wrappedBuffer(b1);
buf.setInt(0, i);
return new Buffer(buf);
}
});
List<BaseFuture> list1 = new ArrayList<BaseFuture>();
List<BaseFuture> list2 = new ArrayList<BaseFuture>();
List<FuturePeerConnection> list3 = new ArrayList<FuturePeerConnection>();
for (int i = 0; i < 250; i++) {
final byte[] b = new byte[10000];
FuturePeerConnection pc = master.createPeerConnection(slave.getPeerAddress());
list1.add(master.sendDirect(pc).setBuffer(new Buffer(Unpooled.wrappedBuffer(b))).start());
list3.add(pc);
// pc.close();
}
for (int i = 0; i < 20000; i++) {
list2.add(master.discover().setPeerAddress(slave.getPeerAddress()).start());
final byte[] b = new byte[10000];
byte[] me = Utils.intToByteArray(i);
System.arraycopy(me, 0, b, 0, 4);
list2.add(master.sendDirect(slave.getPeerAddress())
.setBuffer(new Buffer(Unpooled.wrappedBuffer(b))).start());
}
for (BaseFuture bf : list1) {
bf.awaitListenersUninterruptibly();
if (bf.isFailed()) {
System.err.println("WTF " + bf.getFailedReason());
} else {
System.err.print(".");
}
Assert.assertEquals(true, bf.isSuccess());
}
for (FuturePeerConnection pc : list3) {
pc.close().awaitListenersUninterruptibly();
}
for (BaseFuture bf : list2) {
bf.awaitListenersUninterruptibly();
if (bf.isFailed()) {
System.err.println("WTF " + bf.getFailedReason());
} else {
System.err.print(".");
}
Assert.assertEquals(true, bf.isSuccess());
}
System.err.println("done!!");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.err.println("done!1!");
if (master != null) {
master.shutdown().await();
}
if (slave != null) {
slave.shutdown().await();
}
}
}
/*@Test
public void testActiveReplicationRefresh() throws Exception {
Peer master = null;
try {
// setup
Peer[] peers = Utils2.createNodes(100, rnd, 4001, 5 * 1000, true);
master = peers[0];
Number160 locationKey = master.getPeerID().xor(new Number160(77));
// store
Data data = new Data("Test");
FutureDHT futureDHT = master.put(locationKey).setData(data).start();
futureDHT.awaitUninterruptibly();
futureDHT.getFutureRequests().awaitUninterruptibly();
Assert.assertEquals(true, futureDHT.isSuccess());
// bootstrap
List<FutureBootstrap> tmp2 = new ArrayList<FutureBootstrap>();
for (int i = 0; i < peers.length; i++) {
if (peers[i] != master) {
tmp2.add(peers[i].bootstrap().setPeerAddress(master.getPeerAddress()).start());
}
}
for (FutureBootstrap fm : tmp2) {
fm.awaitUninterruptibly();
Assert.assertEquals(true, fm.isSuccess());
}
for (int i = 0; i < peers.length; i++) {
for (BaseFuture baseFuture : peers[i].getPendingFutures().keySet())
baseFuture.awaitUninterruptibly();
}
// wait for refresh
Thread.sleep(6000);
//
TreeSet<PeerAddress> tmp = new TreeSet<PeerAddress>(master.getPeerBean().getPeerMap()
.createPeerComparator(locationKey));
tmp.add(master.getPeerAddress());
for (int i = 0; i < peers.length; i++)
tmp.add(peers[i].getPeerAddress());
int i = 0;
for (PeerAddress closest : tmp) {
final FutureChannelCreator fcc = master.getConnectionBean().getConnectionReservation()
.reserve(1);
fcc.awaitUninterruptibly();
ChannelCreator cc = fcc.getChannelCreator();
FutureResponse futureResponse = master.getStoreRPC().get(closest, locationKey,
DHTBuilder.DEFAULT_DOMAIN, null, null, null, false, false, false, false, cc, false);
futureResponse.awaitUninterruptibly();
master.getConnectionBean().getConnectionReservation().release(cc);
Assert.assertEquals(true, futureResponse.isSuccess());
Assert.assertEquals(1, futureResponse.getResponse().getDataMap().size());
i++;
if (i >= 5)
break;
}
} finally {
if (master != null) {
master.shutdown().await();
}
}
}*/
private static int countOnline(Peer[] peers, PeerAddress peerAddress) {
int counter = 0;
for (Peer peer : peers) {
if (peer.getPeerBean().peerMap().contains(peerAddress)) {
counter++;
}
}
return counter;
}
private void setData(Peer peer, String location, String domain, String content, Data data)
throws IOException {
final Number160 locationKey = Number160.createHash(location);
final Number160 domainKey = Number160.createHash(domain);
final Number160 contentKey = Number160.createHash(content);
peer.getPeerBean().storage().put(locationKey, domainKey, contentKey, data, null, false, false);
}
private void send2(final Peer p1, final Peer p2, final ByteBuf toStore1, final int count)
throws IOException {
if (count == 0) {
System.err.println("failed miserably");
return;
}
Buffer b = new Buffer(toStore1);
FutureResponse fd = p1.sendDirect(p2.getPeerAddress()).setBuffer(b).start();
fd.addListener(new BaseFutureAdapter<FutureResponse>() {
@Override
public void operationComplete(FutureResponse future) throws Exception {
if (future.isFailed()) {
// System.err.println(future.getFailedReason());
send2(p1, p2, toStore1, count - 1);
}
}
});
}
private void send1(final Peer p1, final Peer p2, final byte[] toStore1, final int count)
throws IOException {
if (count == 0) {
System.err.println("failed miserably");
return;
}
FutureResponse fd = p1.sendDirect(p2.getPeerAddress()).setObject(toStore1).start();
fd.addListener(new BaseFutureAdapter<FutureResponse>() {
@Override
public void operationComplete(FutureResponse future) throws Exception {
if (future.isFailed()) {
// System.err.println(future.getFailedReason());
send1(p1, p2, toStore1, count - 1);
}
}
});
}
private void testForArray(Peer peer, Number160 locationKey, boolean find) {
Collection<Number160> tmp = new ArrayList<Number160>();
tmp.add(new Number160(5));
Map<Number480, Data> test = peer.getPeerBean().storage()
.subMap(locationKey, Number160.createHash("test"), Number160.ZERO, Number160.MAX_VALUE);
if (find) {
Assert.assertEquals(1, test.size());
Assert.assertEquals(
44444,
test.get(
new Number480(new Number320(locationKey, Number160.createHash("test")),
new Number160(5))).length());
} else
Assert.assertEquals(0, test.size());
}
private Peer[] createNodes(Peer master, int nr, Random rnd) throws Exception {
Peer[] peers = new Peer[nr];
for (int i = 0; i < nr; i++) {
peers[i] = new PeerMaker(new Number160(rnd)).p2pId(1).masterPeer(master).makeAndListen();
}
return peers;
}
private Peer[] createNodes(Peer master, int nr) throws Exception {
return createNodes(master, nr, rnd);
}
}