13c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller/*
23c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Copyright (C) 2014 Square, Inc.
33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
53c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * you may not use this file except in compliance with the License.
63c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * You may obtain a copy of the License at
73c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
83c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
93c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller *
103c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * Unless required by applicable law or agreed to in writing, software
113c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
123c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * See the License for the specific language governing permissions and
143c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller * limitations under the License.
153c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller */
163c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpackage okio;
173c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
183c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.ByteArrayInputStream;
193c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.ByteArrayOutputStream;
203c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.io.InputStream;
213c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.util.Arrays;
223c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport org.junit.Test;
233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
243c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static okio.Util.UTF_8;
253c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static org.junit.Assert.assertEquals;
263c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport static org.junit.Assert.fail;
273c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
283c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpublic final class OkioTest {
293c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void sinkFromOutputStream() throws Exception {
303c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    OkBuffer data = new OkBuffer();
313c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    data.writeUtf8("a");
323c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    data.writeUtf8(repeat('b', 9998));
333c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    data.writeUtf8("c");
343c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
353c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    ByteArrayOutputStream out = new ByteArrayOutputStream();
363c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    Sink sink = Okio.sink(out);
373c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    sink.write(data, 3);
383c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals("abb", out.toString("UTF-8"));
393c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    sink.write(data, data.size());
403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals("a" + repeat('b', 9998) + "c", out.toString("UTF-8"));
413c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
423c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
433c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void sourceFromInputStream() throws Exception {
443c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    InputStream in = new ByteArrayInputStream(
453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller        ("a" + repeat('b', Segment.SIZE * 2) + "c").getBytes(UTF_8));
463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
473c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // Source: ab...bc
483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    Source source = Okio.source(in);
493c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    OkBuffer sink = new OkBuffer();
503c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
513c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // Source: b...bc. Sink: abb.
523c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(3, source.read(sink, 3));
533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals("abb", sink.readUtf8(3));
543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
553c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // Source: b...bc. Sink: b...b.
563c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(Segment.SIZE, source.read(sink, 20000));
573c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(repeat('b', Segment.SIZE), sink.readUtf8(sink.size()));
583c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
593c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // Source: b...bc. Sink: b...bc.
603c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(Segment.SIZE - 1, source.read(sink, 20000));
613c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(repeat('b', Segment.SIZE - 2) + "c", sink.readUtf8(sink.size()));
623c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
633c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // Source and sink are empty.
643c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(-1, source.read(sink, 1));
653c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
663c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
673c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  @Test public void sourceFromInputStreamBounds() throws Exception {
683c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    Source source = Okio.source(new ByteArrayInputStream(new byte[100]));
693c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    try {
703c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller      source.read(new OkBuffer(), -1);
713c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller      fail();
723c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    } catch (IllegalArgumentException expected) {
733c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
743c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
753c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
763c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  private String repeat(char c, int count) {
773c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    char[] array = new char[count];
783c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    Arrays.fill(array, c);
793c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    return new String(array);
803c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
813c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller}
82