package com.cloudhopper.commons.util;
/*
* #%L
* ch-commons-util
* %%
* Copyright (C) 2012 Cloudhopper by Twitter
* %%
* 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.
* #L%
*/
// third party imports
import org.junit.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// my imports
//import net.cloudhopper.commons.util.ByteBuffer;
/**
*
* @author joelauer (twitter: @jjlauer or <a href="http://twitter.com/jjlauer" target=window>http://twitter.com/jjlauer</a>)
*/
public class ByteBufferTest {
private static final Logger logger = LoggerFactory.getLogger(ByteBufferTest.class);
private static final byte[] TEST_BYTES1 = {'H','E','L','L','O',' ','W','O','R','L','D'};
private static final byte[] TEST_HELLO = {'H','E','L','L','O'};
private static final byte[] TEST_H = {'H'};
private static final byte[] TEST_WORLD = {'W','O','R','L','D'};
private static final byte[] TEST_W = {'W'};
private static final byte[] TEST_D = {'D'};
private static final byte[] TEST_L = {'L'};
private static final byte[] TEST_LL = {'L','L'};
private static final byte[] TEST_SPACE = {' '};
private static final byte[] TEST_SPACEH = {' ','H'};
private static final byte[] TEST_SPACEW = {' ','W'};
private static final byte[] TEST_BYTES2 = {'C','A','A','A','A','A','A','A','B','A','A','A','B','B','B','B','B','B'};
private static final byte[] TEST_AA = {'A','A'};
private static final byte[] TEST_AB = {'A','B'};
private static final byte[] TEST_BB = {'B','B'};
private static final byte[] TEST_C = {'C'};
private static final byte[] COMMA = {','};
/**
* Helper method for creating a buffer that probably is trashed -- circled
* at least 3 times just to make sure we're testing for the most difficult
* scenario in any method.
*
* @param capacity Capacity of ByteBuffer to create
* @return The new ByteBuffer with set capacity
*/
private static ByteBuffer createCircledByteBuffer(int capacity) {
ByteBuffer buf = new ByteBuffer(capacity);
try {
for (int j = 0; j < 3; j++) {
// add almost enough bytes
for (int i = 0; i < capacity-1; i++)
buf.add((byte)0);
for (int i = 0; i < capacity-1; i++)
buf.remove();
}
} catch (BufferException e) {
// should not happen
logger.error("Impossible case should not happen", e);
}
return buf;
}
private static String createDebugString(byte[] bytes) {
try {
return new String(bytes, "ISO-8859-1");
} catch (Exception e) {
logger.error("Impossible case should not happen", e);
throw new IllegalArgumentException("Impossible case should not happen");
}
}
@Test(expected=IllegalArgumentException.class)
public void invalidCapacityInConstructor1() {
ByteBuffer buffer = new ByteBuffer(0);
}
@Test(expected=IllegalArgumentException.class)
public void invalidCapacityInConstructor2() {
ByteBuffer buffer = new ByteBuffer(-1);
}
@Test(expected=IllegalArgumentException.class)
public void longConstructorNegativeOffset() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, -1, 2, TEST_BYTES1.length);
}
@Test(expected=IllegalArgumentException.class)
public void longConstructorNegativeLength() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, -1, TEST_BYTES1.length);
}
@Test(expected=IllegalArgumentException.class)
public void longConstructorWithLargeOffset() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, TEST_BYTES1.length, 0, TEST_BYTES1.length);
}
@Test
public void longConstructorWithZeroOffsetLength() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, 0, TEST_BYTES1.length);
}
@Test(expected=IllegalArgumentException.class)
public void longConstructorWithTooSmallCapacity() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, TEST_BYTES1.length, TEST_BYTES1.length-1);
}
@Test(expected=IllegalArgumentException.class)
public void longConstructorWithNegativeCapacity() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, 0, -1);
}
@Test
public void constructorWithByteArray() {
// normal case
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
Assert.assertEquals(true, buffer.equals(TEST_BYTES1));
Assert.assertEquals(TEST_BYTES1.length, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
Assert.assertEquals(0, buffer.free());
// difficult case - zero length buffer - should be okay even though
// it doesn't make much sense
buffer = new ByteBuffer(new byte[0]);
Assert.assertEquals(false, buffer.equals(TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(new byte[0]));
Assert.assertEquals(0, buffer.size());
Assert.assertEquals(1, buffer.capacity());
Assert.assertEquals(1, buffer.free());
}
@Test
public void constructorWithByteArrayOffsetLength() {
// normal case - entire bytes
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, TEST_BYTES1.length);
Assert.assertEquals(true, buffer.equals(TEST_BYTES1));
Assert.assertEquals(TEST_BYTES1.length, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
Assert.assertEquals(0, buffer.free());
// normal case - with offset included
buffer = new ByteBuffer(TEST_BYTES1, 6, TEST_BYTES1.length-6);
Assert.assertEquals(false, buffer.equals(TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(TEST_WORLD));
Assert.assertEquals(TEST_BYTES1.length-6, buffer.size());
Assert.assertEquals(TEST_BYTES1.length-6, buffer.capacity());
Assert.assertEquals(0, buffer.free());
// difficult case - zero length
buffer = new ByteBuffer(TEST_BYTES1, 6, 0, TEST_BYTES1.length);
Assert.assertEquals(false, buffer.equals(TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(new byte[0]));
Assert.assertEquals(0, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
Assert.assertEquals(TEST_BYTES1.length, buffer.free());
}
@Test(expected=IllegalArgumentException.class)
public void constructorWithByteArrayOffsetLengthCapacityToCauseIllegalArgumentException() {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, TEST_BYTES1.length, -1);
}
@Test
public void constructorWithByteArrayOffsetLengthCapacity() {
// normal case - entire bytes
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, 0, TEST_BYTES1.length, TEST_BYTES1.length);
Assert.assertEquals(true, buffer.equals(TEST_BYTES1));
Assert.assertEquals(TEST_BYTES1.length, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
Assert.assertEquals(0, buffer.free());
// normal case - with offset included
buffer = new ByteBuffer(TEST_BYTES1, 6, TEST_BYTES1.length-6, TEST_BYTES1.length-6);
Assert.assertEquals(false, buffer.equals(TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(TEST_WORLD));
Assert.assertEquals(TEST_BYTES1.length-6, buffer.size());
Assert.assertEquals(TEST_BYTES1.length-6, buffer.capacity());
Assert.assertEquals(0, buffer.free());
// difficult case - zero length
buffer = new ByteBuffer(TEST_BYTES1, 6, 0, TEST_BYTES1.length);
Assert.assertEquals(false, buffer.equals(TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(new byte[0]));
Assert.assertEquals(0, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
Assert.assertEquals(TEST_BYTES1.length, buffer.free());
}
@Test
public void size() throws BufferException {
ByteBuffer buffer = new ByteBuffer();
Assert.assertEquals(0, buffer.size());
buffer.add((byte)10);
Assert.assertEquals(1, buffer.size());
for (int i = 0; i < 10; i++)
buffer.add((byte)10);
Assert.assertEquals(11, buffer.size());
}
@Test
public void capacity() throws BufferException {
int expCapacity = 100;
ByteBuffer buffer = new ByteBuffer(expCapacity);
int actCapacity = buffer.capacity();
Assert.assertEquals(expCapacity, actCapacity);
}
@Test
public void isFree() throws BufferException {
ByteBuffer buffer = new ByteBuffer(1);
Assert.assertTrue(buffer.isFree(0));
Assert.assertTrue(buffer.isFree(1));
buffer.add((byte)10);
Assert.assertFalse(buffer.isFree(1));
}
@Test(expected=IllegalArgumentException.class)
public void isFreeToCauseIllegalArgumentException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(1);
buffer.isFree(-1);
}
@Test
public void free() throws BufferException {
ByteBuffer buffer = new ByteBuffer(10);
Assert.assertEquals(10, buffer.free());
buffer.add((byte)0);
buffer.add((byte)0);
buffer.add((byte)0);
Assert.assertEquals(7, buffer.free());
}
@Test
public void isEmpty() throws BufferException {
ByteBuffer buffer = new ByteBuffer();
Assert.assertTrue(buffer.isEmpty());
// fill it with some data
buffer.add((byte)10);
Assert.assertFalse(buffer.isEmpty());
}
@Test
public void isFull() throws BufferException {
ByteBuffer buffer = new ByteBuffer(1);
Assert.assertTrue(buffer.isEmpty());
// fill it with some data
Assert.assertFalse(buffer.isFull());
buffer.add((byte)10);
Assert.assertTrue(buffer.isFull());
}
@Test(expected=BufferIsFullException.class)
public void addToCauseBufferIsFullException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
// append 5 bytes
for (int i = 0; i < 5; i++)
buffer.add((byte)10);
// this should trigger an exception
buffer.add((byte)11);
}
@Test
public void addWithArray() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
byte[] tmpbuf = buffer.remove(TEST_BYTES1.length);
Assert.assertArrayEquals(TEST_BYTES1, tmpbuf);
}
@Test(expected=BufferSizeException.class)
public void addWithArrayToCauseBufferSizeException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length-1);
buffer.add(TEST_BYTES1);
}
@Test
public void addWithArrayEmptyArrayNoException() throws BufferException {
byte[] data = new byte[0]; // create zero length buffer
ByteBuffer buffer = new ByteBuffer(1);
buffer.add(data); // this should succeed with no exception
}
@Test
public void addWithArrayOffset() throws BufferException {
// create a shorted buffer from our sample
int offset = 5;
byte[] tmpbuf2 = new byte[TEST_BYTES1.length-offset];
// this should contain a copy of the correct offset array
System.arraycopy(TEST_BYTES1, offset, tmpbuf2, 0, TEST_BYTES1.length-offset);
// now create our buffer
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1, offset, TEST_BYTES1.length-offset);
byte[] tmpbuf = buffer.remove(TEST_BYTES1.length-offset);
Assert.assertArrayEquals(tmpbuf2, tmpbuf);
}
@Test(expected=IllegalArgumentException.class)
public void addWithArrayNegativeOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(100);
buffer.add(TEST_BYTES1, -1, TEST_BYTES1.length);
}
@Test(expected=IllegalArgumentException.class)
public void addWithArrayNegativeLength() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(100);
buffer.add(TEST_BYTES1, 0, -1);
}
@Test(expected=IllegalArgumentException.class)
public void addWithArrayWithTooLargeLength() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(100);
buffer.add(TEST_BYTES1, 0, TEST_BYTES1.length+1);
}
@Test(expected=IllegalArgumentException.class)
public void addWithArrayWithOffsetAndTooLargeLength() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(6);
buffer.add(TEST_BYTES1, 5, TEST_BYTES1.length-4);
}
@Test(expected=IllegalArgumentException.class)
public void addWithArrayWithLargeOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
// most difficult case where the offset is off by 1
buffer.add(TEST_BYTES1, TEST_BYTES1.length, 0);
}
@Test
public void addAndRemove() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
// append 5 bytes (0-4)
for (int i = 0; i < 5; i++)
buffer.add((byte)i);
// check that each byte back matches what we would expect
for (int i = 0; i < 5; i++) {
byte b = buffer.remove();
Assert.assertEquals((byte)i, b);
}
}
@Test(expected=BufferIsEmptyException.class)
public void removeToCauseBufferIsEmptyException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.remove();
}
@Test(expected=BufferIsEmptyException.class)
public void removeToCauseBufferIsEmptyException2() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)1);
buffer.add((byte)1);
buffer.add((byte)1);
buffer.remove();
buffer.remove();
buffer.remove();
buffer.remove();
}
// does not test 'circular' feature
@Test
public void addAndRemoveWithByteArrayNoCircular() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length);
// add it with single method
for (int i = 0; i < TEST_BYTES1.length; i++) {
buffer.add(TEST_BYTES1[i]);
}
// remove it and test for equality
byte[] tmp = buffer.remove(TEST_BYTES1.length);
Assert.assertArrayEquals(TEST_BYTES1, tmp);
}
// does test adding/removing with circular functionality
@Test
public void addAndRemoveWithByteArrayWithCircular() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length);
// add and delete several bytes to cause a single circle to occur
buffer.add((byte)0);
buffer.add((byte)0);
buffer.remove();
buffer.remove();
// the buffer should not effectively 'circle' around to store the last
// two bytes in the first 2 byte positions of the underlying byte[]
// add it with single method
for (int i = 0; i < TEST_BYTES1.length; i++) {
buffer.add(TEST_BYTES1[i]);
}
// remove it and test for equality
byte[] tmp = buffer.remove(TEST_BYTES1.length);
Assert.assertArrayEquals(TEST_BYTES1, tmp);
}
@Test
public void removeByteArrayZeroCount() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)1);
// removing zero bytes should be ok
byte[] tmp = buffer.remove(0);
Assert.assertArrayEquals(new byte[0], tmp);
}
@Test(expected=BufferSizeException.class)
public void removeWithByteArrayToCauseBufferSizeException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)1);
// there should only be 1 byte in this buffer
byte[] tmp = buffer.remove(2);
}
@Test
public void get() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)0);
byte b = buffer.get(0);
Assert.assertEquals((byte)0, b);
}
@Test(expected=IllegalArgumentException.class)
public void getToCauseIllegalArgumentException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)0);
byte b = buffer.get(-1);
}
@Test(expected=IllegalArgumentException.class)
public void getToCauseIllegalArgumentException2() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)0);
// buffer capacity is 5, and index of 4 is the maximum, so 5 should fail
byte b = buffer.get(5);
}
@Test
public void hashCodeZeroSized() throws BufferException {
// hashCode's should be the same -- we'll test by making sure the other
// values in the instance don't match such as readPosition, etc.
ByteBuffer buffer = new ByteBuffer(100);
int bufferHashCode = buffer.hashCode();
ByteBuffer buffer2 = createCircledByteBuffer(300);
int buffer2HashCode = buffer2.hashCode();
// both hashCode's should be the same
Assert.assertEquals(true, buffer.equals(buffer2));
Assert.assertEquals(bufferHashCode, buffer2HashCode);
}
@Test
public void hashCodeSameValuesDifferentInstances() throws BufferException {
// hashCode's should be the same -- we'll test by making sure the other
// values in the instance don't match such as readPosition, etc.
byte[] text = StringUtil.getAsciiBytes("Thisisareallylongstringwithnospaces");
ByteBuffer buffer = new ByteBuffer(text);
int bufferHashCode = buffer.hashCode();
ByteBuffer buffer2 = createCircledByteBuffer(300);
buffer2.add(text);
int buffer2HashCode = buffer2.hashCode();
// both hashCode's should be the same
Assert.assertEquals(true, buffer.equals(buffer2));
Assert.assertEquals(bufferHashCode, buffer2HashCode);
}
@Test(expected=BufferSizeException.class)
public void getToCauseBufferSizeException() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
// buffer is only size 0 now
// this should fail
byte b = buffer.get(0);
}
@Test(expected=BufferSizeException.class)
public void getToCauseBufferSizeException2() throws BufferException {
ByteBuffer buffer = new ByteBuffer(5);
buffer.add((byte)0);
// buffer is only size 1 now
// this should fail
byte b = buffer.get(1);
}
// does not test 'circular' feature
@Test
public void removeNoCircular() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1.length);
// add it with single method
for (int i = 0; i < TEST_BYTES1.length; i++) {
buffer.add(TEST_BYTES1[i]);
}
buffer.delete(TEST_BYTES1.length);
Assert.assertEquals(0, buffer.size());
Assert.assertEquals(TEST_BYTES1.length, buffer.capacity());
// let's add data back to make sure everything is still ok
buffer.add((byte)0);
byte b = buffer.remove();
Assert.assertEquals((byte)0, b);
}
// does test deleting with circular functionality
@Test
public void removeWithCircular() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// remove it and test for equality
byte[] tmp = buffer.remove(TEST_BYTES1.length);
Assert.assertArrayEquals(TEST_BYTES1, tmp);
}
@Test
public void deleteCountZero() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
// deleting zero is fine
buffer.delete(0);
// add bytes to this buffer
buffer.add(TEST_BYTES1);
// delete 'em all
buffer.delete(TEST_BYTES1.length);
Assert.assertEquals(0, buffer.size());
}
@Test
public void toArray() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
byte[] copyArray = buffer.toArray();
Assert.assertArrayEquals(TEST_BYTES1, copyArray);
}
@Test
public void toArrayWithExtraCapacity() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1, TEST_BYTES1.length+20);
byte[] copyArray = buffer.toArray();
Assert.assertArrayEquals(TEST_BYTES1, copyArray);
// validate our returned buffer isn't larger capacity
Assert.assertEquals(TEST_BYTES1.length, copyArray.length);
}
@Test
public void toArrayWithCircledBuffer() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length+20);
buffer.add(TEST_BYTES1);
byte[] copyArray = buffer.toArray();
Assert.assertArrayEquals(TEST_BYTES1, copyArray);
}
@Test
public void toArrayZeroLength() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length+20);
//buffer.add(TEST_BYTES1);
byte[] zeroArray = new byte[0];
byte[] copyArray = buffer.toArray();
Assert.assertArrayEquals(zeroArray, copyArray);
}
@Test(expected=IllegalArgumentException.class)
public void toArrayWithOffsetLengthSmallCapacity() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
byte[] copyArray = buffer.toArray(5, 2, 1);
}
@Test
public void toArrayWithOffsetLengthCapacity() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
byte[] copyArray = buffer.toArray(3, 1, 1);
Assert.assertArrayEquals(this.TEST_L, copyArray);
copyArray = buffer.toArray(5, 2, 2);
Assert.assertArrayEquals(this.TEST_SPACEW, copyArray);
copyArray = buffer.toArray(10, 1, 4);
byte[] tmp = new byte[4];
tmp[0] = (byte)'D';
Assert.assertArrayEquals(tmp, copyArray);
Assert.assertEquals(4, copyArray.length);
}
@Test
public void toArrayWithOffsetLengthCapacityWithCircledBuffer() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
byte[] copyArray = buffer.toArray(3, 1, 1);
Assert.assertArrayEquals(this.TEST_L, copyArray);
copyArray = buffer.toArray(5, 2, 2);
Assert.assertArrayEquals(this.TEST_SPACEW, copyArray);
copyArray = buffer.toArray(10, 1, 4);
byte[] tmp = new byte[4];
tmp[0] = (byte)'D';
Assert.assertArrayEquals(tmp, copyArray);
Assert.assertEquals(4, copyArray.length);
}
@Test
public void toArrayWithTargetBuffer() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// create our new targetBuffer
byte[] targetBuffer = new byte[TEST_BYTES1.length];
buffer.toArray(0, buffer.size(), targetBuffer, 0);
Assert.assertEquals(targetBuffer.length, TEST_BYTES1.length);
Assert.assertArrayEquals(TEST_BYTES1, targetBuffer);
}
@Test
public void toArrayWithTargetBufferOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// create our new targetBuffer
byte[] targetBuffer = new byte[5];
buffer.toArray(6, 5, targetBuffer, 0);
Assert.assertArrayEquals(TEST_WORLD, targetBuffer);
}
@Test(expected=IllegalArgumentException.class)
public void toArrayWithTargetSmallCapacity() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// create our new targetBuffer
byte[] targetBuffer = new byte[5];
buffer.toArray(5, 6, targetBuffer, 0);
}
@Test(expected=IllegalArgumentException.class)
public void toArrayWithTargetBadTargetOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// create our new targetBuffer
byte[] targetBuffer = new byte[6];
buffer.toArray(0, 6, targetBuffer, 1);
}
@Test
public void startsWith() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
Assert.assertEquals(true, buffer.startsWith(TEST_H));
Assert.assertEquals(true, buffer.startsWith(TEST_HELLO));
Assert.assertEquals(false, buffer.startsWith(TEST_WORLD));
Assert.assertEquals(false, buffer.startsWith(TEST_W));
buffer.clear();
buffer.add(TEST_WORLD);
Assert.assertEquals(false, buffer.startsWith(TEST_H));
Assert.assertEquals(false, buffer.startsWith(TEST_HELLO));
Assert.assertEquals(true, buffer.startsWith(TEST_WORLD));
Assert.assertEquals(true, buffer.startsWith(TEST_W));
buffer.clear();
buffer.add(TEST_HELLO);
Assert.assertEquals(true, buffer.startsWith(TEST_H));
Assert.assertEquals(true, buffer.startsWith(TEST_HELLO));
// test a longer buffer that does start with the same buffer
Assert.assertEquals(false, buffer.startsWith(TEST_BYTES1));
}
@Test
public void endsWith() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
//byte[] tmpbuf = buffer.toArray();
//String tmpstr = createDebugString(tmpbuf);
//logger.debug("buffer currently contains=" + tmpstr);
Assert.assertEquals(false, buffer.endsWith(TEST_H));
Assert.assertEquals(false, buffer.endsWith(TEST_HELLO));
Assert.assertEquals(true, buffer.endsWith(TEST_WORLD));
buffer.clear();
buffer.add(TEST_WORLD);
//byte[] tmpbuf2 = buffer.toArray();
//String tmpstr2 = createDebugString(tmpbuf2);
//logger.debug("buffer currently contains=" + tmpstr2);
Assert.assertEquals(true, buffer.endsWith(TEST_D));
Assert.assertEquals(false, buffer.endsWith(TEST_HELLO));
Assert.assertEquals(true, buffer.endsWith(TEST_WORLD));
Assert.assertEquals(false, buffer.endsWith(TEST_W));
buffer.clear();
buffer.add(TEST_HELLO);
Assert.assertEquals(false, buffer.endsWith(TEST_H));
Assert.assertEquals(true, buffer.endsWith(TEST_HELLO));
// test a longer buffer that does start with the same buffer
Assert.assertEquals(false, buffer.endsWith(TEST_BYTES1));
}
@Test
public void indexOf() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// test normal case
Assert.assertEquals(0, buffer.indexOf(TEST_H));
Assert.assertEquals(0, buffer.indexOf(TEST_HELLO));
Assert.assertEquals(0, buffer.indexOf(TEST_BYTES1));
// test too long now
buffer.remove();
Assert.assertEquals(-1, buffer.indexOf(TEST_BYTES1));
// test end -- buffer should be 1 less now such as ELLO WORLD
Assert.assertEquals(9, buffer.indexOf(TEST_D));
// test middle
Assert.assertEquals(-1, buffer.indexOf(TEST_SPACEH));
Assert.assertEquals(4, buffer.indexOf(TEST_SPACEW));
Assert.assertEquals(5, buffer.indexOf(TEST_WORLD));
buffer.clear();
Assert.assertEquals(-1, buffer.indexOf(TEST_SPACEH));
}
@Test(expected=IllegalArgumentException.class)
public void indexOfWithNegativeOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
buffer.indexOf(TEST_H, -1);
}
@Test(expected=IllegalArgumentException.class)
public void indexOfWithTooLargeOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
buffer.indexOf(TEST_H, TEST_BYTES1.length);
}
@Test
public void indexOfWithOffset() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
// test normal case
Assert.assertEquals(0, buffer.indexOf(TEST_H, 0));
Assert.assertEquals(-1, buffer.indexOf(TEST_H, 1));
// empty data is always -1
Assert.assertEquals(-1, buffer.indexOf(new byte[0], 0));
Assert.assertEquals(10, buffer.indexOf(TEST_D, 0));
Assert.assertEquals(10, buffer.indexOf(TEST_D, 10));
Assert.assertEquals(10, buffer.indexOf(TEST_D, 3));
Assert.assertEquals(2, buffer.indexOf(TEST_LL, 0));
Assert.assertEquals(2, buffer.indexOf(TEST_LL, 2));
Assert.assertEquals(6, buffer.indexOf(TEST_WORLD));
Assert.assertEquals(5, buffer.indexOf(TEST_SPACEW));
}
@Test
public void indexOfWithOffset2() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES2.length);
buffer.add(TEST_BYTES2);
// test normal case
Assert.assertEquals(-1, buffer.indexOf(TEST_AA, 11));
}
@Test
public void occurrences() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
Assert.assertEquals(-1, buffer.occurrences(new byte[0]));
Assert.assertEquals(3, buffer.occurrences(TEST_L));
Assert.assertEquals(1, buffer.occurrences(TEST_LL));
Assert.assertEquals(1, buffer.occurrences(TEST_H));
byte[] tmp = {'A'};
Assert.assertEquals(0, buffer.occurrences(tmp));
}
@Test
public void occurrencesWithByte() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
Assert.assertEquals(3, buffer.occurrences((byte)'L'));
Assert.assertEquals(1, buffer.occurrences((byte)'H'));
Assert.assertEquals(0, buffer.occurrences((byte)'A'));
}
@Test
public void occurrencesWithOverlap() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES2);
Assert.assertEquals(-1, buffer.occurrences(new byte[0]));
Assert.assertEquals(1, buffer.occurrences(TEST_C));
Assert.assertEquals(4, buffer.occurrences(TEST_AA));
Assert.assertEquals(2, buffer.occurrences(TEST_AB));
Assert.assertEquals(3, buffer.occurrences(TEST_BB));
}
@Test
public void equals() throws BufferException {
ByteBuffer buffer = createCircledByteBuffer(TEST_BYTES1.length);
buffer.add(TEST_BYTES1);
ByteBuffer buffer2 = createCircledByteBuffer(TEST_BYTES1.length);
buffer2.add(TEST_BYTES1);
// test normal case
Assert.assertEquals(false, buffer.equals((Object)TEST_BYTES1));
Assert.assertEquals(true, buffer.equals(buffer2));
buffer2.remove();
Assert.assertEquals(false, buffer.equals(buffer2));
// test override for byte[]
Assert.assertEquals(true, buffer.equals(TEST_BYTES1));
}
public void equalsWithZeroArrays() throws BufferException {
ByteBuffer buffer = new ByteBuffer(1);
buffer.add(new byte[0]);
Assert.assertEquals(true, buffer.equals(new byte[0]));
ByteBuffer buffer2 = new ByteBuffer(1);
Assert.assertEquals(true, buffer.equals(buffer2));
}
@Test
public void testToString() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
//System.out.println("String: '" + buffer + "'");
Assert.assertEquals(true, buffer.toString().equals("HELLO WORLD"));
}
@Test
public void toHexString() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
//System.out.println("Hex String: '" + buffer.toHexString() + "'");
Assert.assertEquals(true, buffer.toHexString().equals("48454c4c4f20574f524c44".toUpperCase()));
Assert.assertEquals(true, buffer.toHexString(2, 2).equals("4c4c".toUpperCase()));
}
@Test
public void copyWithOffsetLengthCapacity() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
// copy only a small portion - WORLD
ByteBuffer copyBuffer = buffer.copy(6, 5, 5);
Assert.assertArrayEquals(TEST_WORLD, copyBuffer.toArray());
// make sure the new copyBuffer really works now
copyBuffer.delete(4);
byte b = copyBuffer.remove();
Assert.assertEquals((byte)'D', b);
copyBuffer.add(TEST_WORLD);
Assert.assertArrayEquals(TEST_WORLD, copyBuffer.toArray());
// let's make a small copy -- should be quick
ByteBuffer copyBuffer2 = copyBuffer.copy(0, 1, 1);
Assert.assertArrayEquals(TEST_W, copyBuffer2.toArray());
// a copy of zero bytes should be allowed...
ByteBuffer copyBuffer3 = copyBuffer2.copy(0, 0, 0);
Assert.assertArrayEquals(new byte[0], copyBuffer3.toArray());
}
@Test
public void copyWithOffsetLengthCapacityInvalidOffset() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
ByteBuffer copyBuffer = buffer.copy(11, 0, 1);
Assert.assertEquals(0, copyBuffer.size());
}
@Test(expected=IllegalArgumentException.class)
public void copyWithOffsetLengthCapacityInvalidLength() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
ByteBuffer copyBuffer = buffer.copy(10, 2, 2);
}
@Test(expected=IllegalArgumentException.class)
public void copyWithOffsetLengthCapacityInvalidCapacity() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
ByteBuffer copyBuffer = buffer.copy(10, 1, 0);
}
/**
@Test
public void split() throws BufferException {
ByteBuffer buffer = new ByteBuffer(TEST_BYTES1);
// no delimiter found
ByteBuffer[] buffers = buffer.split(this.TEST_C);
Assert.assertEquals(buffer, buffers[0]);
// break up on space
buffers = buffer.split(this.TEST_SPACE);
Assert.assertEquals(2, buffers.length);
Assert.assertArrayEquals(this.TEST_HELLO, buffers[0].toArray());
Assert.assertArrayEquals(this.TEST_WORLD, buffers[1].toArray());
// break up on L
buffers = buffer.split(this.TEST_L);
Assert.assertEquals(4, buffers.length);
Assert.assertArrayEquals(new byte[0], buffers[1].toArray());
Assert.assertArrayEquals(this.TEST_D, buffers[3].toArray());
// this example caused some null tokens, instead of an empty array
ByteBuffer buffer2 = new ByteBuffer("11,\"AE\",,\"7D\",,\"EA\",");
int pos = buffer2.indexOf(COMMA, 15);
Assert.assertEquals(19, pos);
buffers = buffer2.split(COMMA);
Assert.assertEquals(7, buffers.length);
for (int i = 0; i < buffers.length; i++) {
if (buffers[i] == null) {
Assert.fail("buffers[" + i + "] was null, this should never happen, should be empty array");
}
}
}
@Test
public void splitZeroDataInBuffer() throws BufferException {
ByteBuffer buffer = new ByteBuffer();
ByteBuffer[] buffers = buffer.split(TEST_C);
Assert.assertEquals(0, buffers[0].size());
Assert.assertEquals(buffer, buffers[0]);
}
@Test(expected=IllegalArgumentException.class)
public void splitWithBadDelimiter() throws BufferException {
ByteBuffer buffer = new ByteBuffer();
ByteBuffer[] buffers = buffer.split(new byte[0]);
}
*/
}