/* * Copyright 2015 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package io.netty.handler.codec.protobuf; import io.netty.buffer.ByteBuf; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.Before; import org.junit.Test; import static io.netty.buffer.Unpooled.*; import static org.hamcrest.core.Is.*; import static org.junit.Assert.*; public class ProtobufVarint32LengthFieldPrependerTest { private EmbeddedChannel ch; @Before public void setUp() { ch = new EmbeddedChannel(new ProtobufVarint32LengthFieldPrepender()); } @Test public void testSize1Varint() { final int size = 1; final int num = 10; assertThat(ProtobufVarint32LengthFieldPrepender.computeRawVarint32Size(num), is(size)); final byte[] buf = new byte[size + num]; //0000 1010 buf[0] = 0x0A; for (int i = size; i < num + size; ++i) { buf[i] = 1; } assertTrue(ch.writeOutbound(wrappedBuffer(buf, size, buf.length - size))); ByteBuf expected = wrappedBuffer(buf); ByteBuf actual = ch.readOutbound(); assertThat(expected, is(actual)); assertFalse(ch.finish()); expected.release(); actual.release(); } @Test public void testSize2Varint() { final int size = 2; final int num = 266; assertThat(ProtobufVarint32LengthFieldPrepender.computeRawVarint32Size(num), is(size)); final byte[] buf = new byte[size + num]; /** * 8 A 0 2 * 1000 1010 0000 0010 * 0000 1010 0000 0010 * 0000 0010 0000 1010 * 000 0010 000 1010 * * 0000 0001 0000 1010 * 0 1 0 A * 266 */ buf[0] = (byte) (0x8A & 0xFF); buf[1] = 0x02; for (int i = size; i < num + size; ++i) { buf[i] = 1; } assertTrue(ch.writeOutbound(wrappedBuffer(buf, size, buf.length - size))); ByteBuf expected = wrappedBuffer(buf); ByteBuf actual = ch.readOutbound(); assertThat(actual, is(expected)); assertFalse(ch.finish()); expected.release(); actual.release(); } @Test public void testSize3Varint() { final int size = 3; final int num = 0x4000; assertThat(ProtobufVarint32LengthFieldPrepender.computeRawVarint32Size(num), is(size)); final byte[] buf = new byte[size + num]; /** * 8 0 8 0 0 1 * 1000 0000 1000 0000 0000 0001 * 0000 0000 0000 0000 0000 0001 * 0000 0001 0000 0000 0000 0000 * 000 0001 000 0000 000 0000 * * 0 0000 0100 0000 0000 0000 * 0 0 4 0 0 0 * */ buf[0] = (byte) (0x80 & 0xFF); buf[1] = (byte) (0x80 & 0xFF); buf[2] = 0x01; for (int i = size; i < num + size; ++i) { buf[i] = 1; } assertTrue(ch.writeOutbound(wrappedBuffer(buf, size, buf.length - size))); ByteBuf expected = wrappedBuffer(buf); ByteBuf actual = ch.readOutbound(); assertThat(expected, is(actual)); assertFalse(ch.finish()); expected.release(); actual.release(); } @Test public void testSize4Varint() { final int size = 4; final int num = 0x200000; assertThat(ProtobufVarint32LengthFieldPrepender.computeRawVarint32Size(num), is(size)); final byte[] buf = new byte[size + num]; /** * 8 0 8 0 8 0 0 1 * 1000 0000 1000 0000 1000 0000 0000 0001 * 0000 0000 0000 0000 0000 0000 0000 0001 * 0000 0001 0000 0000 0000 0000 0000 0000 * 000 0001 000 0000 000 0000 000 0000 * * 0000 0010 0000 0000 0000 0000 0000 * 0 2 0 0 0 0 0 * */ buf[0] = (byte) (0x80 & 0xFF); buf[1] = (byte) (0x80 & 0xFF); buf[2] = (byte) (0x80 & 0xFF); buf[3] = 0x01; for (int i = size; i < num + size; ++i) { buf[i] = 1; } assertTrue(ch.writeOutbound(wrappedBuffer(buf, size, buf.length - size))); ByteBuf expected = wrappedBuffer(buf); ByteBuf actual = ch.readOutbound(); assertThat(actual, is(expected)); assertFalse(ch.finish()); expected.release(); actual.release(); } @Test public void testTinyEncode() { byte[] b = { 4, 1, 1, 1, 1 }; assertTrue(ch.writeOutbound(wrappedBuffer(b, 1, b.length - 1))); ByteBuf expected = wrappedBuffer(b); ByteBuf actual = ch.readOutbound(); assertThat(actual, is(expected)); assertFalse(ch.finish()); expected.release(); actual.release(); } @Test public void testRegularDecode() { byte[] b = new byte[2048]; for (int i = 2; i < 2048; i ++) { b[i] = 1; } b[0] = -2; b[1] = 15; assertTrue(ch.writeOutbound(wrappedBuffer(b, 2, b.length - 2))); ByteBuf expected = wrappedBuffer(b); ByteBuf actual = ch.readOutbound(); assertThat(actual, is(expected)); assertFalse(ch.finish()); expected.release(); actual.release(); } }