package com.limegroup.gnutella; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import org.jmock.Mockery; import junit.framework.Test; import com.google.inject.Injector; import com.google.inject.Stage; import com.limegroup.gnutella.messages.PingReply; import com.limegroup.gnutella.messages.PingReplyFactory; import com.limegroup.gnutella.messages.PingRequest; import com.limegroup.gnutella.messages.PingRequestFactory; import com.limegroup.gnutella.messages.vendor.HeadPong; import com.limegroup.gnutella.util.MessageTestUtils; public class UDPStatusTest extends ClientSideTestCase { private NetworkManager networkManager; private UDPService udpService; private PingReplyFactory pingReplyFactory; private PingRequestFactory pingRequestFactory; public UDPStatusTest(String name) { super(name); } public static Test suite() { return buildTestSuite(UDPStatusTest.class); } @Override public int getNumberOfPeers() { return 1; } @Override protected void setUp() throws Exception { Injector injector = LimeTestUtils.createInjector(Stage.PRODUCTION); super.setUp(injector); networkManager = injector.getInstance(NetworkManager.class); udpService = injector.getInstance(UDPService.class); pingReplyFactory = injector.getInstance(PingReplyFactory.class); pingRequestFactory = injector.getInstance(PingRequestFactory.class); } public void testSolicited() throws Exception { drainAll(); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); assertTrue(udpService.isListening()); DatagramSocket s = new DatagramSocket(6346); s.setSoTimeout(1000); try { PingReply pong = pingReplyFactory.create(udpService.getSolicitedGUID().bytes().clone(), (byte)1,6346,InetAddress.getLocalHost().getAddress()); UDPService.mutateGUID(pong.getGUID(), InetAddress.getLocalHost(), 6346); ByteArrayOutputStream baos = new ByteArrayOutputStream(); pong.write(baos); byte []buf = baos.toByteArray(); s.send(new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(), udpService.getStableUDPPort())); Thread.sleep(100); assertTrue(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); } catch (IOException bad) { fail(bad); } finally { s.close(); } } public void testSolicitedAnyUDP() throws Exception { drainAll(); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); assertTrue(udpService.isListening()); Mockery m = new Mockery(); // any message will do final HeadPong pong = m.mock(HeadPong.class); m.checking(MessageTestUtils.createDefaultMessageExpectations(pong, HeadPong.class)); // local address udpService.processMessage(pong, new InetSocketAddress("127.0.0.1",1000)); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); // non-local address udpService.processMessage(pong, new InetSocketAddress("1.2.3.4",1000)); assertTrue(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); } public void testUnsolicited() throws Exception { drainAll(); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); assertTrue(udpService.isListening()); DatagramSocket s = new DatagramSocket(6346); s.setSoTimeout(1000); try { PingRequest ping = pingRequestFactory.createPingRequest(udpService.getConnectBackGUID().bytes(), (byte)1); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ping.write(baos); byte []buf = baos.toByteArray(); s.send(new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(), udpService.getStableUDPPort())); Thread.sleep(100); assertTrue(networkManager.canReceiveSolicited()); // not possible to accept unsolicited but no solicited assertTrue(networkManager.canReceiveUnsolicited()); } catch (IOException bad) { fail(bad); } finally { s.close(); } } public void testUnsolicitedConnected() throws Exception { drainAll(); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); assertTrue(udpService.isListening()); DatagramSocket s = new DatagramSocket(testUP[0].getPort(),testUP[0].getInetAddress()); s.setSoTimeout(1000); try { PingRequest ping = pingRequestFactory.createPingRequest(udpService.getConnectBackGUID().bytes(), (byte)1); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ping.write(baos); byte []buf = baos.toByteArray(); s.send(new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(), udpService.getStableUDPPort())); Thread.sleep(100); assertFalse(networkManager.canReceiveSolicited()); assertFalse(networkManager.canReceiveUnsolicited()); } catch (IOException bad) { fail(bad); } finally { s.close(); } } }