/*
* Copyright 2017 LINE Corporation
*
* LINE Corporation 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 com.linecorp.armeria.internal.grpc;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.Random;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.base.Strings;
import com.google.protobuf.ByteString;
import com.linecorp.armeria.common.http.HttpData;
import com.linecorp.armeria.grpc.testing.Messages.Payload;
import com.linecorp.armeria.grpc.testing.Messages.SimpleRequest;
import io.grpc.Codec.Gzip;
import io.grpc.StatusRuntimeException;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
public class ArmeriaMessageFramerTest {
private ArmeriaMessageFramer framer;
@Before
public void setUp() {
framer = new ArmeriaMessageFramer(UnpooledByteBufAllocator.DEFAULT, 1024);
}
@After
public void close() {
framer.close();
}
@Test
public void writeUncompressed() throws Exception {
ByteBuf buf = GrpcTestUtil.requestByteBuf();
HttpData framed = framer.writePayload(buf);
assertThat(framed.array()).isEqualTo(GrpcTestUtil.uncompressedFrame(GrpcTestUtil.requestByteBuf()));
assertThat(buf.refCnt()).isEqualTo(0);
}
@Test
public void compressed() throws Exception {
framer.setCompressor(new Gzip());
framer.setMessageCompression(true);
ByteBuf buf = GrpcTestUtil.requestByteBuf();
HttpData framed = framer.writePayload(buf);
assertThat(framed.array()).isEqualTo(GrpcTestUtil.compressedFrame(GrpcTestUtil.requestByteBuf()));
assertThat(buf.refCnt()).isEqualTo(0);
}
@Test
public void emptyNotCompressed() throws Exception {
framer.setCompressor(new Gzip());
framer.setMessageCompression(true);
ByteBuf buf = GrpcTestUtil.protoByteBuf(SimpleRequest.getDefaultInstance());
assertThat(buf.readableBytes()).isEqualTo(0);
HttpData framed = framer.writePayload(buf);
assertThat(framed.array()).isEqualTo(GrpcTestUtil.uncompressedFrame(
GrpcTestUtil.protoByteBuf(SimpleRequest.getDefaultInstance())));
assertThat(buf.refCnt()).isEqualTo(0);
}
@Test
public void tooLargeUncompressed() throws Exception {
SimpleRequest request =
SimpleRequest.newBuilder()
.setPayload(Payload.newBuilder()
.setBody(ByteString.copyFromUtf8(
Strings.repeat("a", 1024))))
.build();
assertThatThrownBy(() -> framer.writePayload(GrpcTestUtil.protoByteBuf(request)))
.isInstanceOf(StatusRuntimeException.class);
}
@Test
public void notTooLargeCompressed() throws Exception {
framer.setCompressor(new Gzip());
framer.setMessageCompression(true);
SimpleRequest request =
SimpleRequest.newBuilder()
.setPayload(Payload.newBuilder()
.setBody(ByteString.copyFromUtf8(
Strings.repeat("a", 1024))))
.build();
HttpData framed = framer.writePayload(GrpcTestUtil.protoByteBuf(request));
assertThat(framed.array()).isEqualTo(GrpcTestUtil.compressedFrame(GrpcTestUtil.protoByteBuf(request)));
}
@Test
public void tooLargeCompressed() throws Exception {
framer.setCompressor(new Gzip());
framer.setMessageCompression(true);
Random random = new Random(1);
byte[] payload = new byte[1024];
random.nextBytes(payload);
SimpleRequest request =
SimpleRequest.newBuilder()
.setPayload(Payload.newBuilder()
.setBody(ByteString.copyFrom(payload)))
.build();
assertThatThrownBy(() -> framer.writePayload(GrpcTestUtil.protoByteBuf(request)))
.isInstanceOf(StatusRuntimeException.class);
}
}