package com.limegroup.gnutella; import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Iterator; import junit.framework.Test; import com.limegroup.gnutella.messages.Message; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.routing.QueryRouteTable; import com.limegroup.gnutella.routing.RouteTableMessage; import com.limegroup.gnutella.stubs.ActivityCallbackStub; /** * Tests that an Ultrapeer correctly handles all aspects of PushProxy. For * example: * 1) handles the VendorMessage exchange as expected * 2) handles HTTP requests as expected, forwarding on a PushRequest * * This class tests a lot of different pieces of code. * * ULTRAPEER_1 ---- CENTRAL TEST ULTRAPEER ---- ULTRAPEER_2 * | * | * | * LEAF * * The leaf must be connected in the first test. */ public final class ServerSideBrowseHostTest extends ServerSideTestCase { protected static int TIMEOUT = 2000; public ServerSideBrowseHostTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ServerSideBrowseHostTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Integer numUPs() { return new Integer(1); } public static Integer numLeaves() { return new Integer(1); } public static ActivityCallback getActivityCallback() { return new ActivityCallbackStub(); } public static void setUpQRPTables() throws Exception { // for Ultrapeer 1 QueryRouteTable qrt = new QueryRouteTable(); qrt.add("leehsus"); qrt.add("berkeley"); for (Iterator iter=qrt.encode(null).iterator(); iter.hasNext(); ) { ULTRAPEER[0].send((RouteTableMessage)iter.next()); assertTrue(ULTRAPEER[0].isOpen()); ULTRAPEER[0].flush(); } } // BEGIN TESTS // ------------------------------------------------------ public void testResultsIndicateBrowseHostSupport() throws Exception { drainAll(); // make sure leaf is sharing assertEquals(2, ROUTER_SERVICE.getFileManager().getNumFiles()); // send a query that should be answered QueryRequest query = new QueryRequest(GUID.makeGuid(), (byte) 1, "berkeley", null, null, null, null, false, 0, false, 0); ULTRAPEER[0].send(query); ULTRAPEER[0].flush(); // await a response Message m = null; do { m = ULTRAPEER[0].receive(TIMEOUT); } while (!(m instanceof QueryReply)) ; // confirm it supports browse host QueryReply reply = (QueryReply) m; assertTrue(reply.getSupportsBrowseHost()); } public void testHTTPRequest() throws Exception { Message m = null; String result = null; Socket s = new Socket("localhost", PORT); ByteReader in = new ByteReader(s.getInputStream()); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); // first test a GET out.write("GET / HTTP/1.1\r\n"); out.write("Accept: application/x-gnutella-packets\r\n"); out.write("\r\n"); out.flush(); // check opcode result = in.readLine(); assertGreaterThan(result, -1, result.indexOf("200")); // get to the replies.... String currLine = null; do { currLine = in.readLine(); } while ((currLine != null) && !currLine.equals("")); QueryReply qr = (QueryReply) Message.read(s.getInputStream()); assertEquals(2, qr.getResultCount()); assertNull(in.readLine()); s.close(); in.close(); } public void testBadHTTPRequest1() throws Exception { Message m = null; String result = null; Socket s = new Socket("localhost", PORT); ByteReader in = new ByteReader(s.getInputStream()); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); // first test a GET out.write("GET / HTTP/1.1\r\n"); out.write("\r\n"); out.flush(); // check opcode result = in.readLine(); assertGreaterThan(result, -1, result.indexOf("406")); s.close(); in.close(); } }