package com.limegroup.gnutella; import java.io.IOException; import java.net.DatagramSocket; import java.net.ServerSocket; import junit.framework.Test; import com.limegroup.gnutella.stubs.ActivityCallbackStub; public class AcceptorTest extends com.limegroup.gnutella.util.BaseTestCase { private static Acceptor acceptThread; public AcceptorTest(String name) { super(name); } public static Test suite() { return buildTestSuite(AcceptorTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static void globalSetUp() throws Exception { new RouterService(new ActivityCallbackStub()); RouterService.getConnectionManager().initialize(); // start it up! acceptThread = new Acceptor(); acceptThread.start(); // Give thread time to find and open it's sockets. This race condition // is tolerated in order to speed up LimeWire startup try { Thread.sleep(2000); } catch (InterruptedException ex) {} } public void setUp() throws Exception { //shut off the various services, //if an exception is thrown, something bad happened. acceptThread.setListeningPort(0); } public void tearDown() throws Exception { //shut off the various services, //if an exception is thrown, something bad happened. acceptThread.setListeningPort(0); } /** * This test checks to ensure that Acceptor.setListeningPort * cannot use a port if the UDP part is already bound. */ public void testCannotUseBoundUDPPort() { int portToTry = 2000; DatagramSocket udp = null; while (true) { // get a free port for UDP traffic. try { udp = new DatagramSocket(portToTry); break; } catch (Exception e) { portToTry++; continue; } } try { acceptThread.setListeningPort(portToTry); assertTrue("had no trouble binding UDP port!", false); } catch (IOException expected) { udp.close(); } } /** * This test checks to ensure that Acceptor.setListeningPort * cannot use port if the TCP part is already bound. */ public void testCannotUseBoundTCPPort() { int portToTry = 2000; ServerSocket tcp = null; while (true) { // get a free port for UDP traffic. try { tcp = new ServerSocket(portToTry); break; } catch (Exception e) { portToTry++; continue; } } try { acceptThread.setListeningPort(portToTry); assertTrue("had no trouble binding TCP port!", false); } catch (IOException expected) { try { tcp.close(); } catch (Exception ignored) {} } } /** * This test checks to make sure that Acceptor.setListeningPort * correctly binds the UDP & TCP port. */ public void testAcceptorBindsUDPandTCP() { int portToTry = 2000; while (true) { try { acceptThread.setListeningPort(portToTry); break; } catch (IOException occupied) { portToTry++; continue; } } try { DatagramSocket udp = new DatagramSocket(portToTry); udp.close(); assertTrue("had no trouble binding UDP to occupied port!", false); } catch (Exception good) {} try { ServerSocket tcp = new ServerSocket(portToTry); tcp.close(); assertTrue("had no trouble binding TCP to occupied port!", false); } catch (Exception good) {} } }