package net.tomp2p.rpc; import java.util.Random; import net.tomp2p.connection2.ChannelCreator; import net.tomp2p.connection2.DefaultConnectionConfiguration; import net.tomp2p.futures.FutureChannelCreator; import net.tomp2p.futures.FutureResponse; import net.tomp2p.p2p.Peer; import net.tomp2p.p2p.PeerMaker; import net.tomp2p.p2p.builder.AddTrackerBuilder; import net.tomp2p.p2p.builder.GetTrackerBuilder; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.storage.Data; import net.tomp2p.utils.Utils; import org.junit.Assert; import org.junit.Test; public class TestTracker { final static Random rnd = new Random(0); @Test public void testTrackerPut() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); Number160 loc = new Number160(rnd); Number160 dom = new Number160(rnd); // make a good guess based on the config and the maxium tracker that // can be found SimpleBloomFilter<Number160> bloomFilter = new SimpleBloomFilter<Number160>(100, 10); FutureChannelCreator fcc = sender.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); AddTrackerBuilder addTrackerBuilder = new AddTrackerBuilder(sender, loc); addTrackerBuilder.setDomainKey(dom); addTrackerBuilder.setBloomFilter(bloomFilter); FutureResponse fr = sender.getTrackerRPC().addToTracker(recv1.getPeerAddress(), addTrackerBuilder, cc); fr.awaitUninterruptibly(); System.err.println(fr.getFailedReason()); Assert.assertEquals(true, fr.isSuccess()); bloomFilter = new SimpleBloomFilter<Number160>(100, 10); GetTrackerBuilder getTrackerBuilder = new GetTrackerBuilder(sender, loc); getTrackerBuilder.setKnownPeers(bloomFilter); fr = sender.getTrackerRPC().getFromTracker(recv1.getPeerAddress(), getTrackerBuilder, cc); fr.awaitUninterruptibly(); System.err.println(fr.getFailedReason()); Assert.assertEquals(true, fr.isSuccess()); PeerAddress peerAddress = fr.getResponse().getTrackerData(0).getPeerAddresses().keySet() .iterator().next(); Assert.assertEquals(sender.getPeerAddress(), peerAddress); } catch (Throwable t) { t.printStackTrace(); Assert.fail(); } finally { if (cc != null) { cc.shutdown().awaitListenersUninterruptibly(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testTrackerPutNoBloomFilter() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x50")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x20")).p2pId(55).ports(8088).makeAndListen(); Number160 loc = new Number160(rnd); Number160 dom = new Number160(rnd); // make a good guess based on the config and the maxium tracker that // can be found FutureChannelCreator fcc = sender.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); AddTrackerBuilder addTrackerBuilder = new AddTrackerBuilder(sender, loc); addTrackerBuilder.setDomainKey(dom); FutureResponse fr = sender.getTrackerRPC().addToTracker(recv1.getPeerAddress(), addTrackerBuilder, cc); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); GetTrackerBuilder getTrackerBuilder = new GetTrackerBuilder(sender, loc); fr = sender.getTrackerRPC().getFromTracker(recv1.getPeerAddress(), getTrackerBuilder, cc); fr.awaitUninterruptibly(); System.err.println(fr.getFailedReason()); Assert.assertEquals(true, fr.isSuccess()); PeerAddress peerAddress = fr.getResponse().getTrackerData(0).getPeerAddresses().keySet() .iterator().next(); Assert.assertEquals(sender.getPeerAddress(), peerAddress); } finally { if (cc != null) { cc.shutdown().awaitListenersUninterruptibly(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testTrackerPutAttachment() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); Number160 loc = new Number160(rnd); Number160 dom = new Number160(rnd); // make a good guess based on the config and the maxium tracker that // can be found FutureChannelCreator fcc = sender.getConnectionBean().reservation().create(1, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); AddTrackerBuilder addTrackerBuilder = new AddTrackerBuilder(sender, loc); addTrackerBuilder.setDomainKey(dom); addTrackerBuilder.setAttachement(new Data("data")); FutureResponse fr = sender.getTrackerRPC().addToTracker(recv1.getPeerAddress(), addTrackerBuilder, cc); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); GetTrackerBuilder getTrackerBuilder = new GetTrackerBuilder(sender, loc); getTrackerBuilder.setExpectAttachement(true); fr = sender.getTrackerRPC().getFromTracker(recv1.getPeerAddress(), getTrackerBuilder, cc); fr.awaitUninterruptibly(); System.err.println("ERR:" + fr.getFailedReason()); Assert.assertEquals(true, fr.isSuccess()); PeerAddress peerAddress = fr.getResponse().getTrackerData(0).getPeerAddresses().keySet() .iterator().next(); Assert.assertEquals(sender.getPeerAddress(), peerAddress); Data tmp = fr.getResponse().getTrackerData(0).getPeerAddresses().values().iterator().next(); Assert.assertEquals(tmp.object(), "data"); } finally { if (cc != null) { cc.shutdown().awaitListenersUninterruptibly(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testTrackerBloomFilter() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); Number160 loc = new Number160(rnd); Number160 dom = new Number160(rnd); // make a good guess based on the config and the maxium tracker that // can be found SimpleBloomFilter<Number160> bloomFilter = new SimpleBloomFilter<Number160>(100, 10); FutureChannelCreator fcc = sender.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); AddTrackerBuilder addTrackerBuilder = new AddTrackerBuilder(sender, loc); addTrackerBuilder.setDomainKey(dom); addTrackerBuilder.setAttachement(new Data("data")); addTrackerBuilder.setBloomFilter(bloomFilter); FutureResponse fr = sender.getTrackerRPC().addToTracker(recv1.getPeerAddress(), addTrackerBuilder, cc); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); bloomFilter.add(sender.getPeerID()); GetTrackerBuilder getTrackerBuilder = new GetTrackerBuilder(sender, loc); getTrackerBuilder.setExpectAttachement(true); getTrackerBuilder.setKnownPeers(bloomFilter); fr = sender.getTrackerRPC().getFromTracker(recv1.getPeerAddress(), getTrackerBuilder, cc); fr.awaitUninterruptibly(); System.err.println(fr.getFailedReason()); Assert.assertEquals(true, fr.isSuccess()); Assert.assertEquals(0, fr.getResponse().getTrackerData(0).size()); } catch (Throwable t) { t.printStackTrace(); Assert.fail(); } finally { if (cc != null) { cc.shutdown().awaitListenersUninterruptibly(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } }