package org.limewire.http;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import junit.framework.Test;
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.client.methods.HttpHead;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
import org.limewire.http.auth.AuthenticationInterceptor;
import org.limewire.http.auth.AuthenticationInterceptorImpl;
import org.limewire.http.auth.AuthenticatorRegistryImpl;
import org.limewire.http.handler.BasicMimeTypeProvider;
import org.limewire.http.handler.FileRequestHandler;
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;
public class BasicHttpAcceptorTest extends BaseTestCase {
private static final int PORT = 6668;
private static final int TIMEOUT = 1000;
private HttpClient client;
private BasicHttpAcceptor httpAcceptor;
private SocketAcceptor acceptor;
private ConnectionDispatcher connectionDispatcher;
public BasicHttpAcceptorTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(BasicHttpAcceptorTest.class);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
@Override
protected void setUp() throws Exception {
client = new DefaultHttpClient();
}
@Override
protected void tearDown() throws Exception {
stopAcceptor();
}
private void initializeAcceptor(int timeout, String... methods) throws Exception {
connectionDispatcher = new ConnectionDispatcherImpl(new SimpleNetworkInstanceUtils());
acceptor = new SocketAcceptor(connectionDispatcher);
acceptor.bind(PORT);
httpAcceptor = new TestBasicHttpAcceptor(BasicHttpAcceptor
.createDefaultParams("agent", timeout),
new AuthenticationInterceptorImpl(new AuthenticatorRegistryImpl()),
methods);
httpAcceptor.start();
connectionDispatcher.addConnectionAcceptor(httpAcceptor, true, httpAcceptor.getHttpMethods());
}
private void stopAcceptor() throws Exception {
if (httpAcceptor != null) {
httpAcceptor.stop();
httpAcceptor = null;
}
if (acceptor != null) {
acceptor.unbind();
acceptor = null;
}
HttpTestUtils.waitForNIO();
}
public void testDefaultHandlerHead() throws IOException, Exception {
initializeAcceptor(TIMEOUT, "HEAD");
HttpHead method = new HttpHead("http://localhost:" + PORT + "/");
HttpResponse result = null;
try {
result = client.execute(method);
assertEquals(HttpStatus.SC_NOT_IMPLEMENTED, result.getStatusLine().getStatusCode());
} finally {
HttpClientUtils.releaseConnection(result);
}
}
public void testDefaultHandlerGet() throws IOException, Exception {
initializeAcceptor(TIMEOUT, "GET");
HttpGet method = new HttpGet("http://localhost:" + PORT + "/");
HttpResponse result = null;
try {
result = client.execute(method);
assertEquals(HttpStatus.SC_NOT_IMPLEMENTED, result.getStatusLine().getStatusCode());
} finally {
HttpClientUtils.releaseConnection(result);
}
}
public void testWatchdogTriggeredTimeout() throws IOException, Exception {
initializeAcceptor(TIMEOUT, "GET");
File file = File.createTempFile("lime", null);
byte[] data = new byte[1 * 1000 * 1000];
Arrays.fill(data, (byte) 'a');
HttpTestUtils.writeData(file, data);
FileRequestHandler handler = new FileRequestHandler(file.getParentFile(), new BasicMimeTypeProvider());
handler.setTimeout(100);
httpAcceptor.registerHandler("*", handler);
HttpGet method = new HttpGet("http://localhost:" + PORT + "/" + file.getName());
HttpResponse response = null;
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
InputStream in = response.getEntity().getContent();
assertEquals('a', in.read());
Thread.sleep(200);
int i = 1;
while (in.read() != -1) {
i++;
}
// TODO assertFalse(client.getHttpConnectionManager().getConnection(hostConfig).isOpen());
assertLessThan("Expected connection close", data.length, i);
} finally {
HttpClientUtils.releaseConnection(response);
}
}
public void testWatchdogDoesNotTimeout() throws Exception {
initializeAcceptor(TIMEOUT, "GET");
File file = File.createTempFile("lime", null);
byte[] data = new byte[1 * 1000 * 1000];
Arrays.fill(data, (byte) 'a');
HttpTestUtils.writeData(file, data);
FileRequestHandler handler = new FileRequestHandler(file.getParentFile(), new BasicMimeTypeProvider());
handler.setTimeout(100);
httpAcceptor.registerHandler("*", handler);
// check that it doesn't timeout
HttpGet method = new HttpGet("http://localhost:" + PORT + "/" + file.getName());
HttpResponse response = null;
try {
response = client.execute(method);
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
InputStream in = response.getEntity().getContent();
assertEquals('a', in.read());
int i = 1;
byte[] buffer = new byte[1024];
int l;
while ((l = in.read(buffer)) != -1) {
i += l;
}
assertEquals(data.length, i);
} finally {
HttpClientUtils.releaseConnection(response);
}
}
public void testInvalidMethod() throws IOException, Exception {
initializeAcceptor(TIMEOUT, "GET");
HttpHead method = new HttpHead("http://localhost:" + PORT + "/");
HttpResponse result = null;
try {
result = client.execute(method);
fail("Expected IOException, got: " + result.getStatusLine().getStatusCode());
} catch (IOException expected) {
} finally {
HttpClientUtils.releaseConnection(result);
}
}
/**
* non-abstract class for testing.
*/
private static class TestBasicHttpAcceptor extends BasicHttpAcceptor {
public TestBasicHttpAcceptor(HttpParams params,
AuthenticationInterceptor authenticationInterceptor, String[] supportedMethods) {
super(params, authenticationInterceptor, supportedMethods);
}
}
}