package com.limegroup.gnutella;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
import junit.framework.Test;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.vendor.HeadPing;
import com.limegroup.gnutella.messages.vendor.HeadPong;
import com.limegroup.gnutella.settings.ConnectionSettings;
import com.limegroup.gnutella.stubs.ActivityCallbackStub;
import com.limegroup.gnutella.stubs.FileDescStub;
import com.limegroup.gnutella.stubs.FileManagerStub;
import com.limegroup.gnutella.util.BaseTestCase;
import com.limegroup.gnutella.util.PrivilegedAccessor;
/**
* tests the server side handling of head pings through UDP.
*/
public class ServerSideHeadTest extends BaseTestCase {
public ServerSideHeadTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ServerSideHeadTest.class);
}
static DatagramSocket socket1, socket2;
static int port1, port2;
static InetSocketAddress addr1, addr2;
static HeadPing ping1, ping2;
public static void globalSetUp() throws Exception {
ConnectionSettings.SOLICITED_GRACE_PERIOD.setValue(1000l);
ConnectionSettings.LOCAL_IS_PRIVATE.setValue(false);
port1 = 10000;
port2 = 20000;
socket1 = new DatagramSocket(port1);
socket2 = new DatagramSocket(port2);
socket1.setSoTimeout(300);
socket2.setSoTimeout(300);
ping1 = new HeadPing(FileManagerStub._notHave);
ping2 = new HeadPing(URN.createSHA1Urn(FileDescStub.DEFAULT_URN));
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
ping1.write(baos1);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
ping2.write(baos2);
addr1 = new InetSocketAddress(InetAddress.getLocalHost(), port1);
addr2 = new InetSocketAddress(InetAddress.getLocalHost(), port2);
FileManagerStub fmanager = new FileManagerStub();
RouterService service = new RouterService(new ActivityCallbackStub());
service.start();
PrivilegedAccessor.setValue(RouterService.class,"fileManager",fmanager);
}
public void tearDown() throws Exception {
// Thread.sleep(ConnectionSettings.SOLICITED_GRACE_PERIOD.getValue());
}
public static void globalTearDown() throws Exception {
socket1.close();
socket2.close();
}
public void testGeneralBehavior() throws Exception{
MessageRouter router = RouterService.getMessageRouter();
router.handleUDPMessage(ping1,addr1);
Thread.sleep(100);
DatagramPacket received = new DatagramPacket(new byte[1024],1024);
socket1.receive(received);
HeadPong pong = (HeadPong)
Message.read(new ByteArrayInputStream(received.getData()));
assertTrue(Arrays.equals(ping1.getGUID(),pong.getGUID()));
router.handleUDPMessage(ping2,addr2);
Thread.sleep(100);
received = new DatagramPacket(new byte[1024],1024);
socket2.receive(received);
pong = (HeadPong)
Message.read(new ByteArrayInputStream(received.getData()));
assertTrue(Arrays.equals(ping2.getGUID(),pong.getGUID()));
//and if we sleep some time, we can send from the first host again
Thread.sleep(ConnectionSettings.SOLICITED_GRACE_PERIOD.getValue());
router.handleUDPMessage(ping1,addr1);
Thread.sleep(100);
received = new DatagramPacket(new byte[1024],1024);
socket1.receive(received);
pong = (HeadPong)
Message.read(new ByteArrayInputStream(received.getData()));
assertTrue(Arrays.equals(ping1.getGUID(),pong.getGUID()));
}
}