/* * Copyright 2013 Thomas Bocek * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package net.tomp2p.rpc; import net.tomp2p.Utils2; import net.tomp2p.connection.ChannelCreator; import net.tomp2p.connection.DefaultConnectionConfiguration; import net.tomp2p.futures.FutureChannelCreator; import net.tomp2p.futures.FutureResponse; import net.tomp2p.message.Message.Type; import net.tomp2p.message.NeighborSet; import net.tomp2p.p2p.Peer; import net.tomp2p.p2p.PeerBuilder; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.rpc.NeighborRPC.SearchValues; 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 TestNeighbor { public static final int PORT_TCP = 5001; public static final int PORT_UDP = 5002; @Rule public TestRule watcher = new TestWatcher() { protected void starting(Description description) { System.out.println("Starting test: " + description.getMethodName()); } }; @Test public void testNeigbhor() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).start(); PeerAddress[] pa = Utils2.createDummyAddress(300, PORT_TCP, PORT_UDP); for (int i = 0; i < pa.length; i++) { sender.peerBean().peerMap().peerFound(pa[i], null, null, null); } new NeighborRPC(sender.peerBean(), sender.connectionBean()); recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).start(); NeighborRPC neighbors2 = new NeighborRPC(recv1.peerBean(), recv1.connectionBean()); FutureChannelCreator fcc = recv1.connectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.channelCreator(); SearchValues v = new SearchValues(new Number160("0x1"), null); FutureResponse fr = neighbors2.closeNeighbors(sender.peerAddress(), v, Type.REQUEST_2, cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); // Thread.sleep(10000000); Assert.assertEquals(true, fr.isSuccess()); NeighborSet pas = fr.responseMessage().neighborsSet(0); // we are able to fit 40 neighbors into 1400 bytes Assert.assertEquals(30, pas.size()); Assert.assertEquals(new Number160("0x1"), pas.neighbors().iterator().next().peerId()); Assert.assertEquals(PORT_TCP, pas.neighbors().iterator().next().ipv4Socket().tcpPort()); Assert.assertEquals(PORT_UDP, pas.neighbors().iterator().next().ipv4Socket().udpPort()); cc.shutdown(); } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testNeigbhorTCP() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).start(); PeerAddress[] pa = Utils2.createDummyAddress(300, PORT_TCP, PORT_UDP); for (int i = 0; i < pa.length; i++) { sender.peerBean().peerMap().peerFound(pa[i], null, null, null); } new NeighborRPC(sender.peerBean(), sender.connectionBean()); recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).start(); NeighborRPC neighbors2 = new NeighborRPC(recv1.peerBean(), recv1.connectionBean()); FutureChannelCreator fcc = recv1.connectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.channelCreator(); SearchValues v = new SearchValues(new Number160("0x1"), null); DefaultConnectionConfiguration d = new DefaultConnectionConfiguration(); d.forceTCP(); FutureResponse fr = neighbors2.closeNeighbors(sender.peerAddress(), v, Type.REQUEST_2, cc, d); fr.awaitUninterruptibly(); System.err.println(fr.failedReason()); // Thread.sleep(10000000); Assert.assertEquals(true, fr.isSuccess()); NeighborSet pas = fr.responseMessage().neighborsSet(0); // we are able to fit 40 neighbors into 1400 bytes Assert.assertEquals(30, pas.size()); Assert.assertEquals(new Number160("0x1"), pas.neighbors().iterator().next().peerId()); Assert.assertEquals(PORT_TCP, pas.neighbors().iterator().next().ipv4Socket().tcpPort()); Assert.assertEquals(PORT_UDP, pas.neighbors().iterator().next().ipv4Socket().udpPort()); cc.shutdown(); } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testNeigbhor2() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).start(); recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).start(); new NeighborRPC(sender.peerBean(), sender.connectionBean()); NeighborRPC neighbors2 = new NeighborRPC(recv1.peerBean(), recv1.connectionBean()); FutureChannelCreator fcc = recv1.connectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.channelCreator(); SearchValues v = new SearchValues(new Number160("0x30"), null); FutureResponse fr = neighbors2.closeNeighbors(sender.peerAddress(), v, Type.REQUEST_2, cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); NeighborSet pas = fr.responseMessage().neighborsSet(0); // I see no one, not evenmyself. My peer was added in the overflow map Assert.assertEquals(0, pas.size()); cc.shutdown(); } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testNeigbhorFail() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).start(); recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).start(); new NeighborRPC(sender.peerBean(), sender.connectionBean()); NeighborRPC neighbors2 = new NeighborRPC(recv1.peerBean(), recv1.connectionBean()); FutureChannelCreator fcc = recv1.connectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.channelCreator(); try { SearchValues v = new SearchValues(new Number160("0x30"), null); neighbors2.closeNeighbors(sender.peerAddress(), v, Type.EXCEPTION, cc, new DefaultConnectionConfiguration()); Assert.fail(""); } catch (IllegalArgumentException i) { cc.shutdown(); } } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } }