2020-08-28 14:02:51 +02:00
|
|
|
/*
|
|
|
|
* Copyright 2020 The Netty Project
|
|
|
|
*
|
|
|
|
* The Netty Project licenses this file to you 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.
|
|
|
|
*/
|
2020-07-24 19:38:48 +02:00
|
|
|
package io.netty.buffer.b2;
|
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
import org.junit.After;
|
2020-08-17 16:09:38 +02:00
|
|
|
import org.junit.AssumptionViolatedException;
|
2020-08-28 12:17:41 +02:00
|
|
|
import org.junit.Before;
|
2020-07-24 19:38:48 +02:00
|
|
|
import org.junit.Test;
|
|
|
|
|
|
|
|
import java.util.concurrent.ArrayBlockingQueue;
|
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
|
import java.util.concurrent.Executors;
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
import java.util.concurrent.SynchronousQueue;
|
|
|
|
|
|
|
|
import static org.hamcrest.Matchers.*;
|
|
|
|
import static org.junit.Assert.*;
|
|
|
|
|
2020-07-29 10:30:03 +02:00
|
|
|
public abstract class BBufTest {
|
2020-07-24 19:38:48 +02:00
|
|
|
protected abstract Allocator createAllocator();
|
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
private Allocator allocator;
|
|
|
|
private Buf buf;
|
|
|
|
|
|
|
|
@Before
|
|
|
|
public void setUp() {
|
|
|
|
allocator = createAllocator();
|
|
|
|
buf = allocator.allocate(8);
|
|
|
|
}
|
|
|
|
|
|
|
|
@After
|
|
|
|
public void tearDown() {
|
|
|
|
buf.close();
|
|
|
|
allocator.close();
|
|
|
|
}
|
|
|
|
|
2020-07-24 19:38:48 +02:00
|
|
|
@Test
|
|
|
|
public void allocateAndAccessingBuffer() {
|
2020-08-28 12:17:41 +02:00
|
|
|
buf.writeByte((byte) 1);
|
|
|
|
buf.writeByte((byte) 2);
|
|
|
|
try (Buf inner = buf.acquire()) {
|
|
|
|
inner.writeByte((byte) 3);
|
|
|
|
inner.writeByte((byte) 4);
|
|
|
|
inner.writeByte((byte) 5);
|
|
|
|
inner.writeByte((byte) 6);
|
|
|
|
inner.writeByte((byte) 7);
|
|
|
|
inner.writeByte((byte) 8);
|
|
|
|
try {
|
|
|
|
inner.writeByte((byte) 9);
|
|
|
|
fail("Expected to be out of bounds.");
|
|
|
|
} catch (RuntimeException re) {
|
|
|
|
assertThat(re.getMessage(), containsString("bound"));
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
|
|
|
try {
|
2020-08-28 12:17:41 +02:00
|
|
|
buf.writeByte((byte) 9);
|
2020-07-24 19:38:48 +02:00
|
|
|
fail("Expected to be out of bounds.");
|
|
|
|
} catch (RuntimeException re) {
|
|
|
|
assertThat(re.getMessage(), containsString("bound"));
|
|
|
|
}
|
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
assertEquals((byte) 1, buf.readByte());
|
|
|
|
assertEquals((byte) 2, buf.readByte());
|
|
|
|
assertEquals((byte) 3, buf.readByte());
|
|
|
|
assertEquals((byte) 4, buf.readByte());
|
|
|
|
assertEquals((byte) 5, buf.readByte());
|
|
|
|
assertEquals((byte) 6, buf.readByte());
|
|
|
|
assertEquals((byte) 7, buf.readByte());
|
|
|
|
assertEquals((byte) 8, buf.readByte());
|
|
|
|
try {
|
|
|
|
assertEquals((byte) 9, buf.readByte());
|
|
|
|
fail("Expected to be out of bounds.");
|
|
|
|
} catch (RuntimeException re) {
|
|
|
|
assertThat(re.getMessage(), containsString("bound"));
|
|
|
|
}
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
assertArrayEquals(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, buf.copy());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void acquireOnClosedBufferMustThrow() {
|
|
|
|
var buf = allocator.allocate(8);
|
|
|
|
buf.close();
|
|
|
|
try {
|
|
|
|
buf.acquire();
|
|
|
|
fail("Expected acquire on closed buffer to throw.");
|
|
|
|
} catch (IllegalStateException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void allocateAndSendToThread() throws Exception {
|
2020-08-28 12:17:41 +02:00
|
|
|
ArrayBlockingQueue<Send<Buf>> queue = new ArrayBlockingQueue<>(10);
|
|
|
|
ExecutorService executor = Executors.newSingleThreadExecutor();
|
|
|
|
Future<Byte> future = executor.submit(() -> {
|
|
|
|
try (Buf byteBuf = queue.take().receive()) {
|
|
|
|
return byteBuf.readByte();
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
});
|
|
|
|
executor.shutdown();
|
2020-07-24 19:38:48 +02:00
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
try (Buf buf = allocator.allocate(8)) {
|
|
|
|
buf.writeByte((byte) 42);
|
|
|
|
assertTrue(queue.offer(buf.send()));
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
|
|
|
|
assertEquals((byte) 42, future.get().byteValue());
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void allocateAndSendToThreadViaSyncQueue() throws Exception {
|
2020-08-28 12:17:41 +02:00
|
|
|
SynchronousQueue<Send<Buf>> queue = new SynchronousQueue<>();
|
|
|
|
ExecutorService executor = Executors.newSingleThreadExecutor();
|
|
|
|
Future<Byte> future = executor.submit(() -> {
|
|
|
|
try (Buf byteBuf = queue.take().receive()) {
|
|
|
|
return byteBuf.readByte();
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
});
|
|
|
|
executor.shutdown();
|
2020-07-24 19:38:48 +02:00
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
try (Buf buf = allocator.allocate(8)) {
|
|
|
|
assertSame(buf, buf.writeByte((byte) 42));
|
|
|
|
queue.put(buf.send());
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
|
|
|
|
assertEquals((byte) 42, future.get().byteValue());
|
2020-07-24 19:38:48 +02:00
|
|
|
}
|
2020-08-17 16:09:38 +02:00
|
|
|
|
|
|
|
@Test
|
|
|
|
public void mustThrowWhenAllocatingZeroSizedBuffer() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
|
|
|
allocator.allocate(0);
|
|
|
|
fail("Expected to throw an IllegalArgumentException.");
|
|
|
|
} catch (IllegalArgumentException ignore) {
|
2020-08-17 16:09:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void mustThrowWhenAllocatingNegativeSizedBuffer() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
|
|
|
allocator.allocate(-1);
|
|
|
|
fail("Expected to throw an IllegalArgumentException.");
|
|
|
|
} catch (IllegalArgumentException ignore) {
|
2020-08-17 16:09:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void mustThrowWhenAllocatingOverSizedBuffer() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
|
|
|
allocator.allocate(Integer.MAX_VALUE);
|
|
|
|
fail("Expected to throw an IllegalArgumentException.");
|
|
|
|
} catch (IllegalArgumentException ignore) {
|
2020-08-17 16:09:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void mustAllowAllocatingMaxArraySizedBuffer() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
|
|
|
allocator.allocate(Integer.MAX_VALUE - 8).close();
|
|
|
|
} catch (OutOfMemoryError oome) {
|
|
|
|
// Mark test as ignored if this happens.
|
|
|
|
throw new AssumptionViolatedException("JVM does not have enough memory for this test.", oome);
|
2020-08-17 16:09:38 +02:00
|
|
|
}
|
|
|
|
}
|
2020-08-24 16:03:02 +02:00
|
|
|
|
|
|
|
@Test
|
|
|
|
public void setReaderIndexMustThrowOnNegativeIndex() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
|
|
|
buf.readerIndex(-1);
|
|
|
|
fail("Expected an exception to be thrown.");
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
// Good.
|
2020-08-24 16:03:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void setReaderIndexMustThrowOnOversizedIndex() {
|
2020-08-28 12:17:41 +02:00
|
|
|
try {
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
buf.readerIndex(1);
|
|
|
|
fail("Expected an exception to be thrown.");
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writeLong(0);
|
|
|
|
try {
|
|
|
|
buf.readerIndex(9);
|
2020-08-28 12:17:41 +02:00
|
|
|
fail("Expected an exception to be thrown.");
|
|
|
|
} catch (IndexOutOfBoundsException e) {
|
|
|
|
// Good.
|
2020-08-24 16:03:02 +02:00
|
|
|
}
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
|
|
|
|
buf.readerIndex(8);
|
|
|
|
try {
|
|
|
|
buf.readByte();
|
|
|
|
fail("Expected and exception to be thrown.");
|
|
|
|
} catch (Exception ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
2020-08-24 16:03:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void setReaderIndexMustNotThrowWithinBounds() {
|
2020-08-28 12:17:41 +02:00
|
|
|
assertSame(buf, buf.readerIndex(0));
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
buf.writeLong(0);
|
2020-08-28 12:17:41 +02:00
|
|
|
assertSame(buf, buf.readerIndex(7));
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
assertSame(buf, buf.readerIndex(8));
|
2020-08-28 12:17:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void capacityMustBeAllocatedSize() {
|
|
|
|
assertEquals(8, buf.capacity());
|
|
|
|
try (Buf b = allocator.allocate(13)) {
|
|
|
|
assertEquals(13, b.capacity());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
@Test
|
|
|
|
public void fill() {
|
|
|
|
try (Buf buf = allocator.allocate(16)) {
|
|
|
|
assertSame(buf, buf.fill((byte) 0xA5));
|
|
|
|
buf.writerIndex(16);
|
|
|
|
assertEquals(0xA5A5A5A5_A5A5A5A5L, buf.readLong());
|
|
|
|
assertEquals(0xA5A5A5A5_A5A5A5A5L, buf.readLong());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
@Test
|
|
|
|
public void readerWriterIndexUpdates() {
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
try (Buf buf = allocator.allocate(22)) {
|
2020-08-28 12:17:41 +02:00
|
|
|
assertEquals(0, buf.writerIndex());
|
|
|
|
assertSame(buf, buf.writerIndex(1));
|
|
|
|
assertEquals(1, buf.writerIndex());
|
|
|
|
assertSame(buf, buf.writeByte((byte) 7));
|
|
|
|
assertEquals(2, buf.writerIndex());
|
|
|
|
assertSame(buf, buf.writeShort((short) 3003));
|
|
|
|
assertEquals(4, buf.writerIndex());
|
|
|
|
assertSame(buf, buf.writeInt(0x5A55_BA55));
|
|
|
|
assertEquals(8, buf.writerIndex());
|
|
|
|
assertSame(buf, buf.writeLong(0x123456789ABCDEF0L));
|
|
|
|
assertEquals(16, buf.writerIndex());
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
assertEquals(6, buf.writableBytes());
|
2020-08-28 12:17:41 +02:00
|
|
|
assertEquals(16, buf.readableBytes());
|
|
|
|
|
|
|
|
assertEquals(0, buf.readerIndex());
|
|
|
|
assertSame(buf, buf.readerIndex(1));
|
|
|
|
assertEquals(1, buf.readerIndex());
|
|
|
|
assertEquals((byte) 7, buf.readByte());
|
|
|
|
assertEquals(2, buf.readerIndex());
|
|
|
|
assertEquals((short) 3003, buf.readShort());
|
|
|
|
assertEquals(4, buf.readerIndex());
|
|
|
|
assertEquals(0x5A55_BA55, buf.readInt());
|
|
|
|
assertEquals(8, buf.readerIndex());
|
|
|
|
assertEquals(0x123456789ABCDEF0L, buf.readLong());
|
|
|
|
assertEquals(16, buf.readerIndex());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
public void readAndWriteBoundsChecksWithIndexUpdates() {
|
|
|
|
try (Buf buf = allocator.allocate(8)) {
|
|
|
|
buf.writeLong(0);
|
|
|
|
|
|
|
|
buf.readLong(); // Fine.
|
|
|
|
buf.readerIndex(1);
|
|
|
|
try {
|
|
|
|
buf.readLong();
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
|
|
|
|
buf.readerIndex(4);
|
|
|
|
buf.readInt(); // Fine.
|
|
|
|
buf.readerIndex(5);
|
|
|
|
|
|
|
|
try {
|
|
|
|
buf.readInt();
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
2020-08-28 12:17:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
// ### CODEGEN START primitive accessors tests
|
|
|
|
|
2020-08-28 12:17:41 +02:00
|
|
|
@Test
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
public void relativeReadOfByteMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readByte());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfByteMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
assertEquals(0x10, buf.readByte());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfByteMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readByte();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfByteMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readByte(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfByteMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
assertEquals(value, buf.readByte(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfByteMustReadWithBigEndianByteOrder() {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x10, buf.readByte(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfByteMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
try {
|
|
|
|
buf.readByte(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfByteMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readByte(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedByteMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedByte());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedByteMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
assertEquals(0x10, buf.readUnsignedByte());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedByteMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(7, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedByte();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedByteMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedByte(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedByteMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
assertEquals(value, buf.readUnsignedByte(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedByteMustReadWithBigEndianByteOrder() {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x10, buf.readUnsignedByte(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedByteMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedByte(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedByteMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedByte(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfByteMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(8);
|
|
|
|
try {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfByteMustHaveBigEndianByteOrder() {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfByteMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfByteMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(8, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfByteMustHaveBigEndianByteOrder() {
|
|
|
|
byte value = 0x01;
|
|
|
|
buf.writeByte(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedByteMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(8);
|
|
|
|
try {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedByteMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedByteMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedByteMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(8, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedByteMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x01;
|
|
|
|
buf.writeUnsignedByte(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readChar());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readChar());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readChar();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readChar(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
assertEquals(value, buf.readChar(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharMustReadWithBigEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readChar(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
try {
|
|
|
|
buf.readChar(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readChar(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readCharLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readCharLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfCharLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readCharLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readCharLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
assertEquals(value, buf.readCharLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readCharLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
try {
|
|
|
|
buf.readCharLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfCharLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readCharLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfCharMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfCharMustHaveBigEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
2020-08-24 16:03:02 +02:00
|
|
|
}
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
2020-08-24 16:03:02 +02:00
|
|
|
}
|
2020-07-24 19:38:48 +02:00
|
|
|
|
Generate complete and tested Buf API
Motivation:
The Buf API is wide, taking into account signedness, endian-ness, and so on, for all primitive
types.
Modification:
A code generator has been added which add API, implementation, and tests, to the Buf, BBuf,
and BBufTest files respectively.
Result:
We have a complete and fully tested accessor API in the Buf interface, which is still somewhat
easy to bulk-modify using the code generator.
2020-09-10 18:05:36 +02:00
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharMustHaveBigEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeChar(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfCharLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfCharLEMustHaveLittleEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfCharLEMustHaveLittleEndianByteOrder() {
|
|
|
|
char value = 0x0102;
|
|
|
|
buf.writeCharLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readShort());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readShort());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readShort();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readShort(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
assertEquals(value, buf.readShort(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortMustReadWithBigEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readShort(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
try {
|
|
|
|
buf.readShort(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readShort(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readShortLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readShortLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfShortLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readShortLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readShortLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
assertEquals(value, buf.readShortLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readShortLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
try {
|
|
|
|
buf.readShortLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfShortLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readShortLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedShort());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readUnsignedShort());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShort();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShort(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
assertEquals(value, buf.readUnsignedShort(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortMustReadWithBigEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readUnsignedShort(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShort(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShort(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedShortLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
assertEquals(0x1002, buf.readUnsignedShortLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedShortLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
assertEquals(6, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShortLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(1, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShortLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
assertEquals(value, buf.readUnsignedShortLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
buf.writeByte(1, (byte) 0x10);
|
|
|
|
assertEquals(0x1002, buf.readUnsignedShortLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShortLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedShortLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedShortLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfShortMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfShortMustHaveBigEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortMustHaveBigEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShort(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfShortLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfShortLEMustHaveLittleEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfShortLEMustHaveLittleEndianByteOrder() {
|
|
|
|
short value = 0x0102;
|
|
|
|
buf.writeShortLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedShortMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedShortMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShort(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedShortLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(7);
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedShortLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(7, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedShortLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x0102;
|
|
|
|
buf.writeUnsignedShortLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readMedium());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(0x100203, buf.readMedium());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readMedium();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readMedium(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
assertEquals(value, buf.readMedium(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumMustReadWithBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x100203, buf.readMedium(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
try {
|
|
|
|
buf.readMedium(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readMedium(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readMediumLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
buf.writeByte(2, (byte) 0x10);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(0x100203, buf.readMediumLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfMediumLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readMediumLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readMediumLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
assertEquals(value, buf.readMediumLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
buf.writeByte(2, (byte) 0x10);
|
|
|
|
assertEquals(0x100203, buf.readMediumLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
try {
|
|
|
|
buf.readMediumLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfMediumLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readMediumLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedMedium());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(0x100203, buf.readUnsignedMedium());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMedium();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMedium(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
assertEquals(value, buf.readUnsignedMedium(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumMustReadWithBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x100203, buf.readUnsignedMedium(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMedium(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMedium(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedMediumLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
buf.writeByte(2, (byte) 0x10);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
assertEquals(0x100203, buf.readUnsignedMediumLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedMediumLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
assertEquals(5, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMediumLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(2, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMediumLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
assertEquals(value, buf.readUnsignedMediumLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
buf.writeByte(2, (byte) 0x10);
|
|
|
|
assertEquals(0x100203, buf.readUnsignedMediumLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMediumLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedMediumLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedMediumLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfMediumMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(6);
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfMediumMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(6, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMedium(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfMediumLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(6);
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfMediumLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(6, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfMediumLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeMediumLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedMediumMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(6);
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedMediumMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(6, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMedium(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedMediumLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(6);
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedMediumLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(6, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedMediumLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x010203;
|
|
|
|
buf.writeUnsignedMediumLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readInt());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(0x10020304, buf.readInt());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readInt();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readInt(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
assertEquals(value, buf.readInt(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntMustReadWithBigEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x10020304, buf.readInt(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
try {
|
|
|
|
buf.readInt(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readInt(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readIntLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(0x10020304, buf.readIntLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfIntLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readIntLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readIntLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
assertEquals(value, buf.readIntLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(0x10020304, buf.readIntLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
try {
|
|
|
|
buf.readIntLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfIntLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readIntLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedInt());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(0x10020304, buf.readUnsignedInt());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedInt();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedInt(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
assertEquals(value, buf.readUnsignedInt(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntMustReadWithBigEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x10020304, buf.readUnsignedInt(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedInt(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedInt(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readUnsignedIntLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(0x10020304, buf.readUnsignedIntLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfUnsignedIntLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readUnsignedIntLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedIntLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
assertEquals(value, buf.readUnsignedIntLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(0x10020304, buf.readUnsignedIntLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
try {
|
|
|
|
buf.readUnsignedIntLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfUnsignedIntLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readUnsignedIntLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfIntMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfIntMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntMustHaveBigEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeInt(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfIntLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfIntLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfIntLEMustHaveLittleEndianByteOrder() {
|
|
|
|
int value = 0x01020304;
|
|
|
|
buf.writeIntLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedIntMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedIntMustHaveBigEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntMustHaveBigEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedInt(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedIntLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfUnsignedIntLEMustHaveLittleEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfUnsignedIntLEMustHaveLittleEndianByteOrder() {
|
|
|
|
long value = 0x01020304;
|
|
|
|
buf.writeUnsignedIntLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readFloat());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(Float.intBitsToFloat(0x10020304), buf.readFloat());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readFloat();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readFloat(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
assertEquals(value, buf.readFloat(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatMustReadWithBigEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(Float.intBitsToFloat(0x10020304), buf.readFloat(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
try {
|
|
|
|
buf.readFloat(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readFloat(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readFloatLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(4, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
assertEquals(Float.intBitsToFloat(0x10020304), buf.readFloatLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfFloatLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
assertEquals(4, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readFloatLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(3, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readFloatLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
assertEquals(value, buf.readFloatLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
buf.writeByte(3, (byte) 0x10);
|
|
|
|
assertEquals(Float.intBitsToFloat(0x10020304), buf.readFloatLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
try {
|
|
|
|
buf.readFloatLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfFloatLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readFloatLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfFloatMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfFloatMustHaveBigEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatMustHaveBigEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloat(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfFloatLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(5);
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfFloatLEMustHaveLittleEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(5, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfFloatLEMustHaveLittleEndianByteOrder() {
|
|
|
|
float value = Float.intBitsToFloat(0x01020304);
|
|
|
|
buf.writeFloatLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
assertEquals((byte) 0x00, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readLong());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(0x1002030405060708L, buf.readLong());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readLong();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readLong(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
assertEquals(value, buf.readLong(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongMustReadWithBigEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(0x1002030405060708L, buf.readLong(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
try {
|
|
|
|
buf.readLong(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readLong(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readLongLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
buf.writeByte(7, (byte) 0x10);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(0x1002030405060708L, buf.readLongLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfLongLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readLongLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readLongLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
assertEquals(value, buf.readLongLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
buf.writeByte(7, (byte) 0x10);
|
|
|
|
assertEquals(0x1002030405060708L, buf.readLongLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
try {
|
|
|
|
buf.readLongLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfLongLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readLongLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfLongMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(1);
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfLongMustHaveBigEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongMustHaveBigEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLong(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfLongLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(1);
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfLongLEMustHaveLittleEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfLongLEMustHaveLittleEndianByteOrder() {
|
|
|
|
long value = 0x0102030405060708L;
|
|
|
|
buf.writeLongLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readDouble());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleMustReadWithBigEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(Double.longBitsToDouble(0x1002030405060708L), buf.readDouble());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readDouble();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readDouble(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
assertEquals(value, buf.readDouble(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleMustReadWithBigEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
buf.writeByte(0, (byte) 0x10);
|
|
|
|
assertEquals(Double.longBitsToDouble(0x1002030405060708L), buf.readDouble(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
try {
|
|
|
|
buf.readDouble(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readDouble(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(value, buf.readDoubleLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
buf.writeByte(7, (byte) 0x10);
|
|
|
|
assertEquals(8, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
assertEquals(Double.longBitsToDouble(0x1002030405060708L), buf.readDoubleLE());
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeReadOfDoubleLEMustBoundsCheckWhenReadOffsetAndSizeIsBeyondWriteOffset() {
|
|
|
|
assertEquals(0, buf.readableBytes());
|
|
|
|
assertEquals(Long.BYTES, buf.writableBytes());
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
buf.readerIndex(1);
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
assertEquals(0, buf.writableBytes());
|
|
|
|
try {
|
|
|
|
buf.readDoubleLE();
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
assertEquals(7, buf.readableBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleLEMustBoundsCheckOnNegativeOffset() {
|
|
|
|
try {
|
|
|
|
buf.readDoubleLE(-1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleLEMustNotBoundsCheckWhenReadOffsetAndSizeIsEqualToWriteOffset() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
assertEquals(value, buf.readDoubleLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleLEMustReadWithLittleEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
buf.writeByte(7, (byte) 0x10);
|
|
|
|
assertEquals(Double.longBitsToDouble(0x1002030405060708L), buf.readDoubleLE(0));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleLEMustBoundsCheckWhenReadOffsetAndSizeIsGreaterThanWriteOffset() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
try {
|
|
|
|
buf.readDoubleLE(1);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedReadOfDoubleLEMustBoundsCheckWhenReadOffsetIsGreaterThanWriteOffset() {
|
|
|
|
try {
|
|
|
|
buf.readDoubleLE(0);
|
|
|
|
fail("Expected a bounds check.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfDoubleMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(1);
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfDoubleMustHaveBigEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleMustHaveBigEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDouble(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfDoubleLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
buf.writerIndex(1);
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void relativeWriteOfDoubleLEMustHaveLittleEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleLEMustBoundsCheckWhenWriteOffsetIsNegative() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(-1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleLEMustBoundsCheckWhenWriteOffsetAndSizeIsBeyondCapacity() {
|
|
|
|
assertEquals(Long.BYTES, buf.capacity());
|
|
|
|
try {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(1, value);
|
|
|
|
fail("Should have bounds checked.");
|
|
|
|
} catch (IndexOutOfBoundsException ignore) {
|
|
|
|
// Good.
|
|
|
|
}
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
// Verify contents are unchanged.
|
|
|
|
assertEquals(0, buf.readLong());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void offsettedWriteOfDoubleLEMustHaveLittleEndianByteOrder() {
|
|
|
|
double value = Double.longBitsToDouble(0x0102030405060708L);
|
|
|
|
buf.writeDoubleLE(0, value);
|
|
|
|
buf.writerIndex(Long.BYTES);
|
|
|
|
assertEquals((byte) 0x08, buf.readByte());
|
|
|
|
assertEquals((byte) 0x07, buf.readByte());
|
|
|
|
assertEquals((byte) 0x06, buf.readByte());
|
|
|
|
assertEquals((byte) 0x05, buf.readByte());
|
|
|
|
assertEquals((byte) 0x04, buf.readByte());
|
|
|
|
assertEquals((byte) 0x03, buf.readByte());
|
|
|
|
assertEquals((byte) 0x02, buf.readByte());
|
|
|
|
assertEquals((byte) 0x01, buf.readByte());
|
|
|
|
}
|
|
|
|
// ### CODEGEN END primitive accessors tests
|
|
|
|
|
|
|
|
private static void assertEquals(byte expected, byte actual) {
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %1$s (0x%1$X) but was: %2$s (0x%2$X)", expected, actual));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(char expected, char actual) {
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %s (0x%X) but was: %s (0x%X)",
|
|
|
|
expected, (int) expected, actual, (int) actual));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(short expected, short actual) {
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %1$s (0x%1$X) but was: %2$s (0x%2$X)", expected, actual));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(int expected, int actual) {
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %1$s (0x%1$X) but was: %2$s (0x%2$X)", expected, actual));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(long expected, long actual) {
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %1$s (0x%1$X) but was: %2$s (0x%2$X)", expected, actual));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(float expected, float actual) {
|
|
|
|
//noinspection FloatingPointEquality
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %s (0x%X) but was: %s (0x%X)",
|
|
|
|
expected, Float.floatToRawIntBits(expected),
|
|
|
|
actual, Float.floatToRawIntBits(actual)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void assertEquals(double expected, double actual) {
|
|
|
|
//noinspection FloatingPointEquality
|
|
|
|
if (expected != actual) {
|
|
|
|
fail(String.format("expected: %s (0x%X) but was: %s (0x%X)",
|
|
|
|
expected, Double.doubleToRawLongBits(expected),
|
|
|
|
actual, Double.doubleToRawLongBits(actual)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|