package com.limegroup.gnutella.util;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.util.Arrays;
import junit.framework.Test;
import com.limegroup.gnutella.connection.ReadBufferChannel;
import com.limegroup.gnutella.connection.WriteBufferChannel;
import com.limegroup.gnutella.util.CircularByteBuffer;
/**
* Tests some of the functionality of the Circular buffer.
*
*/
public class CircularByteBufferTest extends BaseTestCase {
public CircularByteBufferTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(CircularByteBufferTest.class);
}
public void testBasic() throws Exception {
byte [] in = new byte[]{(byte)1,(byte)2};
CircularByteBuffer buf = new CircularByteBuffer(2,false);
assertEquals(2,buf.remainingIn());
assertEquals(0,buf.remainingOut());
buf.put(ByteBuffer.wrap(in));
assertEquals(0,buf.remainingIn());
assertEquals(2,buf.remainingOut());
byte [] out = new byte[2];
buf.get(out);
assertEquals(2,buf.remainingIn());
assertEquals(0,buf.remainingOut());
assertEquals(in[0],out[0]);
assertEquals(in[1],out[1]);
}
public void testOverflow() throws Exception {
byte [] in = new byte[]{(byte)1,(byte)2};
CircularByteBuffer buf = new CircularByteBuffer(1,false);
assertEquals(1,buf.remainingIn());
assertEquals(0,buf.remainingOut());
try {
buf.put(ByteBuffer.wrap(in));
fail(" should have overflown");
} catch (BufferOverflowException expected) {}
assertEquals(1,buf.remainingIn());
assertEquals(0,buf.remainingOut());
}
public void testUnderflow() throws Exception {
byte [] in = new byte[]{(byte)1,(byte)2};
CircularByteBuffer buf = new CircularByteBuffer(2,false);
buf.put(ByteBuffer.wrap(in));
assertEquals(0,buf.remainingIn());
assertEquals(2,buf.remainingOut());
byte [] out = new byte[3];
try {
buf.get(out);
fail("should have underflown");
} catch (BufferUnderflowException expected) {}
assertEquals(0,buf.remainingIn());
assertEquals(2,buf.remainingOut());
}
public void testWrapAround() throws Exception {
byte [] in = new byte[30];
for(int i = 0;i < 20;i++) in[i]=(byte)i;
CircularByteBuffer buf = new CircularByteBuffer(5,false);
ReadableByteChannel source = new ReadBufferChannel(in);
// R1 R2 R3 R4 R5
assertEquals(5,buf.read(source));
assertEquals(0,buf.remainingIn());
assertEquals(5,buf.remainingOut());
// R1 R2 - - -
buf.get();buf.get();
assertEquals(2,buf.remainingIn());
assertEquals(3,buf.remainingOut());
assertEquals(2,buf.read(source));
assertEquals(0,buf.remainingIn());
assertEquals(5,buf.remainingOut());
// W1 W2 W3 W4 W5
WritableByteChannel sink = new WriteBufferChannel(20);
assertEquals(5,buf.write(sink));
assertEquals(5,buf.read(source));
// - - W1 W2 W3
buf.get();buf.get();
assertEquals(3,buf.write(sink));
assertEquals(5,buf.read(source));
// W5 W1 W2 W3 W4
buf.get();
assertEquals(1,buf.read(source));
assertEquals(5,buf.write(sink));
// R5 R1 R2 R3 R4
assertEquals(5,buf.read(source));
}
}