package com.limegroup.gnutella.http; import junit.framework.Test; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.methods.GetMethod; import com.limegroup.gnutella.bootstrap.TestBootstrapServer; import com.limegroup.gnutella.util.BaseTestCase; /** * Tests various things of HttpClient / HttpClientManager. */ public class HttpClientManagerTest extends BaseTestCase { private TestBootstrapServer s1; private TestBootstrapServer s2; private TestBootstrapServer s3; private TestBootstrapServer s4; private TestBootstrapServer s5; private TestBootstrapServer s6; private TestBootstrapServer s7; private TestBootstrapServer s8; private TestBootstrapServer s9; private TestBootstrapServer s10; private TestBootstrapServer s11; private final static int PORT=6700; private final String url1 = "http://127.0.0.1:" + PORT; private final String url2 = "http://127.0.0.1:" + (PORT + 1); private final String url3 = "http://127.0.0.1:" + (PORT + 2); private final String url4 = "http://127.0.0.1:" + (PORT + 3); private final String url5 = "http://127.0.0.1:" + (PORT + 4); private final String url6 = "http://127.0.0.1:" + (PORT + 5); private final String url7 = "http://127.0.0.1:" + (PORT + 6); private final String url8 = "http://127.0.0.1:" + (PORT + 7); private final String url9 = "http://127.0.0.1:" + (PORT + 8); private final String url10 = "http://127.0.0.1:" + (PORT + 9); private final String url11 = "http://127.0.0.1:" + (PORT + 10); public HttpClientManagerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(HttpClientManagerTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public void setUp() throws Exception { //Prepare servers. s1=new TestBootstrapServer(PORT); s2=new TestBootstrapServer(PORT+1); s3=new TestBootstrapServer(PORT+2); s4=new TestBootstrapServer(PORT+3); s5=new TestBootstrapServer(PORT+4); s6=new TestBootstrapServer(PORT+5); s7=new TestBootstrapServer(PORT+6); s8=new TestBootstrapServer(PORT+7); s9=new TestBootstrapServer(PORT+8); s10=new TestBootstrapServer(PORT+9); s11=new TestBootstrapServer(PORT+10); } public void tearDown() throws Exception { s1.shutdown(); s2.shutdown(); s3.shutdown(); s4.shutdown(); s5.shutdown(); s6.shutdown(); s7.shutdown(); s8.shutdown(); s9.shutdown(); s10.shutdown(); s11.shutdown(); Thread.sleep(100); } public void testExecuteMethodRedirecting() throws Exception { HttpMethod get = new GetMethod(url1); HttpClient client = HttpClientManager.getNewClient(); s1.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url2); s2.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url3); s3.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url4); s4.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url5); s5.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url6); s6.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url7); s7.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url8); s8.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url9); s9.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url10); s10.setResponse("HTTP/1.1 303 Redirect\r\nLocation: "+url11); try { HttpClientManager.executeMethodRedirecting(client, get, 2); fail("Should have thrown redirect failure"); } catch(HttpException he) { assertNotNull(s1.getRequest()); assertNotNull(s2.getRequest()); assertNull(s3.getRequest()); // should have stopped after 1 & 2 tried. // expected. } HttpClientManager.executeMethodRedirecting(client, get, 9); assertNotNull(s3.getRequest()); assertNotNull(s4.getRequest()); assertNotNull(s5.getRequest()); assertNotNull(s6.getRequest()); assertNotNull(s7.getRequest()); assertNotNull(s8.getRequest()); assertNotNull(s9.getRequest()); assertNotNull(s10.getRequest()); assertNotNull(s11.getRequest()); } public void testVariousHttpClientThings() throws Exception { HttpMethod get; HttpClient client; // Make sure a bad protocol throws an unexpected exception. try { get = new GetMethod("bad://127.0.0.1:80/file"); fail("expected exception"); } catch(IllegalStateException ise) { // expected. } // Make sure we can deal with strange info such as uppercase // HTTP stuff. get = new GetMethod(url1.toUpperCase()); client = HttpClientManager.getNewClient(); client.executeMethod(get); // Make sure we know what a malformed URL will give us. try { get = new GetMethod("http:asdofih"); fail("expected exception"); } catch(IllegalArgumentException iae) { // expected. } } /** * Tests that HttpClient correctly reuses an open connection * without explicitly telling it to. */ public void testReuseConnection() throws Exception { String responseData = "this is response data"; int length = responseData.length(); s1.setResponseData(responseData); s1.setResponse("HTTP/1.1 200 OK\r\nContent-Length: " + length); s1.setAllowConnectionReuse(true); HttpMethod get; HttpClient client; get = new GetMethod(url1); client = HttpClientManager.getNewClient(); try { client.executeMethod(get); } finally { get.releaseConnection(); } get = new GetMethod(url1); client = HttpClientManager.getNewClient(); try { client.executeMethod(get); } finally { get.releaseConnection(); } assertEquals("wrong connection attempts", 1, s1.getConnectionAttempts()); assertEquals("wrong request attempts", 2, s1.getRequestAttempts()); } /** * Tests that a connection correctly times out after a period idleness. */ public void testConnectionCloses() throws Exception { String responseData = "this is response data"; int length = responseData.length(); s1.setResponseData(responseData); s1.setResponse("HTTP/1.1 200 OK\r\nContent-Length: " + length); s1.setAllowConnectionReuse(true); HttpMethod get; HttpClient client; get = new GetMethod(url1); client = HttpClientManager.getNewClient(); try { client.executeMethod(get); } finally { get.releaseConnection(); } Thread.sleep(1000 * 70); get = new GetMethod(url1); client = HttpClientManager.getNewClient(); try { client.executeMethod(get); } finally { get.releaseConnection(); } assertEquals("wrong connection attempts", 2, s1.getConnectionAttempts()); assertEquals("wrong request attempts", 2, s1.getRequestAttempts()); } }