1 /* 2 * Copyright 2014 The gRPC Authors 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17 package io.grpc.internal; 18 19 import static com.google.common.base.Charsets.UTF_8; 20 import static org.junit.Assert.assertArrayEquals; 21 import static org.junit.Assert.assertEquals; 22 23 import java.io.ByteArrayOutputStream; 24 import java.nio.ByteBuffer; 25 import java.util.Arrays; 26 import org.junit.Test; 27 import org.junit.runner.RunWith; 28 import org.junit.runners.JUnit4; 29 30 /** 31 * Abstract base class for tests of {@link ReadableBuffer} subclasses. 32 */ 33 @RunWith(JUnit4.class) 34 public abstract class ReadableBufferTestBase { 35 // Use a long string to ensure that any chunking/splitting works correctly. 36 protected static final String msg = repeatUntilLength("hello", 8 * 1024); 37 38 @Test 39 public void bufferShouldReadAllBytes() { 40 ReadableBuffer buffer = buffer(); 41 for (int ix = 0; ix < msg.length(); ++ix) { 42 assertEquals(msg.length() - ix, buffer.readableBytes()); 43 assertEquals(msg.charAt(ix), buffer.readUnsignedByte()); 44 } 45 assertEquals(0, buffer.readableBytes()); 46 } 47 48 @Test 49 public void readToArrayShouldSucceed() { 50 ReadableBuffer buffer = buffer(); 51 byte[] array = new byte[msg.length()]; 52 buffer.readBytes(array, 0, array.length); 53 assertArrayEquals(msg.getBytes(UTF_8), array); 54 assertEquals(0, buffer.readableBytes()); 55 } 56 57 @Test 58 public void partialReadToArrayShouldSucceed() { 59 ReadableBuffer buffer = buffer(); 60 byte[] array = new byte[msg.length()]; 61 buffer.readBytes(array, 1, 2); 62 assertArrayEquals(new byte[] {'h', 'e'}, Arrays.copyOfRange(array, 1, 3)); 63 assertEquals(msg.length() - 2, buffer.readableBytes()); 64 } 65 66 @Test 67 public void readToStreamShouldSucceed() throws Exception { 68 ReadableBuffer buffer = buffer(); 69 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 70 buffer.readBytes(stream, msg.length()); 71 assertArrayEquals(msg.getBytes(UTF_8), stream.toByteArray()); 72 assertEquals(0, buffer.readableBytes()); 73 } 74 75 @Test 76 public void partialReadToStreamShouldSucceed() throws Exception { 77 ReadableBuffer buffer = buffer(); 78 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 79 buffer.readBytes(stream, 2); 80 assertArrayEquals(new byte[]{'h', 'e'}, Arrays.copyOfRange(stream.toByteArray(), 0, 2)); 81 assertEquals(msg.length() - 2, buffer.readableBytes()); 82 } 83 84 @Test 85 public void readToByteBufferShouldSucceed() { 86 ReadableBuffer buffer = buffer(); 87 ByteBuffer byteBuffer = ByteBuffer.allocate(msg.length()); 88 buffer.readBytes(byteBuffer); 89 byteBuffer.flip(); 90 byte[] array = new byte[msg.length()]; 91 byteBuffer.get(array); 92 assertArrayEquals(msg.getBytes(UTF_8), array); 93 assertEquals(0, buffer.readableBytes()); 94 } 95 96 @Test 97 public void partialReadToByteBufferShouldSucceed() { 98 ReadableBuffer buffer = buffer(); 99 ByteBuffer byteBuffer = ByteBuffer.allocate(2); 100 buffer.readBytes(byteBuffer); 101 byteBuffer.flip(); 102 byte[] array = new byte[2]; 103 byteBuffer.get(array); 104 assertArrayEquals(new byte[]{'h', 'e'}, array); 105 assertEquals(msg.length() - 2, buffer.readableBytes()); 106 } 107 108 @Test 109 public void partialReadToReadableBufferShouldSucceed() { 110 ReadableBuffer buffer = buffer(); 111 ReadableBuffer newBuffer = buffer.readBytes(2); 112 assertEquals(2, newBuffer.readableBytes()); 113 assertEquals(msg.length() - 2, buffer.readableBytes()); 114 byte[] array = new byte[2]; 115 newBuffer.readBytes(array, 0, 2); 116 assertArrayEquals(new byte[] {'h', 'e'}, Arrays.copyOfRange(array, 0, 2)); 117 } 118 119 protected abstract ReadableBuffer buffer(); 120 121 private static String repeatUntilLength(String toRepeat, int length) { 122 StringBuilder buf = new StringBuilder(); 123 while (buf.length() < length) { 124 buf.append(toRepeat); 125 } 126 buf.setLength(length); 127 return buf.toString(); 128 } 129 } 130