@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 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()); }
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 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')); }