package org.limewire.http; import junit.framework.TestCase; import org.apache.http.nio.reactor.EventMask; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.SessionBufferStatus; import org.limewire.http.reactor.HttpChannel; import org.limewire.http.reactor.HttpIOSession; public class HttpIOSessionTest extends TestCase { public void testEventMask() { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); HttpChannel channel = new StubHttpChannel(session, new MockIOEventDispatch()); session.setHttpChannel(channel); assertEquals(0, session.getEventMask()); session.setEvent(EventMask.WRITE); assertEquals(EventMask.WRITE, session.getEventMask()); assertFalse(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); session.clearEvent(EventMask.READ); assertEquals(EventMask.WRITE, session.getEventMask()); assertFalse(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); session.setEvent(EventMask.READ); assertEquals(EventMask.READ_WRITE, session.getEventMask()); assertTrue(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); session.setEventMask(EventMask.WRITE); assertEquals(EventMask.WRITE, session.getEventMask()); assertFalse(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); session.setEvent(EventMask.WRITE); assertEquals(EventMask.WRITE, session.getEventMask()); assertFalse(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); session.clearEvent(EventMask.WRITE); assertEquals(0, session.getEventMask()); assertFalse(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.setEventMask(EventMask.READ); assertEquals(EventMask.READ, session.getEventMask()); assertTrue(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.clearEvent(EventMask.READ); assertEquals(0, session.getEventMask()); assertFalse(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.setEventMask(EventMask.READ); assertEquals(EventMask.READ, session.getEventMask()); assertTrue(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.clearEvent(EventMask.WRITE); assertEquals(EventMask.READ, session.getEventMask()); assertTrue(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.setEventMask(EventMask.READ_WRITE); session.clearEvent(EventMask.WRITE); assertEquals(EventMask.READ, session.getEventMask()); assertTrue(channel.isReadInterest()); assertFalse(channel.isWriteInterest()); session.setEventMask(EventMask.READ_WRITE); session.clearEvent(EventMask.READ); assertEquals(EventMask.WRITE, session.getEventMask()); assertFalse(channel.isReadInterest()); assertTrue(channel.isWriteInterest()); } public void testConstructor() { try { new HttpIOSession(null, null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { } StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); assertSame(socket, session.getSocket()); } public void testAttributes() { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); assertNull(session.getAttribute("foo")); session.setAttribute("foo", "bar"); assertEquals("bar", session.getAttribute("foo")); session.setAttribute("foo", "baz"); assertEquals("baz", session.getAttribute("foo")); assertNull(session.getAttribute("baz")); session.removeAttribute("bar"); assertNull(session.getAttribute("bar")); } public void testSocketTimeout() throws Exception { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); assertEquals(0, session.getSocketTimeout()); session.setSocketTimeout(100); assertEquals(100, session.getSocketTimeout()); assertEquals(100, socket.getSoTimeout()); } public void testBufferStatus() throws Exception { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); assertFalse(session.hasBufferedInput()); assertFalse(session.hasBufferedOutput()); StubSessionBufferStatus status = new StubSessionBufferStatus(); session.setBufferStatus(status); assertSame(status, session.getBufferStatus()); assertFalse(session.hasBufferedInput()); assertFalse(session.hasBufferedOutput()); status.bufferedInput = true; assertTrue(session.hasBufferedInput()); assertFalse(session.hasBufferedOutput()); status.bufferedInput = false; assertFalse(session.hasBufferedInput()); assertFalse(session.hasBufferedOutput()); status.bufferedOutput = true; assertFalse(session.hasBufferedInput()); assertTrue(session.hasBufferedOutput()); status.bufferedOutput = false; assertFalse(session.hasBufferedInput()); assertFalse(session.hasBufferedOutput()); } public void testShutdown() { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); assertFalse(session.isClosed()); session.shutdown(); assertTrue(session.isClosed()); session.shutdown(); assertTrue(session.isClosed()); } public void testClose() { StubSocket socket = new StubSocket(); HttpIOSession session = new HttpIOSession(socket, null); StubHttpChannel channel = new StubHttpChannel(session, new MockIOEventDispatch()); session.setHttpChannel(channel); assertFalse(session.isClosed()); session.close(); assertTrue(session.isClosed()); assertTrue(channel.pendingClose); } private static class StubHttpChannel extends HttpChannel { boolean pendingClose; public StubHttpChannel(HttpIOSession session, IOEventDispatch eventDispatch) { super(session, eventDispatch); } @Override public void closeWhenBufferedOutputHasBeenFlushed() { this.pendingClose = true; } } private static class StubSessionBufferStatus implements SessionBufferStatus { private boolean bufferedOutput; private boolean bufferedInput; public boolean hasBufferedInput() { return bufferedInput; } public boolean hasBufferedOutput() { return bufferedOutput; } } }