BAEL-4151: Guide to ByteBuffer (#11859)
* Convert Byte Array to its Numeric Representation * Remove Redundant Getter Method * BAEL-4286 How to get the value of a bit at a certain position from a byte * BAEL-4286(update): remove redundant test methods * BAEL-4151: Guide to ByteBuffer
This commit is contained in:
parent
d988efb89f
commit
6ca42b7a4e
|
@ -0,0 +1,339 @@
|
||||||
|
package com.baeldung.bytebuffer;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.nio.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class ByteBufferUnitTest {
|
||||||
|
@Test
|
||||||
|
public void givenBufferCreation_whenUsingAllocate_thenSuccess() {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertNotNull(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferCreation_whenUsingAllocateDirect_thenSuccess() {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocateDirect(10);
|
||||||
|
assertNotNull(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferCreation_whenUsingWrap_thenSuccess() {
|
||||||
|
byte[] bytes = new byte[10];
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
|
assertNotNull(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingAllocate_thenInitialIndices() {
|
||||||
|
// create instance using allocate
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
|
||||||
|
// get index
|
||||||
|
int position = buffer.position();
|
||||||
|
int limit = buffer.limit();
|
||||||
|
int capacity = buffer.capacity();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertEquals(0, position);
|
||||||
|
assertEquals(10, limit);
|
||||||
|
assertEquals(10, capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenChangingPositionAndLimit_thenSuccess() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.limit(5);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertIndex(buffer, -1, 2, 5, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingWrap_thenInitialIndices() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes = new byte[10];
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingWrapWithOffsetAndLength_thenInitialIndices() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes = new byte[10];
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes, 2, 6);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertIndex(buffer, -1, 2, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingMarkAndReset_thenOK() {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
buffer.position(2);
|
||||||
|
assertIndex(buffer, -1, 2, 10, 10);
|
||||||
|
|
||||||
|
buffer.mark();
|
||||||
|
assertIndex(buffer, 2, 2, 10, 10);
|
||||||
|
|
||||||
|
buffer.position(5);
|
||||||
|
assertIndex(buffer, 2, 5, 10, 10);
|
||||||
|
|
||||||
|
buffer.reset();
|
||||||
|
assertIndex(buffer, 2, 2, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingClear_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// clear
|
||||||
|
buffer.clear();
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingFlip_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// flip
|
||||||
|
buffer.flip();
|
||||||
|
assertIndex(buffer, -1, 0, 5, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingRewind_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// rewind
|
||||||
|
buffer.rewind();
|
||||||
|
assertIndex(buffer, -1, 0, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingCompact_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// compact
|
||||||
|
buffer.compact();
|
||||||
|
assertIndex(buffer, -1, 3, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferIndex_whenUsingRemain_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.limit(8);
|
||||||
|
|
||||||
|
// remain
|
||||||
|
boolean flag = buffer.hasRemaining();
|
||||||
|
int remaining = buffer.remaining();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(flag);
|
||||||
|
assertEquals(6, remaining);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = BufferUnderflowException.class)
|
||||||
|
public void givenNotEnoughRemaining_WhenCallingGetInt_thenBufferUnderflowException() {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(2);
|
||||||
|
buffer.getInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = BufferOverflowException.class)
|
||||||
|
public void givenNotEnoughRemaining_WhenCallingPutInt_thenBufferOverflowException() {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(2);
|
||||||
|
buffer.putInt(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferView_whenUsingDuplicate_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// view
|
||||||
|
ByteBuffer view = buffer.duplicate();
|
||||||
|
assertIndex(view, 2, 5, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferView_whenUsingSlice_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// view
|
||||||
|
ByteBuffer view = buffer.slice();
|
||||||
|
assertIndex(view, -1, 0, 3, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferView_whenUsingAsReaOnlyBuffer_thenOK() {
|
||||||
|
// create instance
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(10);
|
||||||
|
assertIndex(buffer, -1, 0, 10, 10);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer.position(2);
|
||||||
|
buffer.mark();
|
||||||
|
buffer.position(5);
|
||||||
|
buffer.limit(8);
|
||||||
|
assertIndex(buffer, 2, 5, 8, 10);
|
||||||
|
|
||||||
|
// view
|
||||||
|
ByteBuffer view = buffer.asReadOnlyBuffer();
|
||||||
|
assertIndex(view, 2, 5, 8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBufferView_whenUsingAsIntBuffer_thenOK() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes = new byte[]{
|
||||||
|
(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE, // CAFEBABE ---> cafebabe
|
||||||
|
(byte) 0xF0, (byte) 0x07, (byte) 0xBA, (byte) 0x11, // F007BA11 ---> football
|
||||||
|
(byte) 0x0F, (byte) 0xF1, (byte) 0xCE // 0FF1CE ---> office
|
||||||
|
};
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
|
assertIndex(buffer, -1, 0, 11, 11);
|
||||||
|
|
||||||
|
// view
|
||||||
|
IntBuffer intBuffer = buffer.asIntBuffer();
|
||||||
|
int capacity = intBuffer.capacity();
|
||||||
|
assertEquals(2, capacity);
|
||||||
|
assertIndex(intBuffer, -1, 0, 2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenByteOrder_whenUsingBigEndian_thenOK() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE};
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
|
|
||||||
|
// change byte order
|
||||||
|
buffer.order(ByteOrder.BIG_ENDIAN);
|
||||||
|
int val = buffer.getInt();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertEquals(0xCAFEBABE, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenByteOrder_whenUsingLittleEndian_thenOK() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE};
|
||||||
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
|
|
||||||
|
// change byte order
|
||||||
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
int val = buffer.getInt();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertEquals(0xBEBAFECA, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenComparing_whenUsingEqualsAndCompareTo_thenOK() {
|
||||||
|
// create instance
|
||||||
|
byte[] bytes1 = "World".getBytes(StandardCharsets.UTF_8);
|
||||||
|
byte[] bytes2 = "HelloWorld".getBytes(StandardCharsets.UTF_8);
|
||||||
|
ByteBuffer buffer1 = ByteBuffer.wrap(bytes1);
|
||||||
|
ByteBuffer buffer2 = ByteBuffer.wrap(bytes2);
|
||||||
|
|
||||||
|
// change index
|
||||||
|
buffer2.position(5);
|
||||||
|
|
||||||
|
// equals and compareTo
|
||||||
|
boolean equal = buffer1.equals(buffer2);
|
||||||
|
int result = buffer1.compareTo(buffer2);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(equal);
|
||||||
|
assertEquals(0, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertIndex(Buffer buffer, int mark, int position, int limit, int capacity) {
|
||||||
|
assertEquals(mark, getMark(buffer));
|
||||||
|
assertEquals(position, buffer.position());
|
||||||
|
assertEquals(limit, buffer.limit());
|
||||||
|
assertEquals(capacity, buffer.capacity());
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMark(Buffer buffer) {
|
||||||
|
try {
|
||||||
|
Class<?> clazz = Buffer.class;
|
||||||
|
Field f = clazz.getDeclaredField("mark");
|
||||||
|
f.setAccessible(true);
|
||||||
|
Object result = f.get(buffer);
|
||||||
|
return (int) result;
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue