package com.limegroup.gnutella; import java.io.IOException; import junit.framework.Test; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.nio.NHttpConnection; import org.apache.http.nio.entity.ConsumingNHttpEntity; import org.apache.http.nio.protocol.NHttpRequestHandler; import org.apache.http.nio.protocol.SimpleNHttpRequestHandler; import org.apache.http.protocol.HttpContext; import org.cybergarage.http.HTTPStatus; import org.limewire.http.HttpAcceptorListener; import org.limewire.http.auth.AuthenticationInterceptorImpl; import org.limewire.http.auth.AuthenticatorRegistryImpl; import org.limewire.http.httpclient.HttpClientUtils; import org.limewire.io.SimpleNetworkInstanceUtils; import org.limewire.net.ConnectionDispatcher; import org.limewire.net.ConnectionDispatcherImpl; import org.limewire.net.SocketAcceptor; import org.limewire.util.BaseTestCase; import org.limewire.nio.NIOTestUtils; //ITEST public class HTTPAcceptorTest extends BaseTestCase { private static final int PORT = 6668; private HTTPAcceptor httpAcceptor; private HttpClient client; private SocketAcceptor socketAcceptor; public HTTPAcceptorTest(String name) { super(name); } public static Test suite() { return buildTestSuite(HTTPAcceptorTest.class); } @Override protected void setUp() throws Exception { ConnectionDispatcher connectionDispatcher = new ConnectionDispatcherImpl(new SimpleNetworkInstanceUtils(false)); socketAcceptor = new SocketAcceptor(connectionDispatcher); httpAcceptor = new HTTPAcceptor(null, new AuthenticationInterceptorImpl(new AuthenticatorRegistryImpl())); connectionDispatcher.addConnectionAcceptor(httpAcceptor, false, httpAcceptor.getHttpMethods()); socketAcceptor.bind(PORT); client = new DefaultHttpClient(); } @Override protected void tearDown() throws Exception { httpAcceptor.stop(); socketAcceptor.unbind(); } public void testGetRequest() throws Exception { httpAcceptor.start(); HttpGet method = new HttpGet("http://localhost:" + PORT + "/"); HttpResponse response = null; try { response = client.execute(method); assertEquals(HTTPStatus.BAD_REQUEST, response.getStatusLine().getStatusCode()); } finally { HttpClientUtils.releaseConnection(response); } method = new HttpGet("http://localhost:" + PORT + "/update.xml"); try { response = client.execute(method); assertEquals(HTTPStatus.BAD_REQUEST, response.getStatusLine().getStatusCode()); } finally { HttpClientUtils.releaseConnection(response); } } public void testAddRemoveAcceptorListener() throws Exception { MyHTTPAcceptorListener listener = new MyHTTPAcceptorListener(); httpAcceptor.addAcceptorListener(listener); httpAcceptor.start(); assertFalse(listener.opened); assertFalse(listener.closed); HttpGet method = new HttpGet("http://localhost:" + PORT + "/"); HttpResponse response = null; try { response = client.execute(method); assertEquals(HTTPStatus.BAD_REQUEST, response.getStatusLine().getStatusCode()); NIOTestUtils.waitForNIO(); assertTrue(listener.opened); // bad request, so connection should have been closed assertTrue(listener.closed); NIOTestUtils.waitForNIO(); NIOTestUtils.waitForNIO(); assertNotNull(listener.response); } finally { HttpClientUtils.releaseConnection(response); } listener.opened = false; listener.closed = false; listener.response = null; httpAcceptor.removeAcceptorListener(listener); method = new HttpGet("http://localhost:" + PORT + "/"); try { client.execute(method); assertFalse(listener.opened); assertFalse(listener.closed); assertNull(listener.response); } finally { HttpClientUtils.releaseConnection(response); } } public void testRegisterUnregisterHandler() throws Exception { NHttpRequestHandler handler = new SimpleNHttpRequestHandler() { public ConsumingNHttpEntity entityRequest(HttpEntityEnclosingRequest request, HttpContext context) throws HttpException, IOException { return null; } @Override public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws org.apache.http.HttpException, IOException { response.setStatusCode(HttpStatus.SC_ACCEPTED); } }; httpAcceptor.start(); httpAcceptor.registerHandler("/", handler); HttpGet method = new HttpGet("http://localhost:" + PORT + "/"); HttpResponse response = null; try { response = client.execute(method); assertEquals(HttpStatus.SC_ACCEPTED, response.getStatusLine().getStatusCode()); } finally { HttpClientUtils.releaseConnection(response); } httpAcceptor.unregisterHandler("/"); method = new HttpGet("http://localhost:" + PORT + "/"); try { response = client.execute(method); assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatusLine().getStatusCode()); } finally { HttpClientUtils.releaseConnection(response); } } private class MyHTTPAcceptorListener implements HttpAcceptorListener { boolean closed; boolean opened; NHttpConnection conn; HttpResponse response; public void connectionClosed(NHttpConnection conn) { this.conn = conn; this.closed = true; } public void connectionOpen(NHttpConnection conn) { this.conn = conn; this.opened = true; } public void responseSent(NHttpConnection conn, HttpResponse response) { this.conn = conn; this.response = response; } } }