package org.limewire.http.entity; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import junit.framework.Test; import org.apache.http.impl.io.HttpTransportMetricsImpl; import org.apache.http.impl.nio.codecs.IdentityEncoder; import org.apache.http.impl.nio.reactor.SessionOutputBufferImpl; import org.apache.http.params.BasicHttpParams; import org.limewire.http.HttpTestUtils; import org.limewire.http.MockIOControl; import org.limewire.util.BaseTestCase; import org.limewire.util.StringUtils; public class FileNIOEntityTest extends BaseTestCase { private static final String ALPHABET = "abcdefghijklmonpqrstuvwxyz"; private BasicHttpParams params; public FileNIOEntityTest(String name) { super(name); } public static Test suite() { return buildTestSuite(FileNIOEntityTest.class); } @Override protected void setUp() throws Exception { this.params = new BasicHttpParams(); } public void testGetContentLength() throws IOException { File file = File.createTempFile("lime", null); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(0, entity.getContentLength()); assertEquals(file, entity.getFile()); HttpTestUtils.writeData(file, ALPHABET); entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(26, entity.getContentLength()); assertEquals(file, entity.getFile()); ByteArrayOutputStream out = new ByteArrayOutputStream(); entity.writeTo(out); assertEquals(ALPHABET, StringUtils.getUTF8String(out.toByteArray())); } public void testGetFile() throws Exception { File file = File.createTempFile("lime", null); HttpTestUtils.writeData(file, ALPHABET); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(26, entity.getContentLength()); ByteArrayOutputStream out = new ByteArrayOutputStream(); entity.writeTo(out); assertEquals(ALPHABET, StringUtils.getUTF8String(out.toByteArray())); } public void testGetFileNIO() throws Exception { File file = File.createTempFile("lime", null); HttpTestUtils.writeData(file, ALPHABET); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(26, entity.getContentLength()); ByteArrayOutputStream out = new ByteArrayOutputStream(); WritableByteChannel channel = Channels.newChannel(out); IdentityEncoder encoder = new IdentityEncoder(channel, new SessionOutputBufferImpl(0, 0, params), new HttpTransportMetricsImpl()); readAllNIO(entity, encoder); assertTrue(encoder.isCompleted()); assertEquals(ALPHABET, StringUtils.getUTF8String(out.toByteArray())); } public void testGetFileRange() throws Exception { File file = File.createTempFile("lime", null); HttpTestUtils.writeData(file, ALPHABET); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter(), 2, 3); assertEquals(3, entity.getContentLength()); assertEquals(file, entity.getFile()); ByteArrayOutputStream out = new ByteArrayOutputStream(); entity.writeTo(out); assertEquals("cde", StringUtils.getUTF8String(out.toByteArray())); } public void testGetFileRangeNIO() throws Exception { File file = File.createTempFile("lime", null); HttpTestUtils.writeData(file, ALPHABET); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter(), 2, 3); assertEquals(3, entity.getContentLength()); assertEquals(file, entity.getFile()); ByteArrayOutputStream out = new ByteArrayOutputStream(); WritableByteChannel channel = Channels.newChannel(out); IdentityEncoder encoder = new IdentityEncoder(channel, new SessionOutputBufferImpl(0, 0, params), new HttpTransportMetricsImpl()); readAllNIO(entity, encoder); assertTrue(encoder.isCompleted()); assertEquals("cde", StringUtils.getUTF8String(out.toByteArray())); } private void readAllNIO(FileNIOEntity entity, IdentityEncoder encoder) throws IOException, InterruptedException { MockIOControl control = new MockIOControl(); long startTime = System.currentTimeMillis(); while (!encoder.isCompleted() && startTime + 1000 > System.currentTimeMillis()) { entity.produceContent(encoder, control); if (!control.outputRequested) { Thread.sleep(50); } } entity.finish(); } public void testGetEmptyFile() throws Exception { File file = File.createTempFile("lime", null); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(0, entity.getContentLength()); assertEquals(file, entity.getFile()); ByteArrayOutputStream out = new ByteArrayOutputStream(); entity.writeTo(out); assertEquals("", StringUtils.getUTF8String(out.toByteArray())); } public void testGetEmptyFileNIO() throws Exception { File file = File.createTempFile("lime", null); FileNIOEntity entity = new FileNIOEntity(file, "content-type", new FileTransferMonitorAdapter()); assertEquals(0, entity.getContentLength()); assertEquals(file, entity.getFile()); ByteArrayOutputStream out = new ByteArrayOutputStream(); WritableByteChannel channel = Channels.newChannel(out); IdentityEncoder encoder = new IdentityEncoder(channel, new SessionOutputBufferImpl(0, 0, params), new HttpTransportMetricsImpl()); entity.produceContent(encoder, new MockIOControl()); assertTrue(encoder.isCompleted()); assertEquals("", StringUtils.getUTF8String(out.toByteArray())); entity.finish(); assertEquals("", StringUtils.getUTF8String(out.toByteArray())); } }