2 * Copyright 2015-present Open Networking Foundation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package io.atomix.storage.buffer;
18 import org.junit.Test;
20 import java.nio.BufferOverflowException;
21 import java.nio.BufferUnderflowException;
22 import java.nio.ByteOrder;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertTrue;
31 * @author <a href="http://github.com/kuujo">Jordan Halterman</a>
33 public abstract class BufferTest {
36 * Creates a new test buffer.
38 protected abstract Buffer createBuffer(int capacity);
41 * Creates a new test buffer.
43 protected abstract Buffer createBuffer(int capacity, int maxCapacity);
46 public void testPosition() {
47 Buffer buffer = createBuffer(8);
48 assertEquals(0, buffer.position());
50 assertEquals(4, buffer.position());
52 assertEquals(0, buffer.position());
53 assertEquals(10, buffer.readInt());
57 public void testFlip() {
58 Buffer buffer = createBuffer(8);
60 assertEquals(4, buffer.position());
61 assertEquals(8, buffer.capacity());
62 assertEquals(-1, buffer.limit());
63 assertEquals(8, buffer.capacity());
65 assertEquals(4, buffer.limit());
66 assertEquals(0, buffer.position());
70 public void testLimit() {
71 Buffer buffer = createBuffer(8);
72 assertEquals(0, buffer.position());
73 assertEquals(-1, buffer.limit());
74 assertEquals(8, buffer.capacity());
76 assertEquals(4, buffer.limit());
77 assertTrue(buffer.hasRemaining());
79 assertEquals(0, buffer.remaining());
80 assertFalse(buffer.hasRemaining());
84 public void testClear() {
85 Buffer buffer = createBuffer(8);
87 assertEquals(6, buffer.limit());
89 assertEquals(4, buffer.position());
91 assertEquals(-1, buffer.limit());
92 assertEquals(8, buffer.capacity());
93 assertEquals(0, buffer.position());
97 public void testMarkReset() {
98 assertTrue(createBuffer(12).writeInt(10).mark().writeBoolean(true).reset().readBoolean());
101 @Test(expected = BufferUnderflowException.class)
102 public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() {
108 @Test(expected = BufferUnderflowException.class)
109 public void testReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() {
110 createBuffer(4, 4).readInt(2);
113 @Test(expected = BufferOverflowException.class)
114 public void testWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() {
115 createBuffer(4, 4).writeInt(10).writeInt(20);
118 @Test(expected = BufferOverflowException.class)
119 public void testReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() {
120 createBuffer(4, 4).writeInt(4, 10);
123 @Test(expected = IndexOutOfBoundsException.class)
124 public void testReadIntThrowsIndexOutOfBounds() {
125 createBuffer(4, 4).readInt(10);
128 @Test(expected = IndexOutOfBoundsException.class)
129 public void testWriteIntThrowsIndexOutOfBounds() {
130 createBuffer(4, 4).writeInt(10, 10);
134 public void testWriteReadByteRelative() {
135 assertEquals(10, createBuffer(16).writeByte(10).flip().readByte());
139 public void testWriteReadByteAbsolute() {
140 assertEquals(10, createBuffer(16).writeByte(4, 10).readByte(4));
144 public void testWriteReadUnsignedByteRelative() {
145 assertEquals(10, createBuffer(16).writeUnsignedByte(10).flip().readUnsignedByte());
149 public void testWriteReadUnsignedByteAbsolute() {
150 assertEquals(10, createBuffer(16).writeUnsignedByte(4, 10).readUnsignedByte(4));
154 public void testWriteReadShortRelative() {
155 assertEquals(10, createBuffer(16).writeShort((short) 10).flip().readShort());
159 public void testWriteReadShortAbsolute() {
160 assertEquals(10, createBuffer(16).writeShort(4, (short) 10).readShort(4));
164 public void testWriteReadUnsignedShortRelative() {
165 assertEquals(10, createBuffer(16).writeUnsignedShort((short) 10).flip().readUnsignedShort());
169 public void testWriteReadUnsignedShortAbsolute() {
170 assertEquals(10, createBuffer(16).writeUnsignedShort(4, (short) 10).readUnsignedShort(4));
174 public void testWriteReadIntRelative() {
175 assertEquals(10, createBuffer(16).writeInt(10).flip().readInt());
179 public void testWriteReadUnsignedIntAbsolute() {
180 assertEquals(10, createBuffer(16).writeUnsignedInt(4, 10).readUnsignedInt(4));
184 public void testWriteReadUnsignedIntRelative() {
185 assertEquals(10, createBuffer(16).writeUnsignedInt(10).flip().readUnsignedInt());
189 public void testWriteReadIntAbsolute() {
190 assertEquals(10, createBuffer(16).writeInt(4, 10).readInt(4));
194 public void testWriteReadLongRelative() {
195 assertEquals(12345, createBuffer(16).writeLong(12345).flip().readLong());
199 public void testWriteReadLongAbsolute() {
200 assertEquals(12345, createBuffer(16).writeLong(4, 12345).readLong(4));
204 public void testWriteReadFloatRelative() {
205 assertEquals(10.6f, createBuffer(16).writeFloat(10.6f).flip().readFloat(), .001);
209 public void testWriteReadFloatAbsolute() {
210 assertEquals(10.6f, createBuffer(16).writeFloat(4, 10.6f).readFloat(4), .001);
214 public void testWriteReadDoubleRelative() {
215 assertEquals(10.6, createBuffer(16).writeDouble(10.6).flip().readDouble(), .001);
219 public void testWriteReadDoubleAbsolute() {
220 assertEquals(10.6, createBuffer(16).writeDouble(4, 10.6).readDouble(4), .001);
224 public void testWriteReadBooleanRelative() {
225 assertTrue(createBuffer(16).writeBoolean(true).flip().readBoolean());
229 public void testWriteReadBooleanAbsolute() {
230 assertTrue(createBuffer(16).writeBoolean(4, true).readBoolean(4));
234 public void testWriteReadStringRelative() {
235 Buffer buffer = createBuffer(38)
236 .writeString("Hello world!")
237 .writeString("Hello world again!")
239 assertEquals("Hello world!", buffer.readString());
240 assertEquals("Hello world again!", buffer.readString());
244 public void testWriteReadStringAbsolute() {
245 Buffer buffer = createBuffer(46)
246 .writeString(4, "Hello world!")
247 .writeString(20, "Hello world again!");
248 assertEquals("Hello world!", buffer.readString(4));
249 assertEquals("Hello world again!", buffer.readString(20));
253 public void testWriteReadUTF8Relative() {
254 Buffer buffer = createBuffer(38)
255 .writeUTF8("Hello world!")
256 .writeUTF8("Hello world again!")
258 assertEquals("Hello world!", buffer.readUTF8());
259 assertEquals("Hello world again!", buffer.readUTF8());
263 public void testWriteReadUTF8Absolute() {
264 Buffer buffer = createBuffer(46)
265 .writeUTF8(4, "Hello world!")
266 .writeUTF8(20, "Hello world again!");
267 assertEquals("Hello world!", buffer.readUTF8(4));
268 assertEquals("Hello world again!", buffer.readUTF8(20));
272 public void testReadWriter() {
273 Buffer writeBuffer = createBuffer(8).writeLong(10).flip();
274 Buffer readBuffer = createBuffer(8);
275 writeBuffer.read(readBuffer);
276 assertEquals(10, readBuffer.flip().readLong());
280 public void testWriteReadSwappedIntRelative() {
281 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt());
285 public void testWriteReadSwappedIntAbsolute() {
286 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4));
290 public void testAbsoluteSlice() {
291 Buffer buffer = createBuffer(1024);
292 buffer.writeLong(10).writeLong(11).rewind();
293 Buffer slice = buffer.slice(8, 1016);
294 assertEquals(0, slice.position());
295 assertEquals(11, slice.readLong());
299 public void testRelativeSliceWithoutLength() {
300 Buffer buffer = createBuffer(1024, 1024);
301 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
302 assertEquals(10, buffer.readLong());
303 Buffer slice = buffer.slice();
304 assertEquals(0, slice.position());
305 assertEquals(-1, slice.limit());
306 assertEquals(1016, slice.capacity());
307 assertEquals(1016, slice.maxCapacity());
308 assertEquals(11, slice.readLong());
309 assertEquals(11, slice.readLong(0));
311 Buffer slice2 = buffer.skip(8).slice();
312 assertEquals(0, slice2.position());
313 assertEquals(-1, slice2.limit());
314 assertEquals(1008, slice2.capacity());
315 assertEquals(1008, slice2.maxCapacity());
316 assertEquals(12, slice2.readLong());
317 assertEquals(12, slice2.readLong(0));
321 public void testRelativeSliceWithLength() {
322 Buffer buffer = createBuffer(1024);
323 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
324 assertEquals(10, buffer.readLong());
325 Buffer slice = buffer.slice(8);
326 assertEquals(0, slice.position());
327 assertEquals(11, slice.readLong());
328 assertEquals(11, slice.readLong(0));
330 Buffer slice2 = buffer.skip(8).slice(8);
331 assertEquals(0, slice2.position());
332 assertEquals(12, slice2.readLong());
333 assertEquals(12, slice2.readLong(0));
338 public void testSliceOfSlice() {
339 Buffer buffer = createBuffer(1024);
340 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
341 assertEquals(10, buffer.readLong());
342 Buffer slice = buffer.slice();
343 assertEquals(11, slice.readLong());
344 Buffer sliceOfSlice = slice.slice();
345 assertEquals(12, sliceOfSlice.readLong());
346 assertEquals(8, sliceOfSlice.position());
350 public void testSliceWithLimit() {
351 Buffer buffer = createBuffer(1024).limit(16);
352 buffer.writeLong(10);
353 Buffer slice = buffer.slice();
354 assertEquals(0, slice.position());
355 assertEquals(8, slice.capacity());
356 assertEquals(8, slice.maxCapacity());
357 assertEquals(8, slice.remaining());
361 public void testSliceWithLittleRemaining() {
362 Buffer buffer = createBuffer(1024, 2048);
363 buffer.position(1020);
364 Buffer slice = buffer.slice(8);
365 assertEquals(0, slice.position());
366 assertEquals(-1, slice.limit());
370 public void testCompact() {
371 Buffer buffer = createBuffer(1024);
372 buffer.position(100).writeLong(1234).position(100).compact();
373 assertEquals(0, buffer.position());
374 assertEquals(1234, buffer.readLong());
378 public void testSwappedPosition() {
379 Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
380 assertEquals(0, buffer.position());
382 assertEquals(4, buffer.position());
384 assertEquals(0, buffer.position());
385 assertEquals(10, buffer.readInt());
389 public void testSwappedFlip() {
390 Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
392 assertEquals(4, buffer.position());
393 assertEquals(8, buffer.capacity());
394 assertEquals(-1, buffer.limit());
395 assertEquals(8, buffer.capacity());
397 assertEquals(4, buffer.limit());
398 assertEquals(0, buffer.position());
402 public void testSwappedLimit() {
403 Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
404 assertEquals(0, buffer.position());
405 assertEquals(-1, buffer.limit());
406 assertEquals(8, buffer.capacity());
408 assertEquals(4, buffer.limit());
409 assertTrue(buffer.hasRemaining());
411 assertEquals(0, buffer.remaining());
412 assertFalse(buffer.hasRemaining());
416 public void testSwappedClear() {
417 Buffer buffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
419 assertEquals(6, buffer.limit());
421 assertEquals(4, buffer.position());
423 assertEquals(-1, buffer.limit());
424 assertEquals(8, buffer.capacity());
425 assertEquals(0, buffer.position());
429 public void testSwappedMarkReset() {
430 assertTrue(createBuffer(12).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).mark().writeBoolean(true).reset().readBoolean());
433 @Test(expected = BufferUnderflowException.class)
434 public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesRelative() {
435 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN)
440 @Test(expected = BufferUnderflowException.class)
441 public void testSwappedReadIntThrowsBufferUnderflowWithNoRemainingBytesAbsolute() {
442 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(2);
445 @Test(expected = BufferOverflowException.class)
446 public void testSwappedWriteIntThrowsBufferOverflowWithNoRemainingBytesRelative() {
447 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).writeInt(20);
450 @Test(expected = BufferOverflowException.class)
451 public void testSwappedReadIntThrowsBufferOverflowWithNoRemainingBytesAbsolute() {
452 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10);
455 @Test(expected = IndexOutOfBoundsException.class)
456 public void testSwappedReadIntThrowsIndexOutOfBounds() {
457 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).readInt(10);
460 @Test(expected = IndexOutOfBoundsException.class)
461 public void testSwappedWriteIntThrowsIndexOutOfBounds() {
462 createBuffer(4, 4).order(ByteOrder.LITTLE_ENDIAN).writeInt(10, 10);
466 public void testSwappedWriteReadByteRelative() {
467 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(10).flip().readByte());
471 public void testSwappedWriteReadByteAbsolute() {
472 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeByte(4, 10).readByte(4));
476 public void testSwappedWriteReadUnsignedByteRelative() {
477 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(10).flip().readUnsignedByte());
481 public void testSwappedWriteReadUnsignedByteAbsolute() {
482 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedByte(4, 10).readUnsignedByte(4));
486 public void testSwappedWriteReadShortRelative() {
487 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort((short) 10).flip().readShort());
491 public void testSwappedWriteReadShortAbsolute() {
492 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeShort(4, (short) 10).readShort(4));
496 public void testSwappedWriteReadUnsignedShortRelative() {
497 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort((short) 10).flip().readUnsignedShort());
501 public void testSwappedWriteReadUnsignedShortAbsolute() {
502 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedShort(4, (short) 10).readUnsignedShort(4));
506 public void testSwappedWriteReadIntRelative() {
507 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(10).flip().readInt());
511 public void testSwappedWriteReadUnsignedIntAbsolute() {
512 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(4, 10).readUnsignedInt(4));
516 public void testSwappedWriteReadUnsignedIntRelative() {
517 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeUnsignedInt(10).flip().readUnsignedInt());
521 public void testSwappedWriteReadIntAbsolute() {
522 assertEquals(10, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeInt(4, 10).readInt(4));
526 public void testSwappedWriteReadLongRelative() {
527 assertEquals(12345, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(12345).flip().readLong());
531 public void testSwappedWriteReadLongAbsolute() {
532 assertEquals(12345, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeLong(4, 12345).readLong(4));
536 public void testSwappedWriteReadFloatRelative() {
537 assertEquals(10.6f, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(10.6f).flip().readFloat(), .001);
541 public void testSwappedWriteReadFloatAbsolute() {
542 assertEquals(10.6f, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeFloat(4, 10.6f).readFloat(4), .001);
546 public void testSwappedWriteReadDoubleRelative() {
547 assertEquals(10.6, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(10.6).flip().readDouble(), .001);
551 public void testSwappedWriteReadDoubleAbsolute() {
552 assertEquals(10.6, createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeDouble(4, 10.6).readDouble(4), .001);
556 public void testSwappedWriteReadBooleanRelative() {
557 assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(true).flip().readBoolean());
561 public void testSwappedWriteReadBooleanAbsolute() {
562 assertTrue(createBuffer(16).order(ByteOrder.LITTLE_ENDIAN).writeBoolean(4, true).readBoolean(4));
566 public void testSwappedReadWriter() {
567 Buffer writeBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN).writeLong(10).flip();
568 Buffer readBuffer = createBuffer(8).order(ByteOrder.LITTLE_ENDIAN);
569 writeBuffer.read(readBuffer);
570 assertEquals(10, readBuffer.flip().readLong());
574 public void testSwappedAbsoluteSlice() {
575 Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
576 buffer.writeLong(10).writeLong(11).rewind();
577 Buffer slice = buffer.slice(8, 1016);
578 assertEquals(0, slice.position());
579 assertEquals(11, slice.readLong());
583 public void testSwappedRelativeSliceWithoutLength() {
584 Buffer buffer = createBuffer(1024, 1024).order(ByteOrder.LITTLE_ENDIAN);
585 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
586 assertEquals(10, buffer.readLong());
587 Buffer slice = buffer.slice();
588 assertEquals(0, slice.position());
589 assertEquals(-1, slice.limit());
590 assertEquals(1016, slice.capacity());
591 assertEquals(1016, slice.maxCapacity());
592 assertEquals(11, slice.readLong());
593 assertEquals(11, slice.readLong(0));
595 Buffer slice2 = buffer.skip(8).slice();
596 assertEquals(0, slice2.position());
597 assertEquals(-1, slice2.limit());
598 assertEquals(1008, slice2.capacity());
599 assertEquals(1008, slice2.maxCapacity());
600 assertEquals(12, slice2.readLong());
601 assertEquals(12, slice2.readLong(0));
605 public void testSwappedRelativeSliceWithLength() {
606 Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
607 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
608 assertEquals(10, buffer.readLong());
609 Buffer slice = buffer.slice(8);
610 assertEquals(0, slice.position());
611 assertEquals(11, slice.readLong());
612 assertEquals(11, slice.readLong(0));
614 Buffer slice2 = buffer.skip(8).slice(8);
615 assertEquals(0, slice2.position());
616 assertEquals(12, slice2.readLong());
617 assertEquals(12, slice2.readLong(0));
622 public void testSwappedSliceOfSlice() {
623 Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
624 buffer.writeLong(10).writeLong(11).writeLong(12).rewind();
625 assertEquals(10, buffer.readLong());
626 Buffer slice = buffer.slice();
627 assertEquals(11, slice.readLong());
628 Buffer sliceOfSlice = slice.slice();
629 assertEquals(12, sliceOfSlice.readLong());
630 assertEquals(8, sliceOfSlice.position());
634 public void testSwappedSliceWithLimit() {
635 Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN).limit(16);
636 buffer.writeLong(10);
637 Buffer slice = buffer.slice();
638 assertEquals(0, slice.position());
639 assertEquals(8, slice.capacity());
640 assertEquals(8, slice.maxCapacity());
641 assertEquals(8, slice.remaining());
645 public void testSwappedSliceWithLittleRemaining() {
646 Buffer buffer = createBuffer(1024, 2048).order(ByteOrder.LITTLE_ENDIAN);
647 buffer.position(1020);
648 Buffer slice = buffer.slice(8);
649 assertEquals(0, slice.position());
650 assertEquals(-1, slice.limit());
654 public void testSwappedCompact() {
655 Buffer buffer = createBuffer(1024).order(ByteOrder.LITTLE_ENDIAN);
656 buffer.position(100).writeLong(1234).position(100).compact();
657 assertEquals(0, buffer.position());
658 assertEquals(1234, buffer.readLong());
662 public void testCapacity0Read() {
663 Buffer buffer = createBuffer(0, 1024);
664 assertEquals(0, buffer.readLong());
668 public void testCapacity0Write() {
669 Buffer buffer = createBuffer(0, 1024);
670 buffer.writeLong(10);
671 assertEquals(10, buffer.readLong(0));