package com.limegroup.gnutella.auth; import java.io.ByteArrayOutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; import junit.framework.Test; import com.limegroup.gnutella.Acceptor; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.StandardMessageRouter; import com.limegroup.gnutella.UDPService; import com.limegroup.gnutella.URN; import com.limegroup.gnutella.messages.vendor.ContentRequest; import com.limegroup.gnutella.messages.vendor.ContentResponse; import com.limegroup.gnutella.settings.ContentSettings; import com.limegroup.gnutella.stubs.ActivityCallbackStub; import com.limegroup.gnutella.util.BaseTestCase; import com.limegroup.gnutella.util.IpPort; import com.limegroup.gnutella.util.IpPortImpl; import com.limegroup.gnutella.util.PrivilegedAccessor; public class ContentManagerNetworkTest extends BaseTestCase { private static final String S_URN_1 = "urn:sha1:GLSTHIPQGSSZTS5FJUPAKPZWUGYQYPFB"; private static URN URN_1; private ContentManager mgr; private ContentResponse crOne; private Observer one; private static final int LISTEN_PORT = 9172; private static final int SEND_PORT = 9876; public ContentManagerNetworkTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ContentManagerNetworkTest.class); } public static void globalSetUp() throws Exception { new RouterService(new ActivityCallbackStub(), new StandardMessageRouter()); new Acceptor().setListeningPort(LISTEN_PORT); UDPService.instance().start(); URN_1 = URN.createSHA1Urn(S_URN_1); } public void setUp() throws Exception { ContentSettings.CONTENT_MANAGEMENT_ACTIVE.setValue(true); ContentSettings.USER_WANTS_MANAGEMENTS.setValue(true); mgr = new ContentManager(); crOne = new ContentResponse(URN_1, true); one = new Observer(); assertNull(mgr.getResponse(URN_1)); assertNull(one.urn); assertNull(one.response); } public void teardown() throws Exception { mgr.shutdown(); } public void testMessageSent() throws Exception { InetSocketAddress addr = new InetSocketAddress(SEND_PORT); DatagramSocket socket = new DatagramSocket(addr); socket.setReuseAddress(true); socket.setSoTimeout(5000); mgr.setContentAuthority(new IpPortContentAuthority(new IpPortImpl("127.0.0.1", socket.getLocalPort()))); mgr.request(URN_1, one, 2000); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); socket.receive(packet); byte[] read = packet.getData(); ContentRequest expectSentMsg = new ContentRequest(URN_1); ByteArrayOutputStream out = new ByteArrayOutputStream(); expectSentMsg.write(out); byte[] expectSentBytes = out.toByteArray(); assertEquals(expectSentBytes.length, packet.getLength()); // start at 16, because less than that is the GUID which is random. for(int i = 16; i < expectSentBytes.length; i++) assertEquals("byte[" + i + "] wrong. ", expectSentBytes[i], read[i]); socket.close(); } public void testDelayedRequestSent() throws Exception { InetSocketAddress addr = new InetSocketAddress(SEND_PORT); final DatagramSocket socket = new DatagramSocket(addr); socket.setReuseAddress(true); socket.setSoTimeout(5000); final IpPort authority = new IpPortImpl("127.0.0.1", socket.getLocalPort()); mgr.shutdown(); mgr = new ContentManager() { protected ContentAuthority getDefaultContentAuthority() { return new IpPortContentAuthority(authority); } }; mgr.request(URN_1, one, 2000); mgr.initialize(); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); socket.receive(packet); byte[] read = packet.getData(); ContentRequest expectSentMsg = new ContentRequest(URN_1); ByteArrayOutputStream out = new ByteArrayOutputStream(); expectSentMsg.write(out); byte[] expectSentBytes = out.toByteArray(); assertGreaterThan(30, expectSentBytes.length); assertEquals(expectSentBytes.length, packet.getLength()); // start at 16, because less than that is the GUID which is random. for(int i = 16; i < expectSentBytes.length; i++) assertEquals("byte[" + i + "] wrong. ", expectSentBytes[i], read[i]); socket.close(); } public void testResponseReceived() throws Exception { mgr.shutdown(); mgr = RouterService.getContentManager(); mgr.request(URN_1, one, 4000); UDPService.instance().send(crOne, InetAddress.getLocalHost(), LISTEN_PORT); Thread.sleep(1000); // let the message process. assertNotNull(mgr.getResponse(URN_1)); assertTrue(mgr.getResponse(URN_1).isOK()); assertTrue(mgr.isVerified(URN_1)); assertEquals(one.urn, URN_1); assertEquals(one.response, mgr.getResponse(URN_1)); } private static class Observer implements ContentResponseObserver { private URN urn; private ContentResponseData response; public void handleResponse(URN urn, ContentResponseData response) { this.urn = urn; this.response = response; } } }