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