package org.limewire.io;
import java.nio.ByteBuffer;
import java.util.Random;
import junit.framework.Test;
import org.limewire.util.BaseTestCase;
public class ByteBufferInputStreamTest extends BaseTestCase {
private static Random RANDOM = new Random();
public ByteBufferInputStreamTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(ByteBufferInputStreamTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testAvailable() {
ByteBufferInputStream in = new ByteBufferInputStream();
assertEquals(0, in.available());
in.close();
assertEquals(0, in.available());
in = new ByteBufferInputStream(buffer(3));
assertEquals(3, in.available());
in.read();
assertEquals(2, in.available());
in.skip(2);
assertEquals(0, in.available());
in = new ByteBufferInputStream(buffer(50), buffer(23), buffer(3));
assertEquals(76, in.available());
in.skip(72);
assertEquals(4, in.available());
in.close();
assertEquals(0, in.available());
}
public void testRead() {
ByteBuffer b1, b2, b3;
b1 = buffer(1); b2 = buffer(2); b3 = buffer(3);
ByteBufferInputStream in = new ByteBufferInputStream(b1, b2, b3);
assertEquals(b1.array()[0], (byte)in.read());
assertEquals(b2.array()[0], (byte)in.read());
assertEquals(b2.array()[1], (byte)in.read());
assertEquals(b3.array()[0], (byte)in.read());
assertEquals(b3.array()[1], (byte)in.read());
assertEquals(b3.array()[2], (byte)in.read());
assertEquals(-1, in.read());
assertFalse(b1.hasRemaining());
assertFalse(b2.hasRemaining());
assertFalse(b3.hasRemaining());
}
public void testReadBulk() {
ByteBuffer b1, b2, b3;
b1 = buffer(23); b2 = buffer(34); b3 = buffer(512);
ByteBufferInputStream in = new ByteBufferInputStream(b1, b2, b3);
byte[] b = new byte[21];
assertEquals(21, in.read(b)); // test simple bulk read
assertEquals(b1.array(), 0, 21, b);
b = new byte[100];
assertEquals(30, in.read(b, 0, 30)); // test reading over multiple buffers
assertEquals(b1.array(), 21, 2, b, 0, 2);
assertEquals(b2.array(), 0, 28, b, 2, 28);
assertEquals(6, in.read(b, 50, 6)); // test reading into middle of array
assertEquals(b2.array(), 28, 6, b, 50, 6);
b = new byte[1000];
assertEquals(512, in.read(b)); // test read finishes
assertEquals(b3.array(), b, 0, 512);
assertEquals(-1, in.read()); // test EOF
}
public void testSkip() {
ByteBuffer b1, b2, b3;
b1 = buffer(23); b2 = buffer(34); b3 = buffer(512);
ByteBufferInputStream in = new ByteBufferInputStream(b1, b2, b3);
assertEquals(569, in.available());
assertEquals(20, in.skip(20)); // test skipping within a buffer
assertEquals(549, in.available());
// make sure what we read is after the skipped portion
byte[] b = new byte[21];
assertEquals(21, in.read(b));
assertEquals(b1.array(), 20, 3, b, 0, 3);
assertEquals(b2.array(), 0, 18, b, 3, 18);
assertEquals(500, in.skip(500)); // test skipping to another buffer
assertEquals(28, in.available());
assertEquals(21, in.read(b));
assertEquals(b3.array(), 484, 21, b);
assertEquals(7, in.available());
assertEquals(7, in.skip(100)); // test skipping past EOF
assertEquals(0, in.skip(1));
assertEquals(-1, in.read());
}
public void testReadBuffer() {
ByteBuffer b1, b2, b3;
b1 = buffer(23); b2 = buffer(34); b3 = buffer(512);
ByteBufferInputStream in = new ByteBufferInputStream(b1, b2, b3);
ByteBuffer b = ByteBuffer.allocate(21);
assertEquals(21, in.read(b)); // test simple bulk read
assertEquals(b1.array(), 0, 21, b.array());
b = ByteBuffer.allocate(100);
b.limit(30);
assertEquals(30, in.read(b)); // test reading to limited buffer
assertEquals(b1.array(), 21, 2, b.array(), 0, 2);
assertEquals(b2.array(), 0, 28, b.array(), 2, 28);
b.limit(56);
b.position(50);
assertEquals(6, in.read(b)); // test reading into middle of buffer
assertEquals(b2.array(), 28, 6, b.array(), 50, 6);
b = ByteBuffer.allocate(1000);
assertEquals(512, in.read(b)); // test read finishes
assertEquals(b3.array(), b.array(), 0, 512);
assertEquals(-1, in.read()); // test EOF
}
public void testBufferFor() {
ByteBuffer b1, b2, b3;
b1 = buffer(23); b2 = buffer(34); b3 = buffer(512);
ByteBufferInputStream in = new ByteBufferInputStream(b1, b2, b3);
ByteBuffer b = in.bufferFor(21);
assertSame(b1.array(), b.array()); // test reference
assertEquals(21, b.remaining());
assertEquals(0, b.arrayOffset());
b = in.bufferFor(30);
assertNotSame(b1.array(), b.array()); // can't reference if overlap
assertNotSame(b2.array(), b.array());
assertEquals(30, b.remaining());
assertEquals(b1.array(), 21, 2, b.array(), 0, 2);
assertEquals(b2.array(), 0, 28, b.array(), 2, 28);
assertEquals(0, b.arrayOffset());
b = in.bufferFor(6);
assertSame(b2.array(), b.array()); // reference to end of buffer
assertEquals(6, b.remaining());
assertEquals(28, b.arrayOffset());
b = in.bufferFor(1000);
assertSame(b3.array(), b.array());
assertEquals(0, b.arrayOffset());
assertEquals(512, b.limit());
assertEquals(-1, in.read()); // test EOF
}
private ByteBuffer buffer(int len) {
byte[] b = new byte[len];
RANDOM.nextBytes(b);
return ByteBuffer.wrap(b);
}
}