@Test public void byteAt() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8("a"); buffer.writeUtf8(repeat('b', Segment.SIZE)); buffer.writeUtf8("c"); assertEquals('a', buffer.getByte(0)); assertEquals('a', buffer.getByte(0)); // getByte doesn't mutate! assertEquals('c', buffer.getByte(buffer.size - 1)); assertEquals('b', buffer.getByte(buffer.size - 2)); assertEquals('b', buffer.getByte(buffer.size - 3)); }
@Test public void moveFewerThanRequestedBytesWithRead() throws Exception { OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('a', 10)); OkBuffer source = new OkBuffer(); source.writeUtf8(repeat('b', 20)); assertEquals(20, source.read(sink, 25)); assertEquals(30, sink.size()); assertEquals(0, source.size()); assertEquals(repeat('a', 10) + repeat('b', 20), sink.readUtf8(30)); }
@Test public void skip() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8("a"); buffer.writeUtf8(repeat('b', Segment.SIZE)); buffer.writeUtf8("c"); buffer.skip(1); assertEquals('b', buffer.readByte() & 0xff); buffer.skip(Segment.SIZE - 2); assertEquals('b', buffer.readByte() & 0xff); buffer.skip(1); assertEquals(0, buffer.size()); }
@Test public void writePrefixDoesntSplit() throws Exception { OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('b', 10)); OkBuffer source = new OkBuffer(); source.writeUtf8(repeat('a', Segment.SIZE * 2)); sink.write(source, 20); assertEquals(asList(30), sink.segmentSizes()); assertEquals(asList(Segment.SIZE - 20, Segment.SIZE), source.segmentSizes()); assertEquals(30, sink.size()); assertEquals(Segment.SIZE * 2 - 20, source.size()); }
/** The big part of source's first segment is staying put. */ @Test public void writeSplitSourceBufferRight() throws Exception { int writeSize = Segment.SIZE / 2 - 1; OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('b', Segment.SIZE - 10)); OkBuffer source = new OkBuffer(); source.writeUtf8(repeat('a', Segment.SIZE * 2)); sink.write(source, writeSize); assertEquals(asList(Segment.SIZE - 10, writeSize), sink.segmentSizes()); assertEquals(asList(Segment.SIZE - writeSize, Segment.SIZE), source.segmentSizes()); }
@Test public void writePrefixDoesntSplitButRequiresCompact() throws Exception { OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('b', Segment.SIZE - 10)); // limit = size - 10 sink.readUtf8(Segment.SIZE - 20); // pos = size = 20 OkBuffer source = new OkBuffer(); source.writeUtf8(repeat('a', Segment.SIZE * 2)); sink.write(source, 20); assertEquals(asList(30), sink.segmentSizes()); assertEquals(asList(Segment.SIZE - 20, Segment.SIZE), source.segmentSizes()); assertEquals(30, sink.size()); assertEquals(Segment.SIZE * 2 - 20, source.size()); }
@Test public void cloneMultipleSegments() throws Exception { OkBuffer original = new OkBuffer(); original.writeUtf8(repeat('a', Segment.SIZE * 3)); OkBuffer clone = original.clone(); original.writeUtf8(repeat('b', Segment.SIZE * 3)); clone.writeUtf8(repeat('c', Segment.SIZE * 3)); assertEquals( repeat('a', Segment.SIZE * 3) + repeat('b', Segment.SIZE * 3), original.readUtf8(Segment.SIZE * 6)); assertEquals( repeat('a', Segment.SIZE * 3) + repeat('c', Segment.SIZE * 3), clone.readUtf8(Segment.SIZE * 6)); }
@Test public void originalDoesNotObserveWritesToClone() throws Exception { OkBuffer original = new OkBuffer(); OkBuffer clone = original.clone(); clone.writeUtf8("abc"); assertEquals(0, original.size()); }
@Test public void readUtf8SpansSegments() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8(repeat('a', Segment.SIZE * 2)); buffer.readUtf8(Segment.SIZE - 1); assertEquals("aa", buffer.readUtf8(2)); }
@Test public void testWritePrefixToEmptyBuffer() { OkBuffer sink = new OkBuffer(); OkBuffer source = new OkBuffer(); source.writeUtf8("abcd"); sink.write(source, 2); assertEquals("ab", sink.readUtf8(2)); }
@Test public void readAndWriteUtf8() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8("ab"); assertEquals(2, buffer.size()); buffer.writeUtf8("cdef"); assertEquals(6, buffer.size()); assertEquals("abcd", buffer.readUtf8(4)); assertEquals(2, buffer.size()); assertEquals("ef", buffer.readUtf8(2)); assertEquals(0, buffer.size()); try { buffer.readUtf8(1); fail(); } catch (ArrayIndexOutOfBoundsException expected) { } }
@Test public void indexOfWithOffset() throws Exception { OkBuffer buffer = new OkBuffer(); int halfSegment = Segment.SIZE / 2; buffer.writeUtf8(repeat('a', halfSegment)); buffer.writeUtf8(repeat('b', halfSegment)); buffer.writeUtf8(repeat('c', halfSegment)); buffer.writeUtf8(repeat('d', halfSegment)); assertEquals(0, buffer.indexOf((byte) 'a', 0)); assertEquals(halfSegment - 1, buffer.indexOf((byte) 'a', halfSegment - 1)); assertEquals(halfSegment, buffer.indexOf((byte) 'b', halfSegment - 1)); assertEquals(halfSegment * 2, buffer.indexOf((byte) 'c', halfSegment - 1)); assertEquals(halfSegment * 3, buffer.indexOf((byte) 'd', halfSegment - 1)); assertEquals(halfSegment * 3, buffer.indexOf((byte) 'd', halfSegment * 2)); assertEquals(halfSegment * 3, buffer.indexOf((byte) 'd', halfSegment * 3)); assertEquals(halfSegment * 4 - 1, buffer.indexOf((byte) 'd', halfSegment * 4 - 1)); }
@Test public void readIntSplitAcrossMultipleSegments() throws Exception { OkBuffer data = new OkBuffer(); data.writeUtf8(repeat('a', Segment.SIZE - 3)); data.write(new byte[] {(byte) 0xab, (byte) 0xcd, (byte) 0xef, (byte) 0x01}); data.readUtf8(Segment.SIZE - 3); assertEquals(0xabcdef01, data.readInt()); assertEquals(0, data.size()); }
@Test public void readShortSplitAcrossMultipleSegments() throws Exception { OkBuffer data = new OkBuffer(); data.writeUtf8(repeat('a', Segment.SIZE - 1)); data.write(new byte[] {(byte) 0xab, (byte) 0xcd}); data.readUtf8(Segment.SIZE - 1); assertEquals((short) 0xabcd, data.readShort()); assertEquals(0, data.size()); }
@Test public void multipleSegmentBuffers() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8(repeat('a', 1000)); buffer.writeUtf8(repeat('b', 2500)); buffer.writeUtf8(repeat('c', 5000)); buffer.writeUtf8(repeat('d', 10000)); buffer.writeUtf8(repeat('e', 25000)); buffer.writeUtf8(repeat('f', 50000)); assertEquals(repeat('a', 999), buffer.readUtf8(999)); // a...a assertEquals("a" + repeat('b', 2500) + "c", buffer.readUtf8(2502)); // ab...bc assertEquals(repeat('c', 4998), buffer.readUtf8(4998)); // c...c assertEquals("c" + repeat('d', 10000) + "e", buffer.readUtf8(10002)); // cd...de assertEquals(repeat('e', 24998), buffer.readUtf8(24998)); // e...e assertEquals("e" + repeat('f', 50000), buffer.readUtf8(50001)); // ef...f assertEquals(0, buffer.size()); }
@Test public void originalDoesNotObserveReadsFromClone() throws Exception { OkBuffer original = new OkBuffer(); original.writeUtf8("abc"); OkBuffer clone = original.clone(); assertEquals("abc", clone.readUtf8(3)); assertEquals(3, original.size()); assertEquals("ab", original.readUtf8(2)); }
@Test public void writeIntegerDoesntQuiteFitInSegment() throws Exception { OkBuffer data = new OkBuffer(); data.writeUtf8(repeat('a', Segment.SIZE - 3)); data.writeInt(0xabcdef01); data.writeInt(0x87654321); assertEquals(asList(Segment.SIZE - 3, 8), data.segmentSizes()); assertEquals(repeat('a', Segment.SIZE - 3), data.readUtf8(Segment.SIZE - 3)); assertEquals("OkBuffer[size=8 data=abcdef0187654321]", data.toString()); }
@Test public void writeLastByteInSegment() throws Exception { OkBuffer data = new OkBuffer(); data.writeUtf8(repeat('a', Segment.SIZE - 1)); data.writeByte(0x20); data.writeByte(0x21); assertEquals(asList(Segment.SIZE, 1), data.segmentSizes()); assertEquals(repeat('a', Segment.SIZE - 1), data.readUtf8(Segment.SIZE - 1)); assertEquals("OkBuffer[size=2 data=2021]", data.toString()); }
@Test public void indexOf() throws Exception { OkBuffer buffer = new OkBuffer(); // The segment is empty. assertEquals(-1, buffer.indexOf((byte) 'a')); // The segment has one value. buffer.writeUtf8("a"); // a assertEquals(0, buffer.indexOf((byte) 'a')); assertEquals(-1, buffer.indexOf((byte) 'b')); // The segment has lots of data. buffer.writeUtf8(repeat('b', Segment.SIZE - 2)); // ab...b assertEquals(0, buffer.indexOf((byte) 'a')); assertEquals(1, buffer.indexOf((byte) 'b')); assertEquals(-1, buffer.indexOf((byte) 'c')); // The segment doesn't start at 0, it starts at 2. buffer.readUtf8(2); // b...b assertEquals(-1, buffer.indexOf((byte) 'a')); assertEquals(0, buffer.indexOf((byte) 'b')); assertEquals(-1, buffer.indexOf((byte) 'c')); // The segment is full. buffer.writeUtf8("c"); // b...bc assertEquals(-1, buffer.indexOf((byte) 'a')); assertEquals(0, buffer.indexOf((byte) 'b')); assertEquals(Segment.SIZE - 3, buffer.indexOf((byte) 'c')); // The segment doesn't start at 2, it starts at 4. buffer.readUtf8(2); // b...bc assertEquals(-1, buffer.indexOf((byte) 'a')); assertEquals(0, buffer.indexOf((byte) 'b')); assertEquals(Segment.SIZE - 5, buffer.indexOf((byte) 'c')); // Two segments. buffer.writeUtf8("d"); // b...bcd, d is in the 2nd segment. assertEquals(asList(Segment.SIZE - 4, 1), buffer.segmentSizes()); assertEquals(Segment.SIZE - 4, buffer.indexOf((byte) 'd')); assertEquals(-1, buffer.indexOf((byte) 'e')); }
@Test public void readExhaustedSource() throws Exception { OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('a', 10)); OkBuffer source = new OkBuffer(); assertEquals(-1, source.read(sink, 10)); assertEquals(10, sink.size()); assertEquals(0, source.size()); }
private List<Integer> moveBytesBetweenBuffers(String... contents) { StringBuilder expected = new StringBuilder(); OkBuffer buffer = new OkBuffer(); for (String s : contents) { OkBuffer source = new OkBuffer(); source.writeUtf8(s); buffer.write(source, source.size()); expected.append(s); } List<Integer> segmentSizes = buffer.segmentSizes(); assertEquals(expected.toString(), buffer.readUtf8(expected.length())); return segmentSizes; }
@Test public void readZeroBytesFromSource() throws Exception { OkBuffer sink = new OkBuffer(); sink.writeUtf8(repeat('a', 10)); OkBuffer source = new OkBuffer(); // Either 0 or -1 is reasonable here. For consistency with Android's // ByteArrayInputStream we return 0. assertEquals(-1, source.read(sink, 0)); assertEquals(10, sink.size()); assertEquals(0, source.size()); }
@Test public void completeSegmentByteCountOnBufferWithIncompleteTailSegment() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8(repeat('a', Segment.SIZE * 4 - 10)); assertEquals(Segment.SIZE * 3, buffer.completeSegmentByteCount()); }
@Test public void readUtf8EntireBuffer() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8(repeat('a', Segment.SIZE)); assertEquals(repeat('a', Segment.SIZE), buffer.readUtf8(Segment.SIZE)); }
@Test public void toStringOnMultipleSegmentBuffer() throws Exception { OkBuffer buffer = new OkBuffer(); buffer.writeUtf8(repeat('a', 6144)); assertEquals("OkBuffer[size=6144 md5=d890021f28522533c1cc1b9b1f83ce73]", buffer.toString()); }