package net.tomp2p.p2p; import java.io.IOException; import java.util.NavigableMap; import java.util.Random; import java.util.TreeMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import net.tomp2p.Utils2; import net.tomp2p.message.Message; import net.tomp2p.p2p.builder.BootstrapBuilder; import net.tomp2p.peers.Number160; import net.tomp2p.peers.Number640; import net.tomp2p.peers.PeerMap; import net.tomp2p.peers.PeerMapConfiguration; import net.tomp2p.storage.Data; import net.tomp2p.utils.Pair; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; public class TestBroadcast { private final static Random RND = new Random(42); @Rule public TestRule watcher = new TestWatcher() { protected void starting(Description description) { System.out.println("Starting test: " + description.getMethodName()); } }; @Test public void testBroadcastTCP() 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")).udp(false).start(); StructuredBroadcastHandler d = (StructuredBroadcastHandler) master.broadcastRPC().broadcastHandler(); int counter = 0; while (d.broadcastCounter() < 1000) { Thread.sleep(200); counter++; if (counter > 100) { System.out.println("did not broadcast to 1000 peers, but to " + d.broadcastCounter()); Assert.fail("did not broadcast to 1000 peers, but to " + d.broadcastCounter()); } } System.out.println("msg count: "+d.messageCounter()); System.out.println("DONE: "+d.broadcastCounter()); } finally { if (master != null) { master.shutdown().await(); } } } @Test public void testBroadcastUDP() 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(); StructuredBroadcastHandler d = (StructuredBroadcastHandler) master.broadcastRPC().broadcastHandler(); int counter = 0; while (d.broadcastCounter() < 1000) { Thread.sleep(200); counter++; if (counter > 100) { System.out.println("did not broadcast to 1000 peers, but to " + d.broadcastCounter()); Assert.fail("did not broadcast to 1000 peers, but to " + d.broadcastCounter()); } } System.out.println("msg count: "+d.messageCounter()); System.out.println("DONE: "+d.broadcastCounter()); } finally { if (master != null) { master.shutdown().await(); } } } @Test public void test4Peers() throws IOException, InterruptedException { //create Pair<Peer, MyStructuredBroadcastHandler> pair1 = createPeer(1); Pair<Peer, MyStructuredBroadcastHandler> pair2 = createPeer(2); Pair<Peer, MyStructuredBroadcastHandler> pair3 = createPeer(3); Pair<Peer, MyStructuredBroadcastHandler> pair4 = createPeer(4); //bootstrap bootstrap(pair1.element0(), pair2.element0()); bootstrap(pair1.element0(), pair3.element0()); bootstrap(pair1.element0(), pair4.element0()); //broadcast NavigableMap<Number640, Data> dataMap = new TreeMap<Number640, Data>(); try { dataMap.put(Number640.ZERO, new Data("Test")); } catch (IOException e) { e.printStackTrace(); } pair1.element0().broadcast(Number160.createHash("whatever")).dataMap(dataMap).start(); pair1.element1().await(); pair2.element1().await(); pair3.element1().await(); pair4.element1().await(); } private void bootstrap(Peer master, Peer peer) { BootstrapBuilder bootstrapBuilder = peer.bootstrap(); bootstrapBuilder.peerAddress(master.peerAddress()); bootstrapBuilder.start().awaitUninterruptibly(); } private Pair<Peer, MyStructuredBroadcastHandler> createPeer(int id) throws IOException { Number160 peerId = Number160.createHash(id); PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId).peerNoVerification()); MyStructuredBroadcastHandler m = new MyStructuredBroadcastHandler(id); Peer peer = new PeerBuilder(peerId).broadcastHandler(m).enableBroadcast(true).peerMap(peerMap).ports(2000+id).start(); return new Pair<Peer, MyStructuredBroadcastHandler>(peer, m); } } class MyStructuredBroadcastHandler extends StructuredBroadcastHandler { private final int id; private CountDownLatch received = new CountDownLatch(1); public MyStructuredBroadcastHandler(int id) { this.id=id; } @Override public StructuredBroadcastHandler receive(Message message) { System.out.println("Peer "+id+" got the message"); received.countDown(); return super.receive(message); } public void await() throws InterruptedException { received.await(); } }