package org.threadly.litesockets.buffers; import static org.junit.Assert.assertEquals; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.util.Random; import org.junit.After; import org.junit.Test; public class ReuseableMergedByteBuffersTests { @After public void stop() { System.gc(); System.out.println("Used Memory:" + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024*1024)); } @Test public void searchSpaning() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.add(ByteBuffer.wrap("vsdljsakd".getBytes())); mbb.add(ByteBuffer.wrap("testingC".getBytes())); mbb.add(ByteBuffer.wrap("test".getBytes())); mbb.add(ByteBuffer.wrap("ingCrap".getBytes())); System.out.println(mbb.indexOf("testingCrap")); assertEquals(17, mbb.indexOf("testingCrap")); mbb.discard(17); assertEquals("testingCrap", mbb.getAsString("testingCrap".length())); } @Test public void getInts() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); for(int i = 0; i<200; i++) { ByteBuffer bb = ByteBuffer.allocate(4); bb.putInt(i); bb.flip(); mbb.add(bb); } for(int i = 0; i<200; i++) { assertEquals(i, mbb.getInt()); } assertEquals(200*4, mbb.getTotalConsumedBytes()); } @Test public void getShorts() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); for(short i = 0; i<200; i++) { ByteBuffer bb = ByteBuffer.allocate(10); bb.putShort(i); bb.flip(); mbb.add(bb); } for(short i = 0; i<200; i++) { assertEquals(i, mbb.getShort()); } assertEquals(200*2, mbb.getTotalConsumedBytes()); } @Test public void getLongs() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); for(long i = 0; i<200; i++) { ByteBuffer bb = ByteBuffer.allocate(20); bb.position(5); bb.putLong(i); bb.position(5); bb.limit(13); mbb.add(bb); } for(long i = 0; i<200; i++) { assertEquals(i, mbb.getLong()); } assertEquals(200*8, mbb.getTotalConsumedBytes()); } @Test public void getLongOverSpan() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); for(byte i = 0; i<100; i++) { ByteBuffer bb = ByteBuffer.allocate(1); bb.put(i); bb.flip(); mbb.add(bb); } System.out.println(mbb.remaining()); assertEquals(283686952306183L, mbb.getLong()); assertEquals(579005069656919567L, mbb.getLong()); assertEquals(100-8-8, mbb.remaining()); assertEquals(16, mbb.getTotalConsumedBytes()); } @Test public void getByteUnsigned() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); ByteBuffer bb = ByteBuffer.allocate(1); bb.put((byte)-1); bb.flip(); mbb.add(bb); assertEquals(255, mbb.getUnsignedByte()); } @Test public void getShortUnsigned() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); ByteBuffer bb = ByteBuffer.allocate(2); bb.putShort((short)-1); bb.flip(); mbb.add(bb); assertEquals(65535, mbb.getUnsignedShort()); } @Test public void getBytes() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); ByteBuffer bb = ByteBuffer.allocate(200); for(byte i = 0; i<100; i++) { bb.put(i); } bb.flip(); mbb.add(bb); for(byte i = 0; i<100; i++) { assertEquals(i, mbb.get()); } assertEquals(100, mbb.getTotalConsumedBytes()); } @Test public void byteSearch() { String text = "FindMe"; MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); ByteBuffer bb = ByteBuffer.allocate(500); for(byte i = 0; i<100; i++) { bb.put(i); } bb.put(text.getBytes()); for(byte i = 0; i<100; i++) { bb.put(i); } bb.flip(); mbb.add(bb); assertEquals(100, mbb.indexOf(text)); assertEquals(-1, mbb.indexOf(text+"3")); assertEquals(100, mbb.indexOf(text.getBytes())); mbb.discard(100); assertEquals(text, mbb.getAsString(text.getBytes().length)); assertEquals(100+text.getBytes().length, mbb.getTotalConsumedBytes()); } @Test public void getUnsignedInt() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); ByteBuffer bb = ByteBuffer.allocate(4); bb.putInt(Integer.MAX_VALUE+500); bb.flip(); mbb.add(bb); long value = (Integer.MAX_VALUE+500 & 0xFFFFFFFFL); System.out.println(value); assertEquals(value, mbb.getUnsignedInt()); } @Test public void pullBytes() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); for(byte i = 0; i<100; i++) { ByteBuffer bb = ByteBuffer.allocate(1); bb.put(i); bb.flip(); mbb.add(bb); } ByteBuffer stuff = mbb.pullBuffer(20); for(int i=0; i<20; i++) { assertEquals(i, stuff.get()); } for(int i=20; i<100; i++) { stuff = mbb.pullBuffer(1); assertEquals(i, stuff.get()); } ByteBuffer bb = ByteBuffer.allocate(100); for(byte i = 0; i<100; i++) { bb.put(i); } bb.flip(); mbb.add(bb); stuff = mbb.pullBuffer(4); assertEquals(66051, stuff.getInt()); assertEquals(104, mbb.getTotalConsumedBytes()); } @Test public void pullZero() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); assertEquals(0, mbb.pullBuffer(0).remaining()); assertEquals(0, mbb.getTotalConsumedBytes()); } @Test public void popZeroBuffer() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); assertEquals(0, mbb.nextBufferSize()); assertEquals(0, mbb.popBuffer().remaining()); } @Test public void popBuffer() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); Random rnd = new Random(); int size = Math.abs(rnd.nextInt(300))+10; ByteBuffer bb = ByteBuffer.allocate(size); mbb.add(bb); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); assertEquals(size, mbb.nextBufferSize()); assertEquals(size, mbb.popBuffer().remaining()); assertEquals(size, mbb.getTotalConsumedBytes()); } @Test public void discardAllBuffers() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); Random rnd = new Random(); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); mbb.add(ByteBuffer.allocate(rnd.nextInt(300))); int size = mbb.remaining(); mbb.discard(size); assertEquals(0, mbb.remaining()); assertEquals(size, mbb.getTotalConsumedBytes()); } @Test(expected=BufferUnderflowException.class) public void badArrayGet() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.get(new byte[100]); } @Test(expected=BufferUnderflowException.class) public void discardUnderFlow() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.discard(100); } @Test(expected=IllegalArgumentException.class) public void badArrayGet2() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.get(null); } @Test(expected=BufferUnderflowException.class) public void badInt() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.getInt(); } @Test(expected=BufferUnderflowException.class) public void badLong() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.getLong(); } @Test(expected=BufferUnderflowException.class) public void badShort() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.getShort(); } @Test(expected=BufferUnderflowException.class) public void badPull() { MergedByteBuffers mbb = new ReuseableMergedByteBuffers(); mbb.pullBuffer(10); } }