package org.limewire.http; import java.nio.ByteBuffer; import junit.framework.Test; import org.apache.http.ConnectionReuseStrategy; import org.apache.http.HttpResponseFactory; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.impl.nio.DefaultServerIOEventDispatch; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.HttpProcessor; import org.limewire.http.protocol.ExtendedAsyncNHttpServiceHandler; import org.limewire.http.reactor.HttpChannel; import org.limewire.http.reactor.HttpIOSession; import org.limewire.util.BaseTestCase; import org.limewire.util.StringUtils; public class HttpChannelTest extends BaseTestCase { private HttpParams parms; private ConnectionReuseStrategy connStrategy; private HttpResponseFactory responseFactory; private HttpProcessor httpProcessor; private ExtendedAsyncNHttpServiceHandler serviceHandler; private DefaultServerIOEventDispatch eventDispatch; public HttpChannelTest(String name) { super(name); } public static Test suite() { return buildTestSuite(HttpChannelTest.class); } @Override protected void setUp() throws Exception { parms = new BasicHttpParams(); connStrategy = new DefaultConnectionReuseStrategy(); responseFactory = new DefaultHttpResponseFactory(); httpProcessor = new BasicHttpProcessor(); serviceHandler = new ExtendedAsyncNHttpServiceHandler(httpProcessor, responseFactory, connStrategy, parms); eventDispatch = new DefaultServerIOEventDispatch(serviceHandler, parms); } public void testPushBackReadAllAtOnce() throws Exception { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); StubReadableChannel srcChannel = new StubReadableChannel("abc"); HttpChannel channel = new HttpChannel(session, eventDispatch, "GET"); channel.setReadChannel(srcChannel); ByteBuffer dst = ByteBuffer.allocate(8); int read = channel.read(dst); assertEquals(6, read); assertEquals(6, dst.position()); assertEquals("GETabc", StringUtils.getUTF8String(dst.array(), 0, 6)); read = channel.read(dst); assertEquals(0, read); assertEquals(6, dst.position()); } public void testPushBackReadSlowly() throws Exception { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); StubReadableChannel srcChannel = new StubReadableChannel("abc"); HttpChannel channel = new HttpChannel(session, eventDispatch, "GET"); channel.setReadChannel(srcChannel); ByteBuffer dst = ByteBuffer.allocate(2); int read = channel.read(dst); assertEquals(2, read); dst.flip(); assertEquals("GE", StringUtils.getUTF8String(dst.array(), 0, 2)); dst.clear(); read = channel.read(dst); assertEquals(2, read); assertEquals("Ta", StringUtils.getUTF8String(dst.array(), 0, 2)); dst.clear(); read = channel.read(dst); assertEquals(2, read); assertEquals("bc", StringUtils.getUTF8String(dst.array(), 0, 2)); dst.clear(); read = channel.read(dst); assertEquals(0, read); assertEquals(0, dst.position()); } public void testNoPushBack() throws Exception { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); StubReadableChannel srcChannel = new StubReadableChannel("abc"); HttpChannel channel = new HttpChannel(session, eventDispatch, null); channel.setReadChannel(srcChannel); ByteBuffer dst = ByteBuffer.allocate(4); int read = channel.read(dst); assertEquals(3, read); dst.flip(); assertEquals("abc", StringUtils.getUTF8String(dst.array(), 0, 3)); } public void testDelayedClosing() throws Exception { StubSocket socket = new StubSocket(); StubIOSession session = new StubIOSession(socket); StubWriteableChannel sink = new StubWriteableChannel(5); HttpChannel channel = new HttpChannel(session, eventDispatch, null); session.setHttpChannel(channel); channel.setWriteChannel(sink); assertTrue(channel.isOpen()); assertFalse(session.isShutdown()); sink.write(ByteBuffer.allocate(5)); assertTrue(sink.hasBufferedOutput()); channel.closeWhenBufferedOutputHasBeenFlushed(); assertFalse(session.isShutdown()); channel.handleWrite(); assertFalse(session.isShutdown()); sink.getBuffer().clear(); channel.handleWrite(); assertTrue(session.isShutdown()); } public void testClosedInstantly() throws Exception { StubSocket socket = new StubSocket(); StubIOSession session = new StubIOSession(socket); StubWriteableChannel sink = new StubWriteableChannel(5); HttpChannel channel = new HttpChannel(session, eventDispatch, null); session.setHttpChannel(channel); channel.setWriteChannel(sink); assertFalse(session.isShutdown()); channel.closeWhenBufferedOutputHasBeenFlushed(); assertTrue(session.isShutdown()); } }