/* * Copyright 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.atomix.catalyst.buffer; import java.nio.BufferOverflowException; import java.nio.BufferUnderflowException; import java.nio.ByteOrder; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; /** * Base buffer test. * * @author <a href="http://github.com/kuujo">Jordan Halterman</a> */ @Test public abstract class BufferTest { /** * Creates a new test buffer. */ protected abstract Buffer createBuffer(long capacity); /** * Creates a new test buffer. */ protected abstract Buffer createBuffer(long capacity, long maxCapacity); public void testPosition() { Buffer buffer = createBuffer(8); assertEquals(buffer.position(), 0); buffer.writeInt(10); assertEquals(buffer.position(), 4); buffer.position(0); assertEquals(buffer.position(), 0); assertEquals(buffer.readInt(), 10); } public void testFlip() { Buffer buffer = createBuffer(8); buffer.writeInt(10); assertEquals(buffer.position(), 4); assertEquals(buffer.capacity(), 8); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); buffer.flip(); assertEquals(buffer.limit(), 4); assertEquals(buffer.position(), 0); } public void testLimit() { Buffer buffer = createBuffer(8); assertEquals(buffer.position(), 0); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); buffer.limit(4); assertEquals(buffer.limit(), 4); assertTrue(buffer.hasRemaining()); buffer.writeInt(10); assertEquals(buffer.remaining(), 0); assertFalse(buffer.hasRemaining()); } public void testClear() { Buffer buffer = createBuffer(8); buffer.limit(6); assertEquals(buffer.limit(), 6); buffer.writeInt(10); assertEquals(buffer.position(), 4); buffer.clear(); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); assertEquals(buffer.position(), 0); } public void testMarkReset() { assertTrue(createBuffer(12).writeInt(10).mark().writeBoolean(true).reset().readBoolean()); } @Test(expectedExceptions=BufferUnderflowException.class) public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() { createBuffer(4, 4) .writeInt(10) .readInt(); } @Test(expectedExceptions=BufferUnderflowException.class) public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() { createBuffer(4, 4).readInt(2); } @Test(expectedExceptions=BufferOverflowException.class) public void testWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() { createBuffer(4, 4).writeInt(10).writeInt(20); } @Test(expectedExceptions=BufferOverflowException.class) public void testReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() { createBuffer(4, 4).writeInt(4, 10); } @Test(expectedExceptions=IndexOutOfBoundsException.class) public void testReadIntThrowsIndexOutOfBounds() { createBuffer(4, 4).readInt(10); } @Test(expectedExceptions=IndexOutOfBoundsException.class) public void testWriteIntThrowsIndexOutOfBounds() { createBuffer(4, 4).writeInt(10, 10); } public void testWriteReadByteRelative() { assertEquals(createBuffer(16).writeByte(10).flip().readByte(), 10); } public void testWriteReadByteAbsolute() { assertEquals(createBuffer(16).writeByte(4, 10).readByte(4), 10); } public void testWriteReadUnsignedByteRelative() { assertEquals(createBuffer(16).writeUnsignedByte(10).flip().readUnsignedByte(), 10); } public void testWriteReadUnsignedByteAbsolute() { assertEquals(createBuffer(16).writeUnsignedByte(4, 10).readUnsignedByte(4), 10); } public void testWriteReadShortRelative() { assertEquals(createBuffer(16).writeShort((short) 10).flip().readShort(), 10); } public void testWriteReadShortAbsolute() { assertEquals(createBuffer(16).writeShort(4, (short) 10).readShort(4), 10); } public void testWriteReadUnsignedShortRelative() { assertEquals(createBuffer(16).writeUnsignedShort((short) 10).flip().readUnsignedShort(), 10); } public void testWriteReadUnsignedShortAbsolute() { assertEquals(createBuffer(16).writeUnsignedShort(4, (short) 10).readUnsignedShort(4), 10); } public void testWriteReadIntRelative() { assertEquals(createBuffer(16).writeInt(10).flip().readInt(), 10); } public void testWriteReadUnsignedIntAbsolute() { assertEquals(createBuffer(16).writeUnsignedInt(4, 10).readUnsignedInt(4), 10); } public void testWriteReadUnsignedIntRelative() { assertEquals(createBuffer(16).writeUnsignedInt(10).flip().readUnsignedInt(), 10); } public void testWriteReadIntAbsolute() { assertEquals(createBuffer(16).writeInt(4, 10).readInt(4), 10); } public void testWriteReadLongRelative() { assertEquals(createBuffer(16).writeLong(12345).flip().readLong(), 12345); } public void testWriteReadLongAbsolute() { assertEquals(createBuffer(16).writeLong(4, 12345).readLong(4), 12345); } public void testWriteReadFloatRelative() { assertEquals(createBuffer(16).writeFloat(10.6f).flip().readFloat(), 10.6f); } public void testWriteReadFloatAbsolute() { assertEquals(createBuffer(16).writeFloat(4, 10.6f).readFloat(4), 10.6f); } public void testWriteReadDoubleRelative() { assertEquals(createBuffer(16).writeDouble(10.6).flip().readDouble(), 10.6); } public void testWriteReadDoubleAbsolute() { assertEquals(createBuffer(16).writeDouble(4, 10.6).readDouble(4), 10.6); } public void testWriteReadBooleanRelative() { assertTrue(createBuffer(16).writeBoolean(true).flip().readBoolean()); } public void testWriteReadBooleanAbsolute() { assertTrue(createBuffer(16).writeBoolean(4, true).readBoolean(4)); } public void testWriteReadStringRelative() { Buffer buffer = createBuffer(38) .writeString("Hello world!") .writeString("Hello world again!") .flip(); assertEquals(buffer.readString(), "Hello world!"); assertEquals(buffer.readString(), "Hello world again!"); } public void testWriteReadStringAbsolute() { Buffer buffer = createBuffer(46) .writeString(4, "Hello world!") .writeString(20, "Hello world again!"); assertEquals(buffer.readString(4), "Hello world!"); assertEquals(buffer.readString(20), "Hello world again!"); } public void testWriteReadUTF8Relative() { Buffer buffer = createBuffer(38) .writeUTF8("Hello world!") .writeUTF8("Hello world again!") .flip(); assertEquals(buffer.readUTF8(), "Hello world!"); assertEquals(buffer.readUTF8(), "Hello world again!"); } public void testWriteReadUTF8Absolute() { Buffer buffer = createBuffer(46) .writeUTF8(4, "Hello world!") .writeUTF8(20, "Hello world again!"); assertEquals(buffer.readUTF8(4), "Hello world!"); assertEquals(buffer.readUTF8(20), "Hello world again!"); } public void testReadWriter() { Buffer writeBuffer = createBuffer(8).writeLong(10).flip(); Buffer readBuffer = createBuffer(8); writeBuffer.read(readBuffer); assertEquals(readBuffer.flip().readLong(), 10); } public void testWriteReadSwappedIntRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt(), 10); } public void testWriteReadSwappedIntAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4), 10); } public void testAbsoluteSlice() { Buffer buffer = createBuffer(1024); buffer.writeLong(10).writeLong(11).rewind(); Buffer slice = buffer.slice(8, 1016); assertEquals(slice.position(), 0); assertEquals(slice.readLong(), 11); } public void testRelativeSliceWithoutLength() { Buffer buffer = createBuffer(1024, 1024); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(); assertEquals(slice.position(), 0); assertEquals(slice.limit(), -1); assertEquals(slice.capacity(), 1016); assertEquals(slice.maxCapacity(), 1016); assertEquals(slice.readLong(), 11); assertEquals(slice.readLong(0), 11); slice.close(); Buffer slice2 = buffer.skip(8).slice(); assertEquals(slice2.position(), 0); assertEquals(slice2.limit(), -1); assertEquals(slice2.capacity(), 1008); assertEquals(slice2.maxCapacity(), 1008); assertEquals(slice2.readLong(), 12); assertEquals(slice2.readLong(0), 12); } public void testRelativeSliceWithLength() { Buffer buffer = createBuffer(1024); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(8); assertEquals(slice.position(), 0); assertEquals(slice.readLong(), 11); assertEquals(slice.readLong(0), 11); slice.close(); Buffer slice2 = buffer.skip(8).slice(8); assertEquals(slice2.position(), 0); assertEquals(slice2.readLong(), 12); assertEquals(slice2.readLong(0), 12); slice2.close(); } public void testSliceOfSlice() { Buffer buffer = createBuffer(1024); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(); assertEquals(slice.readLong(), 11); Buffer sliceOfSlice = slice.slice(); assertEquals(sliceOfSlice.readLong(), 12); assertEquals(sliceOfSlice.position(), 8); } public void testSliceWithLimit() { Buffer buffer = createBuffer(1024).limit(16); buffer.writeLong(10); Buffer slice = buffer.slice(); assertEquals(slice.position(), 0); assertEquals(slice.capacity(), 8); assertEquals(slice.maxCapacity(), 8); assertEquals(slice.remaining(), 8); } public void testSliceWithLittleRemaining() { Buffer buffer = createBuffer(1024, 2048); buffer.position(1020); Buffer slice = buffer.slice(8); assertEquals(slice.position(), 0); assertEquals(slice.limit(), -1); } public void testCompact() { Buffer buffer = createBuffer(1024); buffer.position(100).writeLong(1234).position(100).compact(); assertEquals(buffer.position(), 0); assertEquals(buffer.readLong(), 1234); } public void testSwappedPosition() { Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN); assertEquals(buffer.position(), 0); buffer.writeInt(10); assertEquals(buffer.position(), 4); buffer.position(0); assertEquals(buffer.position(), 0); assertEquals(buffer.readInt(), 10); } public void testSwappedFlip() { Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN); buffer.writeInt(10); assertEquals(buffer.position(), 4); assertEquals(buffer.capacity(), 8); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); buffer.flip(); assertEquals(buffer.limit(), 4); assertEquals(buffer.position(), 0); } public void testSwappedLimit() { Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN); assertEquals(buffer.position(), 0); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); buffer.limit(4); assertEquals(buffer.limit(), 4); assertTrue(buffer.hasRemaining()); buffer.writeInt(10); assertEquals(buffer.remaining(), 0); assertFalse(buffer.hasRemaining()); } public void testSwappedClear() { Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN); buffer.limit(6); assertEquals(buffer.limit(), 6); buffer.writeInt(10); assertEquals(buffer.position(), 4); buffer.clear(); assertEquals(buffer.limit(), -1); assertEquals(buffer.capacity(), 8); assertEquals(buffer.position(), 0); } public void testSwappedMarkReset() { assertTrue(createBuffer(12).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).mark().writeBoolean(true).reset().readBoolean()); } @Test(expectedExceptions=BufferUnderflowException.class) public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN) .writeInt(10) .readInt(); } @Test(expectedExceptions=BufferUnderflowException.class) public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(2); } @Test(expectedExceptions=BufferOverflowException.class) public void testSwappedWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).writeInt(20); } @Test(expectedExceptions=BufferOverflowException.class) public void testSwappedReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10); } @Test(expectedExceptions=IndexOutOfBoundsException.class) public void testSwappedReadIntThrowsIndexOutOfBounds() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(10); } @Test(expectedExceptions=IndexOutOfBoundsException.class) public void testSwappedWriteIntThrowsIndexOutOfBounds() { createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10, 10); } public void testSwappedWriteReadByteRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(10).flip().readByte(), 10); } public void testSwappedWriteReadByteAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(4, 10).readByte(4), 10); } public void testSwappedWriteReadUnsignedByteRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(10).flip().readUnsignedByte(), 10); } public void testSwappedWriteReadUnsignedByteAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(4, 10).readUnsignedByte(4), 10); } public void testSwappedWriteReadShortRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort((short) 10).flip().readShort(), 10); } public void testSwappedWriteReadShortAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort(4, (short) 10).readShort(4), 10); } public void testSwappedWriteReadUnsignedShortRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort((short) 10).flip().readUnsignedShort(), 10); } public void testSwappedWriteReadUnsignedShortAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort(4, (short) 10).readUnsignedShort(4), 10); } public void testSwappedWriteReadIntRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt(), 10); } public void testSwappedWriteReadUnsignedIntAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(4, 10).readUnsignedInt(4), 10); } public void testSwappedWriteReadUnsignedIntRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(10).flip().readUnsignedInt(), 10); } public void testSwappedWriteReadIntAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4), 10); } public void testSwappedWriteReadLongRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(12345).flip().readLong(), 12345); } public void testSwappedWriteReadLongAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(4, 12345).readLong(4), 12345); } public void testSwappedWriteReadFloatRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(10.6f).flip().readFloat(), 10.6f); } public void testSwappedWriteReadFloatAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(4, 10.6f).readFloat(4), 10.6f); } public void testSwappedWriteReadDoubleRelative() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(10.6).flip().readDouble(), 10.6); } public void testSwappedWriteReadDoubleAbsolute() { assertEquals(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(4, 10.6).readDouble(4), 10.6); } public void testSwappedWriteReadBooleanRelative() { assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(true).flip().readBoolean()); } public void testSwappedWriteReadBooleanAbsolute() { assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(4, true).readBoolean(4)); } public void testSwappedReadWriter() { Buffer writeBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN).writeLong(10).flip(); Buffer readBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN); writeBuffer.read(readBuffer); assertEquals(readBuffer.flip().readLong(), 10); } public void testSwappedAbsoluteSlice() { Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN); buffer.writeLong(10).writeLong(11).rewind(); Buffer slice = buffer.slice(8, 1016); assertEquals(slice.position(), 0); assertEquals(slice.readLong(), 11); } public void testSwappedRelativeSliceWithoutLength() { Buffer buffer = createBuffer(1024, 1024).order(ByteOrder.LITTLE_ENDIAN); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(); assertEquals(slice.position(), 0); assertEquals(slice.limit(), -1); assertEquals(slice.capacity(), 1016); assertEquals(slice.maxCapacity(), 1016); assertEquals(slice.readLong(), 11); assertEquals(slice.readLong(0), 11); slice.close(); Buffer slice2 = buffer.skip(8).slice(); assertEquals(slice2.position(), 0); assertEquals(slice2.limit(), -1); assertEquals(slice2.capacity(), 1008); assertEquals(slice2.maxCapacity(), 1008); assertEquals(slice2.readLong(), 12); assertEquals(slice2.readLong(0), 12); } public void testSwappedRelativeSliceWithLength() { Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(8); assertEquals(slice.position(), 0); assertEquals(slice.readLong(), 11); assertEquals(slice.readLong(0), 11); slice.close(); Buffer slice2 = buffer.skip(8).slice(8); assertEquals(slice2.position(), 0); assertEquals(slice2.readLong(), 12); assertEquals(slice2.readLong(0), 12); slice2.close(); } public void testSwappedSliceOfSlice() { Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN); buffer.writeLong(10).writeLong(11).writeLong(12).rewind(); assertEquals(buffer.readLong(), 10); Buffer slice = buffer.slice(); assertEquals(slice.readLong(), 11); Buffer sliceOfSlice = slice.slice(); assertEquals(sliceOfSlice.readLong(), 12); assertEquals(sliceOfSlice.position(), 8); } public void testSwappedSliceWithLimit() { Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN).limit(16); buffer.writeLong(10); Buffer slice = buffer.slice(); assertEquals(slice.position(), 0); assertEquals(slice.capacity(), 8); assertEquals(slice.maxCapacity(), 8); assertEquals(slice.remaining(), 8); } public void testSwappedSliceWithLittleRemaining() { Buffer buffer = createBuffer(1024, 2048).order(ByteOrder.LITTLE_ENDIAN); buffer.position(1020); Buffer slice = buffer.slice(8); assertEquals(slice.position(), 0); assertEquals(slice.limit(), -1); } public void testSwappedCompact() { Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN); buffer.position(100).writeLong(1234).position(100).compact(); assertEquals(buffer.position(), 0); assertEquals(buffer.readLong(), 1234); } public void testCapacity0Read() { Buffer buffer = createBuffer(0, 1024); assertEquals(buffer.readLong(), 0); } public void testCapacity0Write() { Buffer buffer = createBuffer(0, 1024); buffer.writeLong(10); assertEquals(buffer.readLong(0), 10); } }