/*
* JBoss, Home of Professional Open Source
*
* Copyright 2012 Red Hat, Inc. and/or its affiliates, and individual
* contributors as indicated by the @author tags.
*
* 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 org.xnio;
import static org.junit.Assert.assertArrayEquals;
import static org.xnio.AssertReadWrite.assertReadMessage;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
import java.nio.InvalidMarkException;
import java.nio.LongBuffer;
import java.nio.ReadOnlyBufferException;
import java.nio.ShortBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Random;
import junit.framework.TestCase;
import org.xnio.BufferAllocator;
import org.xnio.Buffers;
import org.xnio.ByteBufferSlicePool;
import org.xnio.Pool;
import org.xnio.Pooled;
/**
* Test for {@link Buffers}.
*
* @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a>
* @author <a href="mailto:flavia.rainone@jboss.com">Flavia Rainone</a>
*/
public final class BuffersTestCase extends TestCase {
private void doTestFlip(Buffer buffer) {
final int pos = buffer.position();
final int cap = buffer.capacity();
assertEquals(cap, buffer.limit());
assertSame(buffer, Buffers.flip(buffer));
assertEquals(0, buffer.position());
assertEquals(pos, buffer.limit());
assertEquals(cap, buffer.capacity());
}
public void testFlipByte() {
ByteBuffer buf = ByteBuffer.allocate(100);
final byte[] data = {5, 4, 3, 2, 1, 0};
final byte[] data2 = new byte[data.length];
buf.put(data);
doTestFlip(buf);
buf.get(data2);
assertTrue(Arrays.equals(data, data2));
assertFalse(buf.hasRemaining());
}
public void testFlipChar() {
CharBuffer buf = CharBuffer.allocate(100);
final char[] data = {5, 4, 3, 2, 1, 0};
final char[] data2 = new char[data.length];
buf.put(data);
doTestFlip(buf);
buf.get(data2);
assertTrue(Arrays.equals(data, data2));
assertFalse(buf.hasRemaining());
}
private void doTestClear(Buffer buffer) {
assertFalse(buffer.position() == 0);
final int cap = buffer.capacity();
assertFalse(buffer.limit() == cap);
assertSame(buffer, Buffers.clear(buffer));
assertEquals(0, buffer.position());
assertEquals(cap, buffer.limit());
assertEquals(cap, buffer.capacity());
}
public void testClearByte() {
final int sz = 100;
ByteBuffer buf = ByteBuffer.allocate(sz);
final byte[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestClear(buf);
}
public void testClearChar() {
final int sz = 100;
CharBuffer buf = CharBuffer.allocate(sz);
final char[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestClear(buf);
}
private void doTestLimit(Buffer buffer) {
assertFalse(buffer.limit() == 50);
assertSame(buffer, Buffers.limit(buffer, 50));
assertEquals(50, buffer.limit());
}
public void testLimitByte() {
final int sz = 100;
ByteBuffer buf = ByteBuffer.allocate(sz);
final byte[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestLimit(buf);
}
public void testLimitChar() {
final int sz = 100;
CharBuffer buf = CharBuffer.allocate(sz);
final char[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestLimit(buf);
}
private void doTestMarkReset(Buffer buffer) {
final int p = buffer.position();
assertSame(buffer, Buffers.mark(buffer));
assertSame(buffer, Buffers.skip(buffer, 10));
assertFalse(buffer.position() == p);
assertSame(buffer, Buffers.reset(buffer));
assertTrue(buffer.position() == p);
assertSame(buffer, Buffers.skip(buffer, 10));
assertFalse(buffer.position() == p);
assertSame(buffer, Buffers.reset(buffer));
assertTrue(buffer.position() == p);
}
public void testMarkResetByte() {
final int sz = 100;
ByteBuffer buf = ByteBuffer.allocate(sz);
final byte[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestMarkReset(buf);
}
public void testMarkResetChar() {
final int sz = 100;
CharBuffer buf = CharBuffer.allocate(sz);
final char[] data = {5, 4, 3, 2, 1, 0};
buf.put(data);
buf.put(data);
buf.put(data);
buf.flip();
buf.get();
buf.get();
doTestMarkReset(buf);
}
private void doTestPosition(Buffer buffer) {
assertSame(buffer, Buffers.position(buffer, 25));
assertEquals(25, buffer.position());
assertSame(buffer, Buffers.position(buffer, 0));
assertEquals(0, buffer.position());
assertSame(buffer, Buffers.position(buffer, 100));
assertEquals(100, buffer.position());
}
public void testPositionByte() {
doTestPosition(ByteBuffer.allocate(200));
}
public void testPositionChar() {
doTestPosition(CharBuffer.allocate(200));
}
private void doTestRewind(Buffer buffer) {
assertSame(buffer, Buffers.position(buffer, 45));
assertEquals(45, buffer.position());
assertSame(buffer, Buffers.rewind(buffer));
assertEquals(0, buffer.position());
}
public void testRewindByte() {
doTestRewind(ByteBuffer.allocate(200));
}
public void testRewindChar() {
doTestRewind(CharBuffer.allocate(200));
}
public void tetsFlipClearLimitMarkPositionResetAndRewind() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.position(5);
Buffers.flip(buffer);
assertEquals(0, buffer.position());
assertEquals(5, buffer.limit());
Buffers.clear(buffer);
assertEquals(0, buffer.position());
assertEquals(buffer.capacity(), buffer.limit());
assertEquals(10, buffer.limit());
Buffers.limit(buffer, 7);
assertEquals(7, buffer.limit());
buffer.limit(10);
buffer.position(4);
Buffers.mark(buffer);
buffer.position(7);;
Buffers.reset(buffer);
assertEquals(4, buffer.position());
Buffers.mark(buffer);
Buffers.rewind(buffer);
assertEquals(0, buffer.position());
InvalidMarkException expected = null;
try {
buffer.reset();
} catch (InvalidMarkException e) {
expected = e;
}
assertNotNull(expected);
}
public void testPositiveSliceByte() {
final ByteBuffer buf = ByteBuffer.allocate(200);
final byte[] data = {5, 10, 15, 20, 0, 5, 10, 15};
buf.put(data).put(data).put(data).put(data).put(data).put(data).put(data);
buf.flip();
final int lim = buf.limit();
final int cap = buf.capacity();
final int sz = 7;
final ByteBuffer slice1 = Buffers.slice(buf, sz);
assertEquals(0, slice1.position());
assertEquals(sz, slice1.capacity());
assertEquals(sz, slice1.limit());
assertEquals(sz, buf.position());
assertEquals(lim, buf.limit());
assertEquals(cap, buf.capacity());
final ByteBuffer slice2 = Buffers.slice(buf, sz * 2);
assertEquals(0, slice2.position());
assertEquals(sz * 2, slice2.capacity());
assertEquals(sz * 2, slice2.limit());
assertEquals(sz * 3, buf.position());
}
public void testPositiveSliceChar() {
final CharBuffer buf = CharBuffer.allocate(200);
final char[] data = {5, 10, 15, 20, 0, 5, 10, 15};
buf.put(data).put(data).put(data).put(data).put(data).put(data).put(data);
buf.flip();
final int lim = buf.limit();
final int cap = buf.capacity();
final int sz = 7;
final CharBuffer slice1 = Buffers.slice(buf, sz);
assertEquals(0, slice1.position());
assertEquals(sz, slice1.capacity());
assertEquals(sz, slice1.limit());
assertEquals(sz, buf.position());
assertEquals(lim, buf.limit());
assertEquals(cap, buf.capacity());
final CharBuffer slice2 = Buffers.slice(buf, sz * 2);
assertEquals(0, slice2.position());
assertEquals(sz * 2, slice2.capacity());
assertEquals(sz * 2, slice2.limit());
assertEquals(sz * 3, buf.position());
}
public void testNegativeSliceByte() {
final ByteBuffer buf = ByteBuffer.allocate(200);
final byte[] data = {5, 10, 15, 20, 0, 5, 10, 15};
buf.put(data).put(data).put(data).put(data).put(data).put(data).put(data);
buf.flip();
final int lim = buf.limit();
final int cap = buf.capacity();
final int sz = 7;
final ByteBuffer slice1 = Buffers.slice(buf, sz - lim);
assertEquals(0, slice1.position());
assertEquals(sz, slice1.capacity());
assertEquals(sz, slice1.limit());
assertEquals(sz, buf.position());
assertEquals(lim, buf.limit());
assertEquals(cap, buf.capacity());
final ByteBuffer slice2 = Buffers.slice(buf, sz * 2 - lim + sz);
assertEquals(0, slice2.position());
assertEquals(sz * 2, slice2.capacity());
assertEquals(sz * 2, slice2.limit());
assertEquals(sz * 3, buf.position());
}
public void testNegativeSliceChar() {
final CharBuffer buf = CharBuffer.allocate(200);
final char[] data = {5, 10, 15, 20, 0, 5, 10, 15};
buf.put(data).put(data).put(data).put(data).put(data).put(data).put(data);
buf.flip();
final int lim = buf.limit();
final int cap = buf.capacity();
final int sz = 7;
final CharBuffer slice1 = Buffers.slice(buf, sz - lim);
assertEquals(0, slice1.position());
assertEquals(sz, slice1.capacity());
assertEquals(sz, slice1.limit());
assertEquals(sz, buf.position());
assertEquals(lim, buf.limit());
assertEquals(cap, buf.capacity());
final CharBuffer slice2 = Buffers.slice(buf, sz * 2 - lim + sz);
assertEquals(0, slice2.position());
assertEquals(sz * 2, slice2.capacity());
assertEquals(sz * 2, slice2.limit());
assertEquals(sz * 3, buf.position());
}
public void testMultipleByeSlices() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("abcdefghij".getBytes()).flip();
final ByteBuffer slice1 = Buffers.slice(buffer, 3);
assertEquals(3, slice1.limit());
assertEquals('a', slice1.get());
assertEquals('b', slice1.get());
assertEquals('c', slice1.get());
BufferUnderflowException expected = null;
try {
slice1.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(3, buffer.position());
final ByteBuffer slice2 = Buffers.slice(buffer, 1);
assertEquals('d', slice2.get());
expected = null;
try {
slice2.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(4, buffer.position());
final ByteBuffer slice3 = Buffers.slice(buffer, -2);
assertEquals(8, buffer.position());
assertEquals(10, buffer.limit());
assertEquals('e', slice3.get());
assertEquals('f', slice3.get());
assertEquals('g', slice3.get());
assertEquals('h', slice3.get());
final ByteBuffer slice4 = Buffers.slice(buffer, 2);
assertEquals(2, slice4.limit());
assertEquals('i', slice4.get());
assertEquals('j', slice4.get());
expected = null;
try {
slice3.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(10, buffer.position());
// invalid slice
expected = null;
try {
Buffers.slice(buffer, 1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.slice(buffer, -1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
// check slice properties
buffer.put(1, (byte) 'z');
assertEquals('z', slice1.get(1));
slice2.put(0, (byte) 'y');
assertEquals('y', buffer.get(3));
buffer.put(5, (byte) 'x');
assertEquals('x', slice3.get(1));
slice4.put(0, (byte) 'w');
assertEquals('w', buffer.get(8));
}
public void testMultipleCharSlices() {
final CharBuffer buffer = CharBuffer.allocate(10);
buffer.put(new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}).flip();
final CharBuffer slice1 = Buffers.slice(buffer, 3);
assertEquals(3, slice1.limit());
assertEquals('a', slice1.get());
assertEquals('b', slice1.get());
assertEquals('c', slice1.get());
BufferUnderflowException expected = null;
try {
slice1.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(3, buffer.position());
final CharBuffer slice2 = Buffers.slice(buffer, 1);
assertEquals('d', slice2.get());
expected = null;
try {
slice2.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(4, buffer.position());
final CharBuffer slice3 = Buffers.slice(buffer, -2);
assertEquals(8, buffer.position());
assertEquals(10, buffer.limit());
assertEquals('e', slice3.get());
assertEquals('f', slice3.get());
assertEquals('g', slice3.get());
assertEquals('h', slice3.get());
final CharBuffer slice4 = Buffers.slice(buffer, 2);
assertEquals(2, slice4.limit());
assertEquals('i', slice4.get());
assertEquals('j', slice4.get());
expected = null;
try {
slice3.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(10, buffer.position());
// invalid slice
expected = null;
try {
Buffers.slice(buffer, 1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.slice(buffer, -1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
// check slice properties
slice1.put(0, 'k');
assertEquals('k', buffer.get(0));
buffer.put(3, 'l');
assertEquals('l', slice2.get(0));
slice3.put(3, 'm');
assertEquals('m', buffer.get(7));
buffer.put(8, 'n');
assertEquals('n', slice4.get(0));
}
public void testMultipleShortSlices() {
final ShortBuffer buffer = ShortBuffer.allocate(10);
buffer.put(new short[] {1, 2, 3, 4, 5, 6, 7, 8, 9}).flip();
final ShortBuffer slice1 = Buffers.slice(buffer, 2);
assertEquals(2, slice1.limit());
assertEquals(1, slice1.get());
assertEquals(2, slice1.get());
BufferUnderflowException expected = null;
try {
slice1.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(2, buffer.position());
final ShortBuffer slice2 = Buffers.slice(buffer, 1);
assertEquals(3, slice2.get());
expected = null;
try {
slice2.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(3, buffer.position());
final ShortBuffer slice3 = Buffers.slice(buffer, -3);
assertEquals(6, buffer.position());
assertEquals(9, buffer.limit());
assertEquals(3, slice3.limit());
assertEquals(4, slice3.get());
assertEquals(5, slice3.get());
assertEquals(6, slice3.get());
final ShortBuffer slice4 = Buffers.slice(buffer, 3);
assertEquals(3, slice4.limit());
assertEquals(9, buffer.position());
assertEquals(7, slice4.get());
assertEquals(8, slice4.get());
assertEquals(9, slice4.get());
expected = null;
try {
slice3.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(9, buffer.position());
// invalid slice
expected = null;
try {
Buffers.slice(buffer, 1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.slice(buffer, -1);
} catch(BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
// check slice properties
buffer.put(1, (short) 10);
assertEquals(10, slice1.get(1));
slice2.put(0, (short) 11);
assertEquals(11, buffer.get(2));
buffer.put(3, (short) 12);
assertEquals(12, slice3.get(0));
slice4.put(2, (short) 13);
assertEquals(13, buffer.get(8));
}
public void testMultipleIntSlices() {
final IntBuffer buffer = IntBuffer.allocate(15);
buffer.put(new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37}).flip();
buffer.position(1);
final IntBuffer slice1 = Buffers.slice(buffer, 3);
assertEquals(3, slice1.limit());
assertEquals(3, slice1.get());
assertEquals(5, slice1.get());
assertEquals(7, slice1.get());
BufferUnderflowException expected = null;
try {
slice1.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.slice(buffer, 31);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(4, buffer.position());
final IntBuffer slice2 = Buffers.slice(buffer, 5);
assertEquals(5, slice2.limit());
assertEquals(11, slice2.get());
assertEquals(13, slice2.get());
assertEquals(17, slice2.get());
assertEquals(19, slice2.get());
assertEquals(23, slice2.get());
expected = null;
try {
Buffers.slice(buffer, -7);
} catch (BufferUnderflowException e) {
expected = e;
}
assertEquals(9, buffer.position());
buffer.get();
final IntBuffer slice3 = Buffers.slice(buffer, -2);
expected = null;
try {
slice3.get();
} catch (BufferUnderflowException e) {
expected = e;
}
final IntBuffer slice4 = Buffers.slice(buffer, 2);
assertEquals(2, slice4.limit());
assertEquals(31, slice4.get());
assertEquals(37, slice4.get());
assertEquals(12, buffer.position());
// check slice properties
slice1.put(0, 41);
assertEquals(41, buffer.get(1));
buffer.put(4, 43);
assertEquals(43, slice2.get(0));
slice4.put(1, 47);
assertEquals(47, buffer.get(11));
}
public void testMultipleLongSlices() {
final LongBuffer buffer = LongBuffer.allocate(15);
buffer.put(new long[]{1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121}).flip();
buffer.position(1);
final LongBuffer slice1 = Buffers.slice(buffer, 3);
assertEquals(3, slice1.limit());
assertEquals(4, slice1.get());
assertEquals(9, slice1.get());
assertEquals(16, slice1.get());
BufferUnderflowException expected = null;
try {
slice1.get();
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.slice(buffer, 144);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(4, buffer.position());
final LongBuffer slice2 = Buffers.slice(buffer, 5);
assertEquals(5, slice2.limit());
assertEquals(25, slice2.get());
assertEquals(36, slice2.get());
assertEquals(49, slice2.get());
assertEquals(64, slice2.get());
assertEquals(81, slice2.get());
expected = null;
try {
Buffers.slice(buffer, -169);
} catch (BufferUnderflowException e) {
expected = e;
}
assertEquals(9, buffer.position());
buffer.get();
final LongBuffer slice3 = Buffers.slice(buffer, -1);
assertEquals(0, slice3.limit());
final LongBuffer slice4 = Buffers.slice(buffer, 1);
assertEquals(1, slice4.limit());
assertEquals(121, slice4.get());
// check slice properties
buffer.put(1, 144);
assertEquals(144, slice1.get(0));
slice2.put(0, 169);
assertEquals(169, buffer.get(4));
buffer.put(10, 196);
assertEquals(196, slice4.get(0));
}
private void assertBufferContent(ByteBuffer buffer, String content) {
assertReadMessage(buffer, content);
}
public void testCopyFullBuffer() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
final ByteBuffer copy1 = Buffers.copy(buffer, 10, BufferAllocator.BYTE_BUFFER_ALLOCATOR);
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy1.limit(), copy1.position());
assertArrayEquals(buffer.array(), copy1.array());
buffer.position(0);
final ByteBuffer copy2 = ByteBuffer.allocate(10);
assertEquals(10, Buffers.copy(copy2, buffer));
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy2.limit(), copy2.position());
assertArrayEquals(buffer.array(), copy2.array());
buffer.position(0);
final ByteBuffer[] copy3 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10 , Buffers.copy(copy3, 0, 2, buffer));
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy3[0].limit(), copy3[0].position());
assertEquals(copy3[1].limit(), copy3[1].position());
assertBufferContent(copy3[0], "12345");
assertBufferContent(copy3[1], "67890");
buffer.position(0);
final ByteBuffer copy4 = ByteBuffer.allocate(10);
assertEquals(10, Buffers.copy(10, copy4, buffer));
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy4.limit(), copy4.position());
assertArrayEquals(buffer.array(), copy4.array());
buffer.position(0);
final ByteBuffer[] copy5 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10, Buffers.copy(10, copy5, 1, 2, buffer));
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy5[1].limit(), copy5[1].position());
assertEquals(copy5[2].limit(), copy5[2].position());
assertBufferContent(copy5[1], "12345");
assertBufferContent(copy5[2], "67890");
buffer.position(0);
final ByteBuffer[] copy6 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10, Buffers.copy(30, copy6, 0, 3, buffer));
assertEquals(buffer.limit(), buffer.position());
assertEquals(copy6[0].limit(), copy6[0].position());
assertEquals(copy6[1].limit(), copy6[1].position());
assertBufferContent(copy6[0], "12345");
assertBufferContent(copy6[1], "67890");
//check copy properties
buffer.position(0);
buffer.put((byte) '0');
buffer.put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2.get(0));
assertEquals('2', copy2.get(1));
assertEquals('1', copy3[0].get(0));
assertEquals('2', copy3[0].get(1));
assertEquals('1', copy4.get(0));
assertEquals('2', copy4.get(1));
assertEquals('1', copy5[1].get(0));
assertEquals('2', copy5[1].get(1));
assertEquals('1', copy6[0].get(0));
assertEquals('2', copy6[0].get(1));
copy1.put(2, (byte) '8');
copy2.put(3, (byte) '7');
copy3[0].put(4, (byte) '6');
copy4.put(5, (byte)'5');
copy5[2].put(1, (byte)'4');
copy6[1].put(2, (byte) '3');
assertEquals('3', buffer.get(2));
assertEquals('4', buffer.get(3));
assertEquals('5', buffer.get(4));
assertEquals('6', buffer.get(5));
assertEquals('7', buffer.get(6));
assertEquals('8', buffer.get(7));
}
public void testCopyPartialBuffer() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
final ByteBuffer copy1 = Buffers.copy(buffer, 5, BufferAllocator.BYTE_BUFFER_ALLOCATOR);
assertEquals(5, buffer.position());
assertEquals(copy1.limit(), copy1.position());
assertBufferContent(copy1, "12345");
buffer.position(0);
final ByteBuffer copy2 = ByteBuffer.allocate(7);
assertEquals(7, Buffers.copy(copy2, buffer));
assertEquals(7, buffer.position());
assertEquals(copy2.limit(), copy2.position());
assertBufferContent(copy2, "1234567");
buffer.position(0);
final ByteBuffer[] copy3 = new ByteBuffer[] {ByteBuffer.allocate(2), ByteBuffer.allocate(2)};
assertEquals(4, Buffers.copy(copy3, 0, 2, buffer));
assertEquals(4, buffer.position());
assertEquals(copy3[0].limit(), copy3[0].position());
assertEquals(copy3[1].limit(), copy3[1].position());
assertBufferContent(copy3[0], "12");
assertBufferContent(copy3[1], "34");
buffer.position(0);
final ByteBuffer copy4 = ByteBuffer.allocate(10);
assertEquals(1, Buffers.copy(1, copy4, buffer));
assertEquals(1, buffer.position());
assertEquals(1, copy4.position());
assertEquals('1', copy4.get(0));
buffer.position(0);
final ByteBuffer[] copy5 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(4), ByteBuffer.allocate(6)};
assertEquals(9, Buffers.copy(9, copy5, 1, 2, buffer));
assertEquals(9, buffer.position());
assertEquals(copy5[1].limit(), copy5[1].position());
assertEquals(5, copy5[2].position());
assertBufferContent(copy5[1], "1234");
assertBufferContent(copy5[2], "56789");
//check copy properties
buffer.position(0);
buffer.put((byte) '0');
buffer.put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2.get(0));
assertEquals('2', copy2.get(1));
assertEquals('1', copy3[0].get(0));
assertEquals('2', copy3[0].get(1));
assertEquals('1', copy4.get(0));
assertEquals('1', copy5[1].get(0));
assertEquals('2', copy5[1].get(1));
copy1.put(2, (byte) '8');
copy2.put(3, (byte) '7');
copy3[1].put(1, (byte) '6');
copy4.put(5, (byte)'5');
copy5[2].put(1, (byte)'4');
assertEquals('3', buffer.get(2));
assertEquals('4', buffer.get(3));
assertEquals('5', buffer.get(4));
assertEquals('6', buffer.get(5));
assertEquals('7', buffer.get(6));
}
public void testCopyToSmallerBuffer() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
final ByteBuffer copy1 = ByteBuffer.allocate(7);
assertEquals(7, Buffers.copy(copy1, buffer));
assertEquals(7, buffer.position());
assertEquals(copy1.limit(), copy1.position());
assertBufferContent(copy1, "1234567");
buffer.position(0);
final ByteBuffer[] copy2 = new ByteBuffer[] {ByteBuffer.allocate(2)};
assertEquals(2, Buffers.copy(copy2, 0, 1, buffer));
assertEquals(2, buffer.position());
assertEquals(copy2[0].limit(), copy2[0].position());
assertBufferContent(copy2[0], "12");
buffer.position(0);
final ByteBuffer copy3 = ByteBuffer.allocate(1);
assertEquals(1, Buffers.copy(10, copy3, buffer));
assertEquals(1, buffer.position());
assertEquals(1, copy3.position());
assertEquals('1', copy3.get(0));
buffer.position(0);
final ByteBuffer[] copy4 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(5)};
assertEquals(3, Buffers.copy(15, copy4, 0, 1, buffer));
assertEquals(3, buffer.position());
assertEquals(copy4[0].limit(), copy4[0].position());
assertBufferContent(copy4[0], "123");
//check copy properties
buffer.position(0);
buffer.put((byte) '0');
buffer.put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2[0].get(0));
assertEquals('2', copy2[0].get(1));
assertEquals('1', copy3.get(0));
assertEquals('1', copy4[0].get(0));
assertEquals('2', copy4[0].get(1));
copy1.put(2, (byte) '8');
copy1.put(3, (byte) '7');
copy2[0].put(0, (byte) '6');
copy3.put(0, (byte)'5');
copy4[1].put(2, (byte)'4');
assertEquals('0', buffer.get(0));
assertEquals('9', buffer.get(1));
assertEquals('3', buffer.get(2));
assertEquals('4', buffer.get(3));
assertEquals('5', buffer.get(4));
assertEquals('6', buffer.get(5));
assertEquals('7', buffer.get(6));
}
public void testBufferUnderflowExceptionThrownByCopy() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
buffer.position(2);
BufferUnderflowException expected = null;
try {
Buffers.copy(buffer, 20, BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.copy(buffer, 9, BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.copy(buffer, -15, BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.copy(buffer, -9, BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
// FIXME XNIO-120
public void testCopyWithNegativeSliceSize() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
final ByteBuffer copy1 = Buffers.copy(buffer, -2, BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR);
assertEquals(8, buffer.position());
assertEquals(2, copy1.limit());
assertEquals(2, copy1.position());
assertBufferContent(copy1, "90");
buffer.position(0);
final ByteBuffer copy2 = ByteBuffer.allocate(6);
assertEquals(6, Buffers.copy(-4, copy2, buffer));
assertEquals(6, buffer.position());
assertEquals(6, copy2.limit());
assertEquals(6, copy2.position());
assertBufferContent(copy2, "123456");
final ByteBuffer copy3 = ByteBuffer.allocate(10);
assertEquals(0, Buffers.copy(-4, copy3, buffer));
assertEquals(0, Buffers.copy(-40, copy3, buffer));
buffer.position(0);
final ByteBuffer[] copy4 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(2)};
UnsupportedOperationException expected = null;
try {
assertEquals(5, Buffers.copy(-2, copy4, 0, 2, buffer));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
// XNIO-120 these test assertions are wrong, negative count must work just like negative slice size
// assertEquals(5, buffer.position());
// assertEquals(copy4[0].limit(), copy4[0].position());
// assertEquals(copy4[1].limit(), copy4[1].position());
// assertBufferContent(copy4[0], "123");
// assertBufferContent(copy4[1], "45");
buffer.position(0);
final ByteBuffer[] copy5 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(2)};
expected = null;
try {
assertEquals(4, Buffers.copy(-6, copy5, 0, 2, buffer));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
// XNIO-120 these test assertions are wrong, negative count must work just like negative slice size
// assertEquals(4, buffer.position());
// assertEquals(copy5[0].limit(), copy5[0].position());
// assertEquals(1, copy5[1].position());
// assertBufferContent(copy5[0], "123");
// assertBufferContent(copy5[1], "4");
final ByteBuffer[] copy6 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
expected = null;
try {
assertEquals(0, Buffers.copy(-6, copy6, 0, 2, buffer));
} catch (UnsupportedOperationException e) {
expected = e;
}
expected = null;
try {
assertEquals(0, Buffers.copy(-10, copy6, 0, 2, buffer));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
}
public void testCopyMultipleBuffers() {
final ByteBuffer[] buffer = new ByteBuffer[]{ByteBuffer.allocate(2), ByteBuffer.allocate(2),
ByteBuffer.allocate(2), ByteBuffer.allocate(2), ByteBuffer.allocate(2)};
buffer[0].put("12".getBytes()).flip();
buffer[1].put("34".getBytes()).flip();
buffer[2].put("56".getBytes()).flip();
buffer[3].put("78".getBytes()).flip();
buffer[4].put("90".getBytes()).flip();
final ByteBuffer copy1 = ByteBuffer.allocate(10);
assertEquals(10, Buffers.copy(copy1, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(copy1.limit(), copy1.position());
assertBufferContent(copy1, "1234567890");
final ByteBuffer[] copy2 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10 , Buffers.copy(copy2, 0, 2, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(copy2[0].limit(), copy2[0].position());
assertEquals(copy2[1].limit(), copy2[1].position());
assertBufferContent(copy2[0], "12345");
assertBufferContent(copy2[1], "67890");
final ByteBuffer copy3 = ByteBuffer.allocate(10);
assertEquals(10, Buffers.copy(10, copy3, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(copy3.limit(), copy3.position());
assertBufferContent(copy3, "1234567890");
final ByteBuffer copy4 = ByteBuffer.allocate(50);
assertEquals(10, Buffers.copy(40, copy4, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(10, copy4.position());
assertBufferContent(copy4, "1234567890");
final ByteBuffer[] copy5 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10, Buffers.copy(10, copy5, 1, 2, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(copy5[1].limit(), copy5[1].position());
assertEquals(copy5[2].limit(), copy5[2].position());
assertBufferContent(copy5[1], "12345");
assertBufferContent(copy5[2], "67890");
final ByteBuffer[] copy6 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
assertEquals(10, Buffers.copy(30, copy6, 0, 3, buffer, 0, 5));
for (int i = 0; i < 5; i++) {
assertEquals(buffer[i].limit(), buffer[i].position());
buffer[i].position(0);
}
assertEquals(copy6[0].limit(), copy6[0].position());
assertEquals(copy6[1].limit(), copy6[1].position());
assertBufferContent(copy6[0], "12345");
assertBufferContent(copy6[1], "67890");
//check copy properties
buffer[0].put((byte) '0');
buffer[0].put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2[0].get(0));
assertEquals('2', copy2[0].get(1));
assertEquals('1', copy3.get(0));
assertEquals('2', copy3.get(1));
assertEquals('1', copy4.get(0));
assertEquals('2', copy4.get(1));
assertEquals('1', copy5[1].get(0));
assertEquals('2', copy5[1].get(1));
assertEquals('1', copy6[0].get(0));
assertEquals('2', copy6[0].get(1));
copy1.put(2, (byte) '8');
copy2[0].put(3, (byte) '7');
copy3.put(4, (byte) '6');
copy4.put(5, (byte)'5');
copy5[2].put(1, (byte)'4');
copy6[1].put(2, (byte) '3');
assertEquals('3', buffer[1].get(0));
assertEquals('4', buffer[1].get(1));
assertEquals('5', buffer[2].get(0));
assertEquals('6', buffer[2].get(1));
assertEquals('7', buffer[3].get(0));
assertEquals('8', buffer[3].get(1));
}
public void testPartiallyCopyMultipleBuffers() {
final ByteBuffer[] buffer = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
buffer[0].put("09876".getBytes()).flip();
buffer[1].put("12345".getBytes()).flip();
buffer[2].put("67890".getBytes()).flip();
buffer[3].put("54321".getBytes()).flip();
final ByteBuffer copy1 = ByteBuffer.allocate(7);
assertEquals(7, Buffers.copy(copy1, buffer, 1, 2));
assertEquals(buffer[1].limit(), buffer[1].position());
assertEquals(2, buffer[2].position());
assertEquals(copy1.limit(), copy1.position());
assertBufferContent(copy1, "1234567");
buffer[1].position(0);
buffer[2].position(0);
final ByteBuffer[] copy2 = new ByteBuffer[] {ByteBuffer.allocate(2), ByteBuffer.allocate(2)};
assertEquals(4, Buffers.copy(copy2, 0, 2, buffer, 1, 2));
assertEquals(4, buffer[1].position());
assertEquals(copy2[0].limit(), copy2[0].position());
assertEquals(copy2[1].limit(), copy2[1].position());
assertBufferContent(copy2[0], "12");
assertBufferContent(copy2[1], "34");
buffer[1].position(0);
final ByteBuffer copy3 = ByteBuffer.allocate(10);
assertEquals(1, Buffers.copy(1, copy3, buffer, 1, 2));
assertEquals(1, buffer[1].position());
assertEquals(1, copy3.position());
assertEquals('1', copy3.get(0));
buffer[1].position(0);
final ByteBuffer[] copy4 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(4), ByteBuffer.allocate(6)};
assertEquals(9, Buffers.copy(9, copy4, 1, 2, buffer, 1, 2));
assertEquals(buffer[1].limit(), buffer[1].position());
assertEquals(4, buffer[2].position());
assertEquals(copy4[1].limit(), copy4[1].position());
assertEquals(5, copy4[2].position());
assertBufferContent(copy4[1], "1234");
assertBufferContent(copy4[2], "56789");
//check copy properties
buffer[1].position(0);
buffer[1].put((byte) '0');
buffer[1].put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2[0].get(0));
assertEquals('2', copy2[0].get(1));
assertEquals('1', copy3.get(0));
assertEquals('1', copy4[1].get(0));
assertEquals('2', copy4[1].get(1));
copy1.put(2, (byte) '8');
copy2[1].put(1, (byte) '7');
copy3.put(4, (byte) '6');
copy4[2].put(1, (byte)'5');
assertEquals('3', buffer[1].get(2));
assertEquals('4', buffer[1].get(3));
assertEquals('5', buffer[1].get(4));
assertEquals('6', buffer[2].get(0));
}
public void testCopyMultipleBuffersToSmallerBuffer() {
final ByteBuffer[] buffer = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
buffer[0].put("09876".getBytes()).flip();
buffer[1].put("12345".getBytes()).flip();
buffer[2].put("67890".getBytes()).flip();
buffer[3].put("54321".getBytes()).flip();
final ByteBuffer copy1 = ByteBuffer.allocate(7);
assertEquals(0, Buffers.copy(copy1, buffer, 1, 0));
assertEquals(7, Buffers.copy(copy1, buffer, 1, 2));
assertEquals(buffer[1].limit(), buffer[1].position());
assertEquals(2, buffer[2].position());
assertEquals(copy1.limit(), copy1.position());
assertBufferContent(copy1, "1234567");
buffer[1].position(0);
buffer[2].position(0);
final ByteBuffer[] copy2 = new ByteBuffer[] {ByteBuffer.allocate(2)};
assertEquals(0, Buffers.copy(copy2, 0, 0, buffer, 1, 2));
assertEquals(0, Buffers.copy(copy2, 0, 1, buffer, 0, 0));
assertEquals(2, Buffers.copy(copy2, 0, 1, buffer, 1, 2));
assertEquals(2, buffer[1].position());
assertEquals(copy2[0].limit(), copy2[0].position());
assertBufferContent(copy2[0], "12");
buffer[1].position(0);
final ByteBuffer copy3 = ByteBuffer.allocate(1);
assertEquals(0, Buffers.copy(10, copy3, buffer, 1, 0));
assertEquals(1, Buffers.copy(10, copy3, buffer, 1, 2));
assertEquals(1, buffer[1].position());
assertEquals(1, copy3.position());
assertEquals('1', copy3.get(0));
buffer[1].position(0);
final ByteBuffer[] copy4 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(5)};
assertEquals(0, Buffers.copy(15, copy4, 0, 0, buffer, 1, 2));
assertEquals(0, Buffers.copy(15, copy4, 0, 1, buffer, 1, 0));
assertEquals(0, Buffers.copy(0, copy4, 0, 1, buffer, 1, 2));
assertEquals(3, Buffers.copy(15, copy4, 0, 1, buffer, 1, 2));
assertEquals(3, buffer[1].position());
assertEquals(copy4[0].limit(), copy4[0].position());
assertBufferContent(copy4[0], "123");
//check copy properties
buffer[1].position(0);
buffer[1].put((byte) '0');
buffer[1].put((byte) '9');
assertEquals('1', copy1.get(0));
assertEquals('2', copy1.get(1));
assertEquals('1', copy2[0].get(0));
assertEquals('2', copy2[0].get(1));
assertEquals('1', copy3.get(0));
assertEquals('1', copy4[0].get(0));
assertEquals('2', copy4[0].get(1));
copy1.put(2, (byte) '8');
copy1.put(3, (byte) '7');
copy2[0].put(0, (byte) '6');
copy3.put(0, (byte)'5');
copy4[1].put(2, (byte)'4');
assertEquals('0', buffer[1].get(0));
assertEquals('9', buffer[1].get(1));
assertEquals('3', buffer[1].get(2));
assertEquals('4', buffer[1].get(3));
assertEquals('5', buffer[1].get(4));
assertEquals('6', buffer[2].get(0));
}
// FIXME XNIO-120
public void testCopyMultipleBuffersWithNegativeSliceSize() {
final ByteBuffer[] buffer = new ByteBuffer[] {ByteBuffer.allocate(10), ByteBuffer.allocate(10)};
buffer[0].put("1234567890".getBytes()).flip();
buffer[1].put("1234567890".getBytes()).flip();
final ByteBuffer copy1 = ByteBuffer.allocate(20);
buffer[0].position(8);
UnsupportedOperationException expected = null;
try {
assertEquals(0, Buffers.copy(-40, copy1, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
assertEquals(8, Buffers.copy(-4, copy1, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
// XNIO-120 these test assertions are wrong, negative count must work just like negative slice size
// assertEquals(buffer[0].limit(), buffer[0].position());
// assertEquals(6, buffer[1].position());
// assertEquals(20, copy1.limit());
// assertEquals(8, copy1.position());
// assertBufferContent(copy1, "90123456");
final ByteBuffer copy2 = ByteBuffer.allocate(10);
expected = null;
try {
assertEquals(0, Buffers.copy(-4, copy2, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
assertEquals(0, Buffers.copy(-40, copy2, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
buffer[1].position(0);
final ByteBuffer[] copy3 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(2)};
expected = null;
try {
assertEquals(0, Buffers.copy(-2, copy3, 0, 2, buffer, 0, 2)); // was 5
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
// XNIO-120 these test assertions are wrong, negative count must work just like negative slice size
// assertEquals(5, buffer[1].position());
// assertEquals(copy3[0].limit(), copy3[0].position());
// assertEquals(copy3[1].limit(), copy3[1].position());
// assertBufferContent(copy3[0], "123");
// assertBufferContent(copy3[1], "45");
buffer[0].position(0);
final ByteBuffer[] copy4 = new ByteBuffer[] {ByteBuffer.allocate(3), ByteBuffer.allocate(2), ByteBuffer.allocate(6)};
expected = null;
try {
assertEquals(0, Buffers.copy(-6, copy4, 0, 3, buffer, 0, 2)); // was 9
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
// XNIO-120 these test assertions are wrong, negative count must work just like negative slice size
// assertEquals(9, buffer[0].position());
// assertEquals(5, buffer[1].position());
// assertEquals(copy4[0].limit(), copy4[0].position());
// assertEquals(copy4[1].limit(), copy4[1].position());
// assertEquals(4, copy4[2].position());
// assertBufferContent(copy4[0], "123");
// assertBufferContent(copy4[1], "45");
// assertBufferContent(copy4[2], "6789");
final ByteBuffer[] copy6 = new ByteBuffer[] {ByteBuffer.allocate(5), ByteBuffer.allocate(5)};
expected = null;
try {
assertEquals(0, Buffers.copy(-6, copy6, 0, 2, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
assertEquals(0, Buffers.copy(-10, copy6, 0, 2, buffer, 0, 2));
} catch (UnsupportedOperationException e) {
expected = e;
}
assertNotNull(expected);
}
private void doTestFillByte(final ByteBuffer buf) {
assertSame(buf, Buffers.fill(buf, 5, 30));
assertSame(buf, Buffers.fill(buf, 90, 20));
assertEquals(50, buf.position());
assertEquals(5, buf.get(3));
assertEquals(5, buf.get(29));
assertEquals(90, buf.get(30));
assertEquals(90, buf.get(31));
assertEquals(90, buf.get(49));
BufferUnderflowException expected = null;
try {
Buffers.fill(buf, 75, 300);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.fill(buf, 75, buf.remaining() + 1);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testFillByte() {
final ByteBuffer buf = ByteBuffer.allocate(100);
doTestFillByte(buf);
final ByteBuffer dbuf = ByteBuffer.allocateDirect(100);
doTestFillByte(dbuf);
}
private void doTestFillChar(final CharBuffer buf) {
assertSame(buf, Buffers.fill(buf, 5, 30));
assertSame(buf, Buffers.fill(buf, 90, 20));
assertEquals(50, buf.position());
assertEquals(5, buf.get(3));
assertEquals(5, buf.get(29));
assertEquals(90, buf.get(30));
assertEquals(90, buf.get(31));
assertEquals(90, buf.get(49));
BufferUnderflowException expected = null;
try {
Buffers.fill(buf, 75, 300);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.fill(buf, 75, buf.remaining() + 1);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testFillChar() {
final CharBuffer buf1 = CharBuffer.allocate(100);
doTestFillChar(buf1);
final ByteBuffer buf2 = ByteBuffer.allocateDirect(100 << 1);
doTestFillChar(buf2.asCharBuffer());
}
private void doTestFillShort(final ShortBuffer buf) {
assertSame(buf, Buffers.fill(buf, 5, 30));
assertSame(buf, Buffers.fill(buf, 90, 20));
assertEquals(50, buf.position());
assertEquals(5, buf.get(3));
assertEquals(5, buf.get(29));
assertEquals(90, buf.get(30));
assertEquals(90, buf.get(31));
assertEquals(90, buf.get(49));
BufferUnderflowException expected = null;
try {
Buffers.fill(buf, 75, 300);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.fill(buf, 75, buf.remaining() + 1);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testFillShort() {
final ShortBuffer buf1 = ShortBuffer.allocate(100);
doTestFillShort(buf1);
final ByteBuffer buf2 = ByteBuffer.allocateDirect(100 << 1);
doTestFillShort(buf2.asShortBuffer());
}
private void doTestFillInt(final IntBuffer buf) {
assertSame(buf, Buffers.fill(buf, 5, 30));
assertSame(buf, Buffers.fill(buf, 90, 20));
assertEquals(50, buf.position());
assertEquals(5, buf.get(3));
assertEquals(5, buf.get(29));
assertEquals(90, buf.get(30));
assertEquals(90, buf.get(31));
assertEquals(90, buf.get(49));
BufferUnderflowException expected = null;
try {
Buffers.fill(buf, 75, 300);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.fill(buf, 75, buf.remaining() + 1);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testFillInt() {
final IntBuffer buf1 = IntBuffer.allocate(100);
doTestFillInt(buf1);
final ByteBuffer buf2 = ByteBuffer.allocateDirect(100 << 2);
doTestFillInt(buf2.asIntBuffer());
}
private void doTestFillLong(final LongBuffer buf) {
assertSame(buf, Buffers.fill(buf, 5, 30));
assertSame(buf, Buffers.fill(buf, 90, 20));
assertEquals(50, buf.position());
assertEquals(5, buf.get(3));
assertEquals(5, buf.get(29));
assertEquals(90, buf.get(30));
assertEquals(90, buf.get(31));
assertEquals(90, buf.get(49));
BufferUnderflowException expected = null;
try {
Buffers.fill(buf, 75, 300);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.fill(buf, 75, buf.remaining() + 1);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testFillLong() {
final LongBuffer buf1 = LongBuffer.allocate(100);
doTestFillLong(buf1);
final ByteBuffer buf2 = ByteBuffer.allocateDirect(100 << 3);
doTestFillLong(buf2.asLongBuffer());
}
public void testSkip() {
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("abcdefghij".getBytes()).flip();
assertEquals(0, buffer.position());
assertSame(buffer, Buffers.skip(buffer, 3));
assertEquals(3, buffer.position());
assertSame(buffer, Buffers.skip(buffer, 5));
assertEquals(8, buffer.position());
Exception expected = null;
try {
Buffers.skip(buffer, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.skip(buffer, -20);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.skip(buffer, 3);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.skip(buffer, 5);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
}
public void testTrySkip() {
ByteBuffer buffer = ByteBuffer.allocate(20);
buffer.put("abcdefghijklmnopqrst".getBytes()).flip();
assertEquals(0, buffer.position());
assertEquals(6, Buffers.trySkip(buffer, 6));
assertEquals(6, buffer.position());
assertEquals(10, Buffers.trySkip(buffer, 10));
assertEquals(16, buffer.position());
Exception expected = null;
try {
Buffers.trySkip(buffer, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffer, -40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(4, Buffers.trySkip(buffer, 6));
assertEquals(buffer.limit(), buffer.position());
}
public void testTrySkipBufferArray() {
ByteBuffer[] buffers = new ByteBuffer[] {ByteBuffer.allocate(2), ByteBuffer.allocate(3), ByteBuffer.allocate(4),
ByteBuffer.allocate(5), ByteBuffer.allocate(1)};
buffers[0].put(new byte[] {1, 2}).flip();
buffers[1].put(new byte[] {3, 4, 5}).flip();
buffers[2].put(new byte[] {5, 6, 7, 8}).flip();
buffers[3].put(new byte[] {8, 9, 10, 11}).flip(); // 4 elements only
buffers[4].put((byte) 12).flip();
assertEquals(4, Buffers.trySkip(buffers, 1, 4, 4));
assertEquals(0, buffers[0].position());
assertEquals(3, buffers[1].position());
assertEquals(1, buffers[2].position());
assertEquals(9, Buffers.trySkip(buffers, 0, 4, 10));
assertEquals(2, buffers[0].position());
assertEquals(3, buffers[1].position());
assertEquals(4, buffers[2].position());
assertEquals(4, buffers[3].position());
assertEquals(0, buffers[4].position());
Exception expected = null;
try {
Buffers.trySkip(buffers, 0, 3, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffers, 1, 4, -40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffers, 1, -34, 40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffers, -1, 34, 40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffers, 34, 1, 40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.trySkip(buffers, 1, 5, 40);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(1, Buffers.trySkip(buffers, 2, 3, 6));
assertEquals(2, buffers[0].position());
assertEquals(3, buffers[1].position());
assertEquals(4, buffers[2].position());
assertEquals(4, buffers[3].position());
assertEquals(1, buffers[4].position());
}
public void testUnget() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("123456".getBytes());
Buffers.unget(buffer, 3);
assertEquals('4', buffer.get());
buffer.flip();
Exception expected = null;
try {
Buffers.unget(buffer, 3);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.unget(buffer, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
private void assertBufferContent(byte[] buffer, String content) {
assertReadMessage(buffer, content);
}
public void testTakeBytes() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("1234567890".getBytes()).flip();
byte[] takeResult = Buffers.take(buffer, 2);
assertEquals(2, takeResult.length);
assertBufferContent(takeResult, "12");
Exception expected = null;
try {
Buffers.take(buffer, -5);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.take((ByteBuffer) null, 1);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 5);
assertEquals(5, takeResult.length);
assertBufferContent(takeResult, "34567");
expected = null;
try {
takeResult = Buffers.take(buffer, 5);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 0);
assertEquals(0, takeResult.length);
takeResult = Buffers.take(buffer);
assertEquals(3, takeResult.length);
assertBufferContent(takeResult, "890");
takeResult = Buffers.take(buffer);
assertEquals(0, takeResult.length);
expected = null;
try {
Buffers.take((ByteBuffer) null);
} catch(NullPointerException e) {
expected = e;
}
assertNotNull(expected);
}
public void testTakeChars() {
final CharBuffer buffer = CharBuffer.allocate(10);
buffer.put(new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}).flip();
char[] takeResult = Buffers.take(buffer, 1);
assertEquals(1, takeResult.length);
assertEquals('a', takeResult[0]);
Exception expected = null;
try {
Buffers.take(buffer, -2);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.take((CharBuffer) null, 11);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 5);
assertEquals(5, takeResult.length);
assertEquals('b', takeResult[0]);
assertEquals('c', takeResult[1]);
assertEquals('d', takeResult[2]);
assertEquals('e', takeResult[3]);
assertEquals('f', takeResult[4]);
expected = null;
try {
takeResult = Buffers.take(buffer, 6);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 0);
assertEquals(0, takeResult.length);
takeResult = Buffers.take(buffer);
assertEquals(4, takeResult.length);
assertEquals('g', takeResult[0]);
assertEquals('h', takeResult[1]);
assertEquals('i', takeResult[2]);
assertEquals('j', takeResult[3]);
takeResult = Buffers.take(buffer);
assertEquals(0, takeResult.length);
expected = null;
try {
Buffers.take((CharBuffer) null);
} catch(NullPointerException e) {
expected = e;
}
assertNotNull(expected);
}
public void testTakeShorts() {
final ShortBuffer buffer = ShortBuffer.allocate(10);
buffer.put(new short[] {1, 2, 3, 5, 7, 11, 13, 17, 19}).flip();
short[] takeResult = Buffers.take(buffer, 4);
assertEquals(4, takeResult.length);
assertEquals(1, takeResult[0]);
assertEquals(2, takeResult[1]);
assertEquals(3, takeResult[2]);
assertEquals(5, takeResult[3]);
Exception expected = null;
try {
Buffers.take(buffer, -7);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.take((ShortBuffer) null, 1);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 4);
assertEquals(4, takeResult.length);
assertEquals(7, takeResult[0]);
assertEquals(11, takeResult[1]);
assertEquals(13, takeResult[2]);
assertEquals(17, takeResult[3]);
expected = null;
try {
takeResult = Buffers.take(buffer, 5);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 0);
assertEquals(0, takeResult.length);
takeResult = Buffers.take(buffer);
assertEquals(1, takeResult.length);
assertEquals(19, takeResult[0]);
takeResult = Buffers.take(buffer);
assertEquals(0, takeResult.length);
expected = null;
try {
Buffers.take((ShortBuffer) null);
} catch(NullPointerException e) {
expected = e;
}
assertNotNull(expected);
}
public void testTakeInts() {
final IntBuffer buffer = IntBuffer.allocate(10);
buffer.put(new int[] {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}).flip();
int[] takeResult = Buffers.take(buffer, 2);
assertEquals(2, takeResult.length);
assertEquals(2, takeResult[0]);
assertEquals(4, takeResult[1]);
Exception expected = null;
try {
Buffers.take(buffer, -5);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.take((IntBuffer) null, 1);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 5);
assertEquals(5, takeResult.length);
assertEquals(6, takeResult[0]);
assertEquals(8, takeResult[1]);
assertEquals(10, takeResult[2]);
assertEquals(12, takeResult[3]);
assertEquals(14, takeResult[4]);
expected = null;
try {
takeResult = Buffers.take(buffer, 5);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 0);
assertEquals(0, takeResult.length);
takeResult = Buffers.take(buffer);
assertEquals(3, takeResult.length);
assertEquals(16, takeResult[0]);
assertEquals(18, takeResult[1]);
assertEquals(20, takeResult[2]);
takeResult = Buffers.take(buffer);
assertEquals(0, takeResult.length);
expected = null;
try {
Buffers.take((ByteBuffer) null);
} catch(NullPointerException e) {
expected = e;
}
assertNotNull(expected);
}
public void testTakeLongs() {
final LongBuffer buffer = LongBuffer.allocate(10);
buffer.put(new long[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}).flip();
long[] takeResult = Buffers.take(buffer, 5);
assertEquals(5, takeResult.length);
assertEquals(0, takeResult[0]);
assertEquals(1, takeResult[1]);
assertEquals(2, takeResult[2]);
assertEquals(3, takeResult[3]);
assertEquals(4, takeResult[4]);
Exception expected = null;
try {
Buffers.take(buffer, -1000);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.take((LongBuffer) null, 3);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 1);
assertEquals(1, takeResult.length);
assertEquals(5, takeResult[0]);
expected = null;
try {
takeResult = Buffers.take(buffer, 5);
} catch (BufferUnderflowException e) {
expected = e;
}
assertNotNull(expected);
takeResult = Buffers.take(buffer, 0);
assertEquals(0, takeResult.length);
takeResult = Buffers.take(buffer);
assertEquals(4, takeResult.length);
assertEquals(6, takeResult[0]);
assertEquals(7, takeResult[1]);
assertEquals(8, takeResult[2]);
assertEquals(9, takeResult[3]);
takeResult = Buffers.take(buffer);
assertEquals(0, takeResult.length);
expected = null;
try {
Buffers.take((LongBuffer) null);
} catch(NullPointerException e) {
expected = e;
}
assertNotNull(expected);
}
public void testDumpByteBuffer() throws IOException {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put("create dumper".getBytes()).flip();
assertNotNull(Buffers.createDumper(buffer, 3, 3).toString());
StringBuilder builder = new StringBuilder();
Buffers.dump(buffer, builder, 5, 20);
assertTrue(builder.toString().length() > 0);
assertNotNull(Buffers.createDumper(buffer, 0, 5).toString());
builder = new StringBuilder();
Buffers.dump(buffer, builder, 0, 15);
assertTrue(builder.toString().length() > 0);
IllegalArgumentException expected = null;
try {
Buffers.createDumper(buffer, 3, 0);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.createDumper(buffer, 3, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.createDumper(buffer, -1, 4);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, 3, 0);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, 3, -1);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, -1, 4);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
public void testDumpCharBuffers() throws IOException {
final CharBuffer buffer = CharBuffer.allocate(15);
buffer.put(new char[] {'d', 'u', 'm', 'p', ' ', 'c', 'h', 'a', 'r', 's'}).flip();
assertNotNull(Buffers.createDumper(buffer, 3, 3).toString());
StringBuilder builder = new StringBuilder();
Buffers.dump(buffer, builder, 5, 20);
assertTrue(builder.toString().length() > 0);
assertNotNull(Buffers.createDumper(buffer, 0, 10).toString());
builder = new StringBuilder();
Buffers.dump(buffer, builder, 0, 13);
assertTrue(builder.toString().length() > 0);
IllegalArgumentException expected = null;
try {
Buffers.createDumper(buffer, 10, 0);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.createDumper(buffer, 30, -5);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.createDumper(buffer, -5, 8);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, 10, 0);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, 30, -5);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.dump(buffer, builder, -5, 8);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
public void testEmptyPooledByteBuffer() {
assertEquals(0, Buffers.EMPTY_POOLED_BYTE_BUFFER.getResource().capacity());
Buffers.EMPTY_POOLED_BYTE_BUFFER.discard();
assertEquals(0, Buffers.EMPTY_POOLED_BYTE_BUFFER.getResource().capacity());
Buffers.EMPTY_POOLED_BYTE_BUFFER.free();
assertEquals(0, Buffers.EMPTY_POOLED_BYTE_BUFFER.getResource().capacity());
assertNotNull(Buffers.EMPTY_POOLED_BYTE_BUFFER.toString());
}
public void testRemaining() {
assertFalse(Buffers.hasRemaining(new Buffer[0]));
assertEquals(0, Buffers.remaining(new Buffer[0]));
final ByteBuffer[] buffer = new ByteBuffer[] {ByteBuffer.allocate(10)};
assertTrue(Buffers.hasRemaining(buffer));
assertEquals(10, Buffers.remaining(buffer));
buffer[0].put("12345".getBytes());
assertTrue(Buffers.hasRemaining(buffer));
assertEquals(5, Buffers.remaining(buffer));
buffer[0].put("67890".getBytes());
assertFalse(Buffers.hasRemaining(buffer));
assertEquals(0, Buffers.remaining(buffer));
final ByteBuffer[] buffers = new ByteBuffer[] {ByteBuffer.allocate(2), ByteBuffer.allocate(2),
ByteBuffer.allocate(2), ByteBuffer.allocate(2), ByteBuffer.allocate(2)};
assertTrue(Buffers.hasRemaining(buffers));
assertEquals(10, Buffers.remaining(buffers));
assertEquals(8, Buffers.remaining(buffers, 1, 4));
buffers[2].put("12".getBytes());
assertTrue(Buffers.hasRemaining(buffers));
assertEquals(8, Buffers.remaining(buffers));
assertEquals(6, Buffers.remaining(buffers, 1, 4));
}
public void testPutModifiedUtf8() {
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append('a');
stringBuilder.append((char) -10);
stringBuilder.append((char) 0x777);
stringBuilder.append((char) 0xfff);
stringBuilder.append((char) 0);
final ByteBuffer buffer = ByteBuffer.allocate(15);
Buffers.putModifiedUtf8(buffer, stringBuilder.toString());
assertEquals(11, buffer.position());
buffer.flip();
assertEquals('a', buffer.get());
assertEquals((byte)(0xe0 | 0x0f & ((char)-10) >> 12), buffer.get());
assertEquals((byte)(0x80 | 0x3f & ((char)-10) >> 6), buffer.get());
assertEquals((byte)(0x80 | 0x3f & ((char)-10)), buffer.get());
assertEquals((byte) (0xc0 | 0x1f & ((char) 0x777) >> 6), buffer.get());
assertEquals((byte)(0x80 | 0x3f & ((char) 0x777)), buffer.get());
assertEquals((byte)(0xe0 | 0x0f & ((char) 0xfff) >> 12), buffer.get());
assertEquals((byte)(0x80 | 0x3f & ((char) 0xfff) >> 6), buffer.get());
assertEquals((byte)(0x80 | 0x3f & ((char) 0xfff)), buffer.get());
assertEquals((byte) 0xc0, buffer.get());
assertEquals((byte) 0x80, buffer.get());
}
private void fillBufferModifiedUtf8Test(ByteBuffer buffer) {
// fist char: 'a'
buffer.put((byte)'a');
// second char: '?'
buffer.put((byte) 0xb1);
// third char: '?'
buffer.put((byte) 0xc0);
buffer.put((byte) 0xcd);
// fourth char: (char) 1215
buffer.put((byte) 0xd2);
buffer.put((byte) 0xfbf);
// fifth char: (char) '?'
buffer.put((byte) 0xe9);
buffer.put((byte) 0xc1);
// sixth char: (char) '?'
buffer.put((byte) 0xe0);
buffer.put((byte) 0xdef);
// seventh char: (char)'?'
buffer.put((byte) 0xee);
buffer.put((byte) 0xebf);
buffer.put((byte) 0x1);
// eigth char: (char) 44730
buffer.put((byte) 0xea);
buffer.put((byte) 0xeba);
buffer.put((byte) 0xeba);
// ninth char: '?'
buffer.put((byte) 426); //0xd0+ 0x80, it will be transformed to 170
// tenth char: '?'
buffer.put((byte) 0xff);
// last char: 0
buffer.put((byte) 0);
// char that should not be read
buffer.put((byte) 'z');
buffer.flip();
}
private void assertModifiedUtf8Result(char[] modifiedUtf8) {
assertEquals('a', modifiedUtf8[0]);
assertEquals('?', modifiedUtf8[1]);
assertEquals('?', modifiedUtf8[2]);
assertEquals((char) 1215, modifiedUtf8[3]);
assertEquals('?', modifiedUtf8[4]);
assertEquals('?', modifiedUtf8[5]);
assertEquals('?', modifiedUtf8[6]);
assertEquals((char) 44730, modifiedUtf8[7]);
assertEquals('?', modifiedUtf8[8]);
assertEquals('?', modifiedUtf8[9]);
}
public void testGetMotifiedUtf8Z() {
final ByteBuffer buffer = ByteBuffer.allocate(20);
fillBufferModifiedUtf8Test(buffer);
String result = Buffers.getModifiedUtf8Z(buffer);
char[] resultChars = result.toCharArray();
assertEquals(10, resultChars.length);
assertModifiedUtf8Result(resultChars);
}
public void testGetMotifiedUtf8() {
final ByteBuffer buffer = ByteBuffer.allocate(20);
fillBufferModifiedUtf8Test(buffer);
String result = Buffers.getModifiedUtf8(buffer);
char[] resultChars = result.toCharArray();
assertEquals(12, resultChars.length);
assertModifiedUtf8Result(resultChars);
assertEquals('\0', resultChars[10]);
assertEquals('z', resultChars[11]);
}
public void testReadAsciiZ() {
final ByteBuffer buffer = ByteBuffer.allocate(20);
buffer.put((byte) 'a');
buffer.put((byte) 'b');
buffer.put((byte) 'c');
buffer.put((byte) 0xeba);
buffer.put((byte) -0xff);
buffer.flip();
StringBuilder builder = new StringBuilder();
assertFalse(Buffers.readAsciiZ(buffer, builder));
char[] result = builder.toString().toCharArray();
assertEquals(5, result.length);
assertEquals('a', result[0]);
assertEquals('b', result[1]);
assertEquals('c', result[2]);
assertEquals('?', result[3]);
assertEquals(1, result[4]);
buffer.limit(buffer.capacity());
buffer.put((byte) 0);
buffer.put((byte) 'd');
buffer.flip();
builder = new StringBuilder();
assertTrue(Buffers.readAsciiZ(buffer, builder));
result = builder.toString().toCharArray();
assertEquals(5, result.length);
assertEquals('a', result[0]);
assertEquals('b', result[1]);
assertEquals('c', result[2]);
assertEquals('?', result[3]);
assertEquals(1, result[4]);
assertFalse(Buffers.readAsciiZ(buffer, builder));
}
public void testReadAsciiZWithReplacement() {
final ByteBuffer buffer = ByteBuffer.allocate(20);
buffer.put((byte) 'D');
buffer.put((byte) 'E');
buffer.put((byte) '#');
buffer.put((byte) 0xe0);
buffer.put((byte) 0xaa);
buffer.flip();
StringBuilder builder = new StringBuilder();
assertFalse(Buffers.readAsciiZ(buffer, builder, '#'));
char[] result = builder.toString().toCharArray();
assertEquals(5, result.length);
assertEquals('D', result[0]);
assertEquals('E', result[1]);
assertEquals('#', result[2]);
assertEquals('#', result[3]);
assertEquals((char) '#', result[4]);
buffer.limit(buffer.capacity());
buffer.put((byte) 0);
buffer.put((byte) 'F');
buffer.flip();
builder = new StringBuilder();
assertTrue(Buffers.readAsciiZ(buffer, builder, '\''));
result = builder.toString().toCharArray();
assertEquals(5, result.length);
assertEquals('D', result[0]);
assertEquals('E', result[1]);
assertEquals('#', result[2]);
assertEquals('\'', result[3]);
assertEquals('\'', result[4]);
assertFalse(Buffers.readAsciiZ(buffer, builder, '0'));
}
public void testReadAsciiLine() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put((byte) 'R');
buffer.put((byte) 'e');
buffer.put((byte) 'a');
buffer.put((byte) 'd');
buffer.put((byte) '\n');
buffer.put((byte) '\t');
buffer.put((byte) 'w');
buffer.put((byte) 'e');
buffer.put((byte) 'i');
buffer.put((byte) 'r');
buffer.put((byte) 'd');
buffer.put((byte) '\n');
buffer.put((byte) '\n');
buffer.put((byte) ' ');
buffer.put((byte) 'c');
buffer.put((byte) 'h');
buffer.put((byte) 'a');
buffer.put((byte) 'r');
buffer.put((byte) 's');
buffer.put((byte) ':');
buffer.put((byte) 0xaa);
buffer.put((byte) '\n');
buffer.put((byte) 0xeba);
buffer.put((byte) '\n');
buffer.put((byte) 0xe0);
buffer.put((byte) '\n');
buffer.put((byte) 0);
buffer.put((byte) '#');
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder));
assertEquals("Read\n", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder, '+'));
assertEquals("\tweird\n", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder, '=', '\n'));
assertEquals("\n", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder, '=', ':'));
assertEquals(" chars:", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder));
assertEquals("?\n", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder, '1'));
assertEquals("1\n", builder.toString());
builder = new StringBuilder();
assertTrue(Buffers.readAsciiLine(buffer, builder, '2'));
assertEquals("2\n", builder.toString());
builder = new StringBuilder();
assertFalse(Buffers.readAsciiLine(buffer, builder, '3', '\n'));
assertEquals("\0#", builder.toString());
builder = new StringBuilder();
assertFalse(Buffers.readAsciiLine(buffer, builder, '4', '\n'));
assertTrue(builder.toString().isEmpty());
assertFalse(Buffers.readAsciiLine(buffer, builder, '5', '\n'));
assertTrue(builder.toString().isEmpty());
}
public void testReadAscii() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put("read".getBytes());
buffer.put((byte) 0xeba);
buffer.put("this".getBytes());
buffer.put((byte)0xeba);
buffer.put("until".getBytes());
buffer.put((byte)0xaa);
buffer.put("the".getBytes());
buffer.put((byte)0xaa);
buffer.put("end!!!".getBytes());
buffer.flip();
final StringBuilder builder = new StringBuilder();
Buffers.readAscii(buffer, builder);
assertEquals("read?this?until?the?end!!!", builder.toString());
}
public void testReadAsciiWithReplacement() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put("read".getBytes());
buffer.put((byte) 0xeba);
buffer.put("this".getBytes());
buffer.put((byte)0xeba);
buffer.put("until".getBytes());
buffer.put((byte)0xaa);
buffer.put("the".getBytes());
buffer.put((byte)0xaa);
buffer.put("end!!!".getBytes());
buffer.flip();
final StringBuilder builder = new StringBuilder();
Buffers.readAscii(buffer, builder, '@');
assertEquals("read@this@until@the@end!!!", builder.toString());
}
public void testReadAsciiWithLimit() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put("read".getBytes());
buffer.put((byte) 0xeba);
buffer.put("this".getBytes());
buffer.put((byte)0xeba);
buffer.put("with".getBytes());
buffer.put((byte)0xaa);
buffer.put("some".getBytes());
buffer.put((byte)0xaa);
buffer.put("limit!!!".getBytes());
buffer.flip();
final StringBuilder builder = new StringBuilder();
Buffers.readAscii(buffer, builder, 10, '(');
assertEquals("read(this(", builder.toString());
Buffers.readAscii(buffer, builder, 10, ')');
assertEquals("read(this(with)some)", builder.toString());
Buffers.readAscii(buffer, builder, 5, ' ');
assertEquals("read(this(with)some)limit", builder.toString());
Buffers.readAscii(buffer, builder, 8, ' ');
assertEquals("read(this(with)some)limit!!!", builder.toString());
}
public void testReadLatin1Z() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 0xaaa);
buffer.put((byte) 0xa01);
buffer.put((byte) 0xa02);
buffer.put((byte) 0xa03);
buffer.put((byte) 0xa04);
buffer.put((byte) 0xa05);
buffer.put((byte) 0xa06);
buffer.put((byte) 0x20);
buffer.put((byte) 0x21);
buffer.put((byte) 0x22);
buffer.flip();
StringBuilder builder = new StringBuilder();
assertFalse(Buffers.readLatin1Z(buffer, builder));
char[] chars = builder.toString().toCharArray();
assertEquals(10, chars.length);
assertEquals(0xaa, chars[0]);
assertEquals(1, chars[1]);
assertEquals(2, chars[2]);
assertEquals(3, chars[3]);
assertEquals(4, chars[4]);
assertEquals(5, chars[5]);
assertEquals(6, chars[6]);
assertEquals(0x20, chars[7]);
assertEquals(0x21, chars[8]);
assertEquals(0x22, chars[9]);
buffer.limit(buffer.capacity());
buffer.put((byte) 0x23);
buffer.put((byte) 0xa00);
buffer.put((byte) 0x24);
buffer.flip();
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Z(buffer, builder));
chars = builder.toString().toCharArray();
assertEquals(11, chars.length);
assertEquals(0xaa, chars[0]);
assertEquals(1, chars[1]);
assertEquals(2, chars[2]);
assertEquals(3, chars[3]);
assertEquals(4, chars[4]);
assertEquals(5, chars[5]);
assertEquals(6, chars[6]);
assertEquals(0x20, chars[7]);
assertEquals(0x21, chars[8]);
assertEquals(0x22, chars[9]);
assertEquals(0x23, chars[10]);
}
public void testReadLatin1Line() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 0xaaa);
buffer.put((byte) 0);
buffer.put((byte) 0xa01);
buffer.put((byte) 0xa02);
buffer.put((byte) 0xa03);
buffer.put((byte) 0xa04);
buffer.put((byte) '\n');
buffer.put((byte) '\n');
buffer.put((byte) 0xa05);
buffer.put((byte) 0xa06);
buffer.put((byte) 0x20);
buffer.put((byte) '\n');
buffer.put((byte) 0x21);
buffer.put((byte) '\n');
buffer.put((byte) 0x22);
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder));
char[] chars = builder.toString().toCharArray();
assertEquals(7, chars.length);
assertEquals(0xaa, chars[0]);
assertEquals(0, chars[1]);
assertEquals(1, chars[2]);
assertEquals(2, chars[3]);
assertEquals(3, chars[4]);
assertEquals(4, chars[5]);
assertEquals('\n', chars[6]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder));
chars = builder.toString().toCharArray();
assertEquals(1, chars.length);
assertEquals('\n', chars[0]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder));
chars = builder.toString().toCharArray();
assertEquals(4, chars.length);
assertEquals(5, chars[0]);
assertEquals(6, chars[1]);
assertEquals(0x20, chars[2]);
assertEquals('\n', chars[3]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder));
chars = builder.toString().toCharArray();
assertEquals(2, chars.length);
assertEquals(0x21, chars[0]);
assertEquals('\n', chars[1]);
builder = new StringBuilder();
assertFalse(Buffers.readLatin1Line(buffer, builder));
chars = builder.toString().toCharArray();
assertEquals(1, chars.length);
assertEquals(0x22, chars[0]);
}
public void testReadLatin1LineWithDelimeter() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 0xaaa);
buffer.put((byte) 0);
buffer.put((byte) 0xa01);
buffer.put((byte) 0xa02);
buffer.put((byte) 0xa03);
buffer.put((byte) 0xa04);
buffer.put((byte) '\t');
buffer.put((byte) 'x');
buffer.put((byte) 0xa05);
buffer.put((byte) 0xa06);
buffer.put((byte) 0x20);
buffer.put((byte) 'y');
buffer.put((byte) 0x21);
buffer.put((byte) 'z');
buffer.put((byte) 0x22);
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder, '\t'));
char[] chars = builder.toString().toCharArray();
assertEquals(7, chars.length);
assertEquals(0xaa, chars[0]);
assertEquals(0, chars[1]);
assertEquals(1, chars[2]);
assertEquals(2, chars[3]);
assertEquals(3, chars[4]);
assertEquals(4, chars[5]);
assertEquals('\t', chars[6]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder, 'x'));
chars = builder.toString().toCharArray();
assertEquals(1, chars.length);
assertEquals('x', chars[0]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder, 'y'));
chars = builder.toString().toCharArray();
assertEquals(4, chars.length);
assertEquals(5, chars[0]);
assertEquals(6, chars[1]);
assertEquals(0x20, chars[2]);
assertEquals('y', chars[3]);
builder = new StringBuilder();
assertTrue(Buffers.readLatin1Line(buffer, builder, 'z'));
chars = builder.toString().toCharArray();
assertEquals(2, chars.length);
assertEquals(0x21, chars[0]);
assertEquals('z', chars[1]);
builder = new StringBuilder();
assertFalse(Buffers.readLatin1Line(buffer, builder, (char) 0));
chars = builder.toString().toCharArray();
assertEquals(1, chars.length);
assertEquals(0x22, chars[0]);
}
public void testReadLatin1() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 0xa59);
buffer.put((byte) 0xa58);
buffer.put((byte) 0xa57);
buffer.put((byte) 0xa56);
buffer.put((byte) 0xa55);
buffer.put((byte) 0xa54);
buffer.put((byte) 0x53);
buffer.put((byte) 0x52);
buffer.put((byte) 0x51);
buffer.put((byte) 0x0);
buffer.put((byte) 0x50);
buffer.flip();
final StringBuilder builder = new StringBuilder();
Buffers.readLatin1(buffer, builder);
final char[] chars = builder.toString().toCharArray();
assertEquals(11, chars.length);
assertEquals(0x59, chars[0]);
assertEquals(0x58, chars[1]);
assertEquals(0x57, chars[2]);
assertEquals(0x56, chars[3]);
assertEquals(0x55, chars[4]);
assertEquals(0x54, chars[5]);
assertEquals(0x53, chars[6]);
assertEquals(0x52, chars[7]);
assertEquals(0x51, chars[8]);
assertEquals(0x0, chars[9]);
assertEquals(0x50, chars[10]);
}
public void testReadModifiedUtf8Z() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put((byte) 0xa00); // '\0'
buffer.put((byte) 'a'); // 'a'
buffer.put((byte) 'B'); // 'B'
buffer.put((byte) 0xf89); // '?'
buffer.put((byte) 0xaa1); // '?'
buffer.put((byte) 0xd9); // partial char info
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(1, buffer.position());
assertTrue(builder.toString().isEmpty());
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(5, buffer.position());
char[] modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Chars.length);
assertEquals('a', modifiedUtf8Chars[0]);
assertEquals('B', modifiedUtf8Chars[1]);
assertEquals('?', modifiedUtf8Chars[2]);
assertEquals('?', modifiedUtf8Chars[3]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(5, buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(6, (byte) 0xc1); // '?'
buffer.put(7, (byte) 0xd5);
buffer.put(8, (byte) 0x88); // (0xd5 & 0x1f) << 6 | 0x88 & 0x3f)
buffer.put(9, (byte) 0xe2); // partial char info
buffer.limit(10);
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(9, buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Chars.length);
assertEquals('?', modifiedUtf8Chars[0]);
assertEquals((char) (0xd5 & 0x1f) << 6 | (0x88 & 0x3f), modifiedUtf8Chars[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(10, (byte) 0xcc); // '?'
buffer.put(11, (byte) 0xfee);
buffer.put(12, (byte) 0x81); // partial char info
buffer.limit(13);
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(11, buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Chars.length);
assertEquals('?', modifiedUtf8Chars[0]);
buffer.limit(buffer.capacity());
buffer.put(13, (byte) 0x8ca); // '?'
buffer.put(14, (byte) 0xef);
buffer.put(15, (byte) 0xc8a);
buffer.put(16, (byte) 0xc8b); // (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f
buffer.put(17, (byte) 0xfff);
buffer.put(18, (byte) 0xffa);
buffer.put(19, (byte) 0xff6);
buffer.limit(20);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertEquals(buffer.limit(), buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(5, modifiedUtf8Chars.length);
assertEquals('?', modifiedUtf8Chars[0]);
assertEquals((char) (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f, modifiedUtf8Chars[1]);
assertEquals('?', modifiedUtf8Chars[2]);
assertEquals('?', modifiedUtf8Chars[3]);
assertEquals('?', modifiedUtf8Chars[4]);
// test with empty buffer
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder));
assertTrue(builder.toString().isEmpty());
}
public void testReadModifiedUtf8ZWithReplacement() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put((byte) 0xa00); // '\0'
buffer.put((byte) 'a'); // 'a'
buffer.put((byte) 'B'); // 'B'
buffer.put((byte) 0xf89); // replacement char
buffer.put((byte) 0xaa1); // replacement char
buffer.put((byte) 0xd9); // partial char info
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Z(buffer, builder, '!'));
assertEquals(1, buffer.position());
assertTrue(builder.toString().isEmpty());
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '@'));
assertEquals(5, buffer.position());
char[] modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Chars.length);
assertEquals('a', modifiedUtf8Chars[0]);
assertEquals('B', modifiedUtf8Chars[1]);
assertEquals('@', modifiedUtf8Chars[2]);
assertEquals('@', modifiedUtf8Chars[3]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '#'));
assertEquals(5, buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(6, (byte) 0xc1); // replacement char
buffer.put(7, (byte) 0xd5);
buffer.put(8, (byte) 0x88); // (0xd5 & 0x1f) << 6 | 0x88 & 0x3f)
buffer.put(9, (byte) 0xe2); // partial char info
buffer.limit(10);
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '$'));
assertEquals(9, buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Chars.length);
assertEquals('$', modifiedUtf8Chars[0]);
assertEquals((char) (0xd5 & 0x1f) << 6 | (0x88 & 0x3f), modifiedUtf8Chars[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '%'));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(10, (byte) 0xcc); // replacement char
buffer.put(11, (byte) 0xfee);
buffer.put(12, (byte) 0x81); // partial char info
buffer.limit(13);
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '&'));
assertEquals(11, buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Chars.length);
assertEquals('&', modifiedUtf8Chars[0]);
buffer.limit(buffer.capacity());
buffer.put(13, (byte) 0x8ca); // replacement char
buffer.put(14, (byte) 0xef);
buffer.put(15, (byte) 0xc8a);
buffer.put(16, (byte) 0xc8b); // (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f
buffer.put(17, (byte) 0xfff);
buffer.put(18, (byte) 0xffa);
buffer.put(19, (byte) 0xff6);
buffer.limit(20);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '*'));
assertEquals(buffer.limit(), buffer.position());
modifiedUtf8Chars = builder.toString().toCharArray();
assertEquals(5, modifiedUtf8Chars.length);
assertEquals('*', modifiedUtf8Chars[0]);
assertEquals((char) (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f, modifiedUtf8Chars[1]);
assertEquals('*', modifiedUtf8Chars[2]);
assertEquals('*', modifiedUtf8Chars[3]);
assertEquals('*', modifiedUtf8Chars[4]);
// test with empty buffer
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Z(buffer, builder, '+'));
assertTrue(builder.toString().isEmpty());
}
public void testReadModifiedUtf8Line() {
final ByteBuffer buffer = ByteBuffer.allocate(40);
buffer.put((byte) '\n');
buffer.put((byte) '\n');
buffer.put((byte) 0xa00); // '\0'
buffer.put((byte) '\n');
buffer.put((byte) 'a'); // 'a'
buffer.put((byte) 'B'); // 'B'
buffer.put((byte) 0xf89); // '?'
buffer.put((byte) 0xaa1); // '?'
buffer.put((byte) '\n');
buffer.put((byte) 0xd9); // partial char info
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(1, buffer.position());
char[] modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('\n', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(2, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('\n', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(4, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('\0', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(9, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(5, modifiedUtf8Line.length);
assertEquals('a', modifiedUtf8Line[0]);
assertEquals('B', modifiedUtf8Line[1]);
assertEquals('?', modifiedUtf8Line[2]);
assertEquals('?', modifiedUtf8Line[3]);
assertEquals('\n', modifiedUtf8Line[4]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(9, buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(10, (byte) 0xc1); // '?'
buffer.put(11, (byte) 0xd5);
buffer.put(12, (byte) 0x88); // (0xd5 & 0x1f) << 6 | 0x88 & 0x3f)
buffer.put(13, (byte) 0xe2); // partial char info
buffer.limit(14);
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(13, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('?', modifiedUtf8Line[0]);
assertEquals((char) (0xd5 & 0x1f) << 6 | (0x88 & 0x3f), modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(14, (byte) 0xcc); // '?'
buffer.put(15, (byte) '\n');
buffer.put(16, (byte) 0xfee);
buffer.put(17, (byte) 0x81); // partial char info
buffer.limit(18);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(16, buffer.position());
modifiedUtf8Line= builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('?', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(18, (byte) 0x8ca); // '?'
buffer.put(19, (byte) 0xef);
buffer.put(20, (byte) 0xc8a);
buffer.put(21, (byte) 0xc8b); // (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f
buffer.put(22, (byte) 0xfff); // '?'
buffer.put(23, (byte) '\n');
buffer.put(24, (byte) 0xffa); // '?'
buffer.put(25, (byte) '\n');
buffer.put(26, (byte) 0xff6); // '?'
buffer.limit(27);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(24, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals('?', modifiedUtf8Line[0]);
assertEquals((char) (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f, modifiedUtf8Line[1]);
assertEquals('?', modifiedUtf8Line[2]);
assertEquals('\n', modifiedUtf8Line[3]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(26, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('?', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(27, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('?', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(27, (byte) 'c');
buffer.put(28, (byte) 0xc0);
buffer.put(29, (byte) 0x8a); // '\n'
buffer.put(30, (byte) 'D');
buffer.put(31, (byte) 'e');
buffer.put(32, (byte) 'F');
buffer.put(33, (byte) 0xe0);
buffer.put(34, (byte) 0x80);
buffer.put(35, (byte) 0x8a); // '\n'
buffer.limit(36);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(30, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('c', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder));
assertEquals(buffer.limit(), buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals('D', modifiedUtf8Line[0]);
assertEquals('e', modifiedUtf8Line[1]);
assertEquals('F', modifiedUtf8Line[2]);
assertEquals('\n', modifiedUtf8Line[3]);
// test with empty buffer
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder));
assertTrue(builder.toString().isEmpty());
}
public void testReadModifiedUtf8LineWithReplacement() {
final ByteBuffer buffer = ByteBuffer.allocate(40);
buffer.put((byte) '\n');
buffer.put((byte) '\n');
buffer.put((byte) 0xa00); // '\0'
buffer.put((byte) '\n');
buffer.put((byte) 'a'); // 'a'
buffer.put((byte) 'B'); // 'B'
buffer.put((byte) 0xf89); // replacement char
buffer.put((byte) 0xaa1); // replacement char
buffer.put((byte) '\n');
buffer.put((byte) 0xd9); // partial char info
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 500));
assertEquals(1, buffer.position());
char[] modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('\n', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 501));
assertEquals(2, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('\n', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 502));
assertEquals(4, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('\0', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 503));
assertEquals(9, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(5, modifiedUtf8Line.length);
assertEquals('a', modifiedUtf8Line[0]);
assertEquals('B', modifiedUtf8Line[1]);
assertEquals((char) 503, modifiedUtf8Line[2]);
assertEquals((char) 503, modifiedUtf8Line[3]);
assertEquals('\n', modifiedUtf8Line[4]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 504));
assertEquals(9, buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(10, (byte) 0xc1); // replacement char
buffer.put(11, (byte) 0xd5);
buffer.put(12, (byte) 0x88); // (0xd5 & 0x1f) << 6 | 0x88 & 0x3f)
buffer.put(13, (byte) 0xe2); // partial char info
buffer.limit(14);
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 505));
assertEquals(13, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 505, modifiedUtf8Line[0]);
assertEquals((char) (0xd5 & 0x1f) << 6 | (0x88 & 0x3f), modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 506));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(14, (byte) 0xcc); // replacement char
buffer.put(15, (byte) '\n');
buffer.put(16, (byte) 0xfee);
buffer.put(17, (byte) 0x81); // partial char info
buffer.limit(18);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 507));
assertEquals(16, buffer.position());
modifiedUtf8Line= builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 507, modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 508));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(18, (byte) 0x8ca); // replacement char
buffer.put(19, (byte) 0xef);
buffer.put(20, (byte) 0xc8a);
buffer.put(21, (byte) 0xc8b); // (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f
buffer.put(22, (byte) 0xfff); // replacement char
buffer.put(23, (byte) '\n');
buffer.put(24, (byte) 0xffa); // replacement char
buffer.put(25, (byte) '\n');
buffer.put(26, (byte) 0xff6); // replacement char
buffer.limit(27);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 509));
assertEquals(24, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals((char) 509, modifiedUtf8Line[0]);
assertEquals((char) (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f, modifiedUtf8Line[1]);
assertEquals((char) 509, modifiedUtf8Line[2]);
assertEquals('\n', modifiedUtf8Line[3]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 510));
assertEquals(26, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 510, modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 511));
assertEquals(27, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals((char) 511, modifiedUtf8Line[0]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 512));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(27, (byte) 'c');
buffer.put(28, (byte) 0xc0);
buffer.put(29, (byte) 0x8a); // '\n'
buffer.put(30, (byte) 'D');
buffer.put(31, (byte) 'e');
buffer.put(32, (byte) 'F');
buffer.put(33, (byte) 0xe0);
buffer.put(34, (byte) 0x80);
buffer.put(35, (byte) 0x8a); // '\n'
buffer.limit(36);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 513));
assertEquals(30, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('c', modifiedUtf8Line[0]);
assertEquals('\n', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 514));
assertEquals(buffer.limit(), buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals('D', modifiedUtf8Line[0]);
assertEquals('e', modifiedUtf8Line[1]);
assertEquals('F', modifiedUtf8Line[2]);
assertEquals('\n', modifiedUtf8Line[3]);
// test with empty buffer
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 515));
assertTrue(builder.toString().isEmpty());
}
public void testReadModifiedUtf8LineWithReplacementAndDelimiter() {
final ByteBuffer buffer = ByteBuffer.allocate(40);
buffer.put((byte) '!');
buffer.put((byte) '@');
buffer.put((byte) 0xa00); // '\0'
buffer.put((byte) '#');
buffer.put((byte) 'a'); // 'a'
buffer.put((byte) 'B'); // 'B'
buffer.put((byte) 0xf89); // replacement char
buffer.put((byte) 0xaa1); // replacement char
buffer.put((byte) '$');
buffer.put((byte) 0xd9); // partial char info
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 14, '!'));
assertEquals(1, buffer.position());
char[] modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('!', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 13, '@'));
assertEquals(2, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals('@', modifiedUtf8Line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 12, '#'));
assertEquals(4, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('\0', modifiedUtf8Line[0]);
assertEquals('#', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 11, '$'));
assertEquals(9, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(5, modifiedUtf8Line.length);
assertEquals('a', modifiedUtf8Line[0]);
assertEquals('B', modifiedUtf8Line[1]);
assertEquals((char) 11, modifiedUtf8Line[2]);
assertEquals((char) 11, modifiedUtf8Line[3]);
assertEquals('$', modifiedUtf8Line[4]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 10, '*'));
assertEquals(9, buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(10, (byte) 0xc1); // replacement char
buffer.put(11, (byte) 0xd5);
buffer.put(12, (byte) 0x88); // (0xd5 & 0x1f) << 6 | 0x88 & 0x3f)
buffer.put(13, (byte) 0xe2); // partial char info
buffer.limit(14);
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 9, '('));
assertEquals(13, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 9, modifiedUtf8Line[0]);
assertEquals((char) (0xd5 & 0x1f) << 6 | (0x88 & 0x3f), modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 8, ')'));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(14, (byte) 0xcc); // replacement char
buffer.put(15, (byte) '_');
buffer.put(16, (byte) 0xfee);
buffer.put(17, (byte) 0x81); // partial char info
buffer.limit(18);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 7, '_'));
assertEquals(16, buffer.position());
modifiedUtf8Line= builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 7, modifiedUtf8Line[0]);
assertEquals('_', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 6, '+'));
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(18, (byte) 0x8ca); // replacement char
buffer.put(19, (byte) 0xef);
buffer.put(20, (byte) 0xc8a);
buffer.put(21, (byte) 0xc8b); // (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f
buffer.put(22, (byte) 0xfff); // replacement char
buffer.put(23, (byte) '{');
buffer.put(24, (byte) 0xffa); // replacement char
buffer.put(25, (byte) '}');
buffer.put(26, (byte) 0xff6); // replacement char
buffer.limit(27);
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 5, '{'));
assertEquals(24, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals((char) 5, modifiedUtf8Line[0]);
assertEquals((char) (0xef & 0x0f) << 12 | (0x8a & 0x3f) << 6 | 0x8b & 0x3f, modifiedUtf8Line[1]);
assertEquals((char) 5, modifiedUtf8Line[2]);
assertEquals('{', modifiedUtf8Line[3]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 4, '}'));
assertEquals(26, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals((char) 4, modifiedUtf8Line[0]);
assertEquals('}', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 3, '['));
assertEquals(27, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(1, modifiedUtf8Line.length);
assertEquals((char) 3, modifiedUtf8Line[0]);
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) 2, ']'));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(27, (byte) 'c');
buffer.put(28, (byte) 0xc1);
buffer.put(29, (byte) 0x9d); // ']'
buffer.put(30, (byte) 'D');
buffer.put(31, (byte) 'e');
buffer.put(32, (byte) 'F');
buffer.put(33, (byte) 0xe0);
buffer.put(34, (byte) 0x81);
buffer.put(35, (byte) 0xbc); // '|'
buffer.limit(36);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 1, ']'));
assertEquals(30, buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(2, modifiedUtf8Line.length);
assertEquals('c', modifiedUtf8Line[0]);
assertEquals(']', modifiedUtf8Line[1]);
builder = new StringBuilder();
assertTrue(Buffers.readModifiedUtf8Line(buffer, builder, (char) 0, '|'));
assertEquals(buffer.limit(), buffer.position());
modifiedUtf8Line = builder.toString().toCharArray();
assertEquals(4, modifiedUtf8Line.length);
assertEquals('D', modifiedUtf8Line[0]);
assertEquals('e', modifiedUtf8Line[1]);
assertEquals('F', modifiedUtf8Line[2]);
assertEquals('|', modifiedUtf8Line[3]);
// test with empty buffer
builder = new StringBuilder();
assertFalse(Buffers.readModifiedUtf8Line(buffer, builder, (char) -1, '='));
assertTrue(builder.toString().isEmpty());
}
public void testReadLine() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 'a');
buffer.put((byte) 'b');
buffer.put((byte) 'c');
buffer.put((byte) '\n');
buffer.put((byte) 'd');
buffer.put((byte) 'e');
buffer. put((byte) 'f');
buffer.put((byte) '\n');
buffer.put((byte) 'g');
buffer.put((byte) 'h');
buffer.put((byte) 'i');
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(4, buffer.position());
char[] line = builder.toString().toCharArray();
assertEquals(4, line.length);
assertEquals('a', line[0]);
assertEquals('b', line[1]);
assertEquals('c', line[2]);
assertEquals('\n', line[3]);
builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(8, buffer.position());
line = builder.toString().toCharArray();
assertEquals(4, line.length);
assertEquals('d', line[0]);
assertEquals('e', line[1]);
assertEquals('f', line[2]);
assertEquals('\n', line[3]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(buffer.limit(), buffer.position());
line = builder.toString().toCharArray();
assertEquals(3, line.length);
assertEquals('g', line[0]);
assertEquals('h', line[1]);
assertEquals('i', line[2]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(buffer.position(), (byte) '\n');
buffer.put(buffer.position() + 1, (byte) '\n');
buffer.limit(buffer.position() + 2);
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(12, buffer.position());
line = builder.toString().toCharArray();
assertEquals(1, line.length);
assertEquals('\n', line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(buffer.limit(), buffer.position());
line = builder.toString().toCharArray();
assertEquals(1, line.length);
assertEquals('\n', line[0]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder()));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
}
public void testReadLineWithDelimiter() {
final ByteBuffer buffer = ByteBuffer.allocate(15);
buffer.put((byte) 'a');
buffer.put((byte) 'b');
buffer.put((byte) 'c');
buffer.put((byte) '\\');
buffer.put((byte) 'd');
buffer.put((byte) 'e');
buffer. put((byte) 'f');
buffer.put((byte) '/');
buffer.put((byte) 'g');
buffer.put((byte) 'h');
buffer.put((byte) 'i');
buffer.flip();
StringBuilder builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '\\'));
assertEquals(4, buffer.position());
char[] line = builder.toString().toCharArray();
assertEquals(4, line.length);
assertEquals('a', line[0]);
assertEquals('b', line[1]);
assertEquals('c', line[2]);
assertEquals('\\', line[3]);
builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '/'));
assertEquals(8, buffer.position());
line = builder.toString().toCharArray();
assertEquals(4, line.length);
assertEquals('d', line[0]);
assertEquals('e', line[1]);
assertEquals('f', line[2]);
assertEquals('/', line[3]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '|'));
assertEquals(buffer.limit(), buffer.position());
line = builder.toString().toCharArray();
assertEquals(3, line.length);
assertEquals('g', line[0]);
assertEquals('h', line[1]);
assertEquals('i', line[2]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '|'));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
buffer.limit(buffer.capacity());
buffer.put(buffer.position(), (byte) '|');
buffer.put(buffer.position() + 1, (byte) '_');
buffer.limit(buffer.position() + 2);
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '|'));
assertEquals(12, buffer.position());
line = builder.toString().toCharArray();
assertEquals(1, line.length);
assertEquals('|', line[0]);
builder = new StringBuilder();
assertTrue(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '_'));
assertEquals(buffer.limit(), buffer.position());
line = builder.toString().toCharArray();
assertEquals(1, line.length);
assertEquals('_', line[0]);
builder = new StringBuilder();
assertFalse(Buffers.readLine(buffer, builder, Charset.defaultCharset().newDecoder(), '_'));
assertEquals(buffer.limit(), buffer.position());
assertTrue(builder.toString().isEmpty());
}
private void assertPooledBuffers(Pooled<ByteBuffer> pooledBuffer1, Pooled<ByteBuffer> pooledBuffer2) {
assertNotNull(pooledBuffer1.toString());
assertNotNull(pooledBuffer1.getResource());
assertNotNull(pooledBuffer2.toString());
assertNotNull(pooledBuffer2.getResource());
pooledBuffer1.discard();
IllegalStateException expected = null;
try {
pooledBuffer1.getResource();
} catch (IllegalStateException e) {
expected = e;
}
assertNotNull(expected);
assertNotNull(pooledBuffer1.toString());
pooledBuffer1.free();
expected = null;
try {
pooledBuffer1.getResource();
} catch (IllegalStateException e) {
expected = e;
}
assertNotNull(expected);
assertNotNull(pooledBuffer1.toString());
pooledBuffer2.free();
expected = null;
try {
pooledBuffer2.getResource();
} catch (IllegalStateException e) {
expected = e;
}
assertNotNull(expected);
assertNotNull(pooledBuffer2.toString());
pooledBuffer2.discard();
expected = null;
try {
pooledBuffer2.getResource();
} catch (IllegalStateException e) {
expected = e;
}
assertNotNull(expected);
assertNotNull(pooledBuffer2.toString());
}
public void testPooledWrapper() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
final Pooled<ByteBuffer> pooledBuffer1 = Buffers.pooledWrapper(buffer);
final Pooled<ByteBuffer> pooledBuffer2 = Buffers.pooledWrapper(buffer);
assertNotNull(pooledBuffer1);
assertSame(buffer, pooledBuffer1.getResource());
assertNotNull(pooledBuffer2);
assertSame(buffer, pooledBuffer2.getResource());
assertPooledBuffers(pooledBuffer1, pooledBuffer2);
}
private void assertFlippedBufferContent(ByteBuffer buffer, String content) {
buffer.position(buffer.limit());
assertBufferContent(buffer, content);
}
public void testSliceAllocator() {
final ByteBuffer buffer = ByteBuffer.allocate(30);
buffer.put("abcdefghijklmnopqrstuvwxyz1234".getBytes()).flip();
final BufferAllocator<ByteBuffer> allocator = Buffers.sliceAllocator(buffer);
final ByteBuffer slice1 = allocator.allocate(5);
final ByteBuffer slice2 = allocator.allocate(10);
final ByteBuffer slice3 = allocator.allocate(15);
assertEquals(5, slice1.limit());
assertEquals(5, slice1.capacity());
assertEquals(0, slice1.position());
assertFlippedBufferContent(slice1, "abcde");
slice1.put(0, (byte) '5');
buffer.put(1, (byte) '6');
assertEquals('5', buffer.get(0));
assertEquals('6', slice1.get(1));
assertEquals(10, slice2.limit());
assertEquals(10, slice2.capacity());
assertFlippedBufferContent(slice2, "fghijklmno");
slice2.put(0, (byte) '7');
buffer.put(6, (byte) '8');
assertEquals('7', buffer.get(5));
assertEquals('8', slice2.get(1));
assertEquals(15, slice3.limit());
assertEquals(15, slice3.capacity());
assertFlippedBufferContent(slice3, "pqrstuvwxyz1234");
slice3.put(0, (byte) '9');
buffer.put(16, (byte) '0');
assertEquals('9', buffer.get(15));
assertEquals('0', slice3.get(1));
}
public void testSliceAllocatorWithAllocatedBufferPool() {
final ByteBuffer buffer = ByteBuffer.allocate(12);
buffer.put("abcdefghijkl".getBytes()).flip();
final BufferAllocator<ByteBuffer> allocator = Buffers.sliceAllocator(buffer);
final Pool<ByteBuffer> slice1Pool = Buffers.allocatedBufferPool(allocator, 5);
final ByteBuffer slice1 = slice1Pool.allocate().getResource();
final Pool<ByteBuffer> slice2Pool = Buffers.allocatedBufferPool(allocator, 7);
final ByteBuffer slice2 = slice2Pool.allocate().getResource();
assertEquals(5, slice1.limit());
assertEquals(5, slice1.capacity());
assertEquals(0, slice1.position());
assertFlippedBufferContent(slice1, "abcde");
slice1.put(0, (byte) '5');
buffer.put(1, (byte) '6');
assertEquals('5', buffer.get(0));
assertEquals('6', slice1.get(1));
assertEquals(7, slice2.limit());
assertEquals(7, slice2.capacity());
assertFlippedBufferContent(slice2, "fghijkl");
slice2.put(0, (byte) '7');
buffer.put(6, (byte) '8');
assertEquals('7', buffer.get(5));
assertEquals('8', slice2.get(1));
}
public void testSecureBufferPool() {
final ByteBufferSlicePool pool = new ByteBufferSlicePool(BufferAllocator.BYTE_BUFFER_ALLOCATOR, 17000, 17000 * 16);
final Pool<ByteBuffer> securePool = Buffers.secureBufferPool(pool);
assertNotNull(securePool);
assertTrue(Buffers.isSecureBufferPool(securePool));
assertFalse(Buffers.isSecureBufferPool(pool));
Pooled<ByteBuffer> pooledBuffer1 = securePool.allocate();
Pooled<ByteBuffer> pooledBuffer2 = securePool.allocate();
assertNotNull(pooledBuffer1);
assertNotNull(pooledBuffer2);
assertPooledBuffers(pooledBuffer1, pooledBuffer2);
}
public void testZeroByteBuffer() {
final ByteBuffer buffer1 = ByteBuffer.allocate(23);
final ByteBuffer buffer2 = ByteBuffer.allocate(24);
for (int i = 0; i < 23; i++) {
buffer1.put((byte) i);
buffer2.put((byte) i);
}
buffer2.put((byte) 23);
Buffers.zero(buffer1);
Buffers.zero(buffer2);
assertEquals(0, buffer1.position());
assertEquals(0, buffer2.position());
assertEquals(buffer1.capacity(), buffer1.limit());
assertEquals(buffer2.capacity(), buffer2.limit());
while(buffer1.hasRemaining()) {
assertEquals(0, buffer1.get());
}
while(buffer2.hasRemaining()) {
assertEquals(0, buffer2.get());
}
}
public void testZeroCharBuffer() {
final CharBuffer buffer1 = CharBuffer.allocate(95);
final CharBuffer buffer2 = CharBuffer.allocate(96);
for (int i = 0; i < 23; i++) {
buffer1.put((char) i);
buffer2.put((char) i);
}
buffer2.put((char) 23);
Buffers.zero(buffer1);
Buffers.zero(buffer2);
assertEquals(0, buffer1.position());
assertEquals(0, buffer2.position());
assertEquals(buffer1.capacity(), buffer1.limit());
assertEquals(buffer2.capacity(), buffer2.limit());
while(buffer1.hasRemaining()) {
assertEquals(0, buffer1.get());
}
while(buffer2.hasRemaining()) {
assertEquals(0, buffer2.get());
}
}
public void testIsDirect() {
final ByteBuffer buffer1 = ByteBuffer.allocate(5);
final ByteBuffer buffer2 = ByteBuffer.allocateDirect(10);
final ByteBuffer buffer3 = ByteBuffer.allocateDirect(15);
final ByteBuffer buffer4 = ByteBuffer.allocateDirect(15);
final ByteBuffer buffer5 = ByteBuffer.allocate(15);
final ByteBuffer buffer6 = ByteBuffer.allocate(15);
final ByteBuffer[] buffers = new ByteBuffer[] {buffer1, buffer2, buffer3, buffer4, buffer5, buffer6};
assertFalse(Buffers.isDirect(new ByteBuffer[] {buffer1}));
assertTrue(Buffers.isDirect(new ByteBuffer[] {buffer2}));
IllegalArgumentException expected = null;
try {
assertFalse(Buffers.isDirect(buffers));
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
assertTrue(Buffers.isDirect(buffers, 1, 3));
expected = null;
try {
Buffers.isDirect(buffers, 1, 4);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
assertFalse(Buffers.isDirect(buffers, 4, 2));
expected = null;
try {
Buffers.isDirect(new ByteBuffer[] {null});
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
ByteBuffer[] buffersWithNull = new ByteBuffer[] {buffer2, buffer3, buffer4, null};
assertTrue(Buffers.isDirect(buffersWithNull, 0, 3));
expected = null;
try {
Buffers.isDirect(buffersWithNull, 0, 4);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
public void testAssertWritable() {
final ByteBuffer buffer = ByteBuffer.allocate(10);
final ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();
Buffers.assertWritable(new ByteBuffer[] {buffer});
Buffers.assertWritable(new ByteBuffer[] {buffer, buffer, buffer, buffer});
Buffers.assertWritable(new ByteBuffer[] {buffer, buffer, buffer}, 0, 2);
Buffers.assertWritable(new ByteBuffer[] {readOnlyBuffer, readOnlyBuffer, buffer, buffer, buffer, buffer, buffer,
readOnlyBuffer}, 2, 5);
ReadOnlyBufferException expected = null;
try {
Buffers.assertWritable(new ByteBuffer[] {readOnlyBuffer});
} catch (ReadOnlyBufferException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.assertWritable(new ByteBuffer[] {buffer, buffer, buffer, readOnlyBuffer});
} catch (ReadOnlyBufferException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.assertWritable(new ByteBuffer[] {readOnlyBuffer, readOnlyBuffer, readOnlyBuffer}, 1, 1);
} catch (ReadOnlyBufferException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Buffers.assertWritable(new ByteBuffer[] {readOnlyBuffer, readOnlyBuffer, buffer, readOnlyBuffer}, 2, 2);
} catch (ReadOnlyBufferException e) {
expected = e;
}
assertNotNull(expected);
}
public void testAddRandom() {
final ByteBuffer buffer = ByteBuffer.allocate(20);
final Random random = new Random();
Buffers.addRandom(buffer);
Buffers.addRandom(buffer, 2 <= buffer.remaining()? 2: buffer.remaining());
Buffers.addRandom(buffer, random);
Buffers.addRandom(buffer, random, buffer.remaining());
assertEquals(buffer.limit(), buffer.position());
byte randomValue = 0;
buffer.flip();
int count = 0;
while(buffer.hasRemaining()) {
byte currentValue = buffer.get();
if (currentValue == randomValue) {
if (++count > 2) {
fail("3 bytes in a row with the same random value " + currentValue);
}
} else {
count = 0;
randomValue = currentValue;
}
}
assertEquals(buffer.limit(), buffer.position());
// nothing should happen on an already full buffer
Buffers.addRandom(buffer);
assertEquals(buffer.limit(), buffer.position());
Buffers.addRandom(buffer, 0);
assertEquals(buffer.limit(), buffer.position());
Buffers.addRandom(buffer, random);
assertEquals(buffer.limit(), buffer.position());
Buffers.addRandom(buffer, random, 0);
assertEquals(buffer.limit(), buffer.position());
}
}