@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()); }
@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 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()); }
@Override public long read(OkBuffer sink, long byteCount) throws IOException { if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount); if (closed) throw new IllegalStateException("closed"); if (buffer.size == 0) { long read = source.read(buffer, Segment.SIZE); if (read == -1) return -1; } long toRead = Math.min(byteCount, buffer.size); return buffer.read(sink, toRead); }