|
18 | 18 |
|
19 | 19 | import static com.google.common.truth.Truth.assertThat;
|
20 | 20 | import static com.google.common.truth.Truth.assertWithMessage;
|
21 |
| -import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE; |
22 | 21 | import static io.grpc.netty.NettyTestUtil.messageFrame;
|
23 | 22 | import static io.netty.handler.codec.http2.Http2Error.PROTOCOL_ERROR;
|
24 | 23 | import static io.netty.handler.codec.http2.Http2Exception.connectionError;
|
|
37 | 36 | import static org.mockito.Mockito.verifyNoMoreInteractions;
|
38 | 37 | import static org.mockito.Mockito.when;
|
39 | 38 |
|
| 39 | +import com.google.common.base.Strings; |
40 | 40 | import com.google.common.collect.ImmutableListMultimap;
|
41 | 41 | import com.google.common.collect.ListMultimap;
|
42 | 42 | import io.grpc.Attributes;
|
|
73 | 73 | /** Unit tests for {@link NettyServerStream}. */
|
74 | 74 | @RunWith(JUnit4.class)
|
75 | 75 | public class NettyServerStreamTest extends NettyStreamTestBase<NettyServerStream> {
|
| 76 | + private static final int TEST_MAX_MESSAGE_SIZE = 128; |
| 77 | + |
76 | 78 | @Mock
|
77 | 79 | protected ServerStreamListener serverListener;
|
78 | 80 |
|
@@ -380,18 +382,39 @@ public void emptyFramerShouldSendNoPayload() {
|
380 | 382 | public void cancelStreamShouldSucceed() {
|
381 | 383 | stream().cancel(Status.DEADLINE_EXCEEDED);
|
382 | 384 | verify(writeQueue).enqueue(
|
383 |
| - new CancelServerStreamCommand(stream().transportState(), Status.DEADLINE_EXCEEDED), |
| 385 | + CancelServerStreamCommand.withReset(stream().transportState(), Status.DEADLINE_EXCEEDED), |
384 | 386 | true);
|
385 | 387 | }
|
386 | 388 |
|
| 389 | + @Test |
| 390 | + public void oversizedMessagesResultInResourceExhaustedTrailers() throws Exception { |
| 391 | + @SuppressWarnings("InlineMeInliner") // Requires Java 11 |
| 392 | + String oversizedMsg = Strings.repeat("a", TEST_MAX_MESSAGE_SIZE + 1); |
| 393 | + stream.request(1); |
| 394 | + stream.transportState().inboundDataReceived(messageFrame(oversizedMsg), false); |
| 395 | + assertNull("message should have caused a deframer error", listenerMessageQueue().poll()); |
| 396 | + |
| 397 | + ArgumentCaptor<CancelServerStreamCommand> cancelCmdCap = |
| 398 | + ArgumentCaptor.forClass(CancelServerStreamCommand.class); |
| 399 | + verify(writeQueue).enqueue(cancelCmdCap.capture(), eq(true)); |
| 400 | + |
| 401 | + Status status = Status.RESOURCE_EXHAUSTED |
| 402 | + .withDescription("gRPC message exceeds maximum size 128: 129"); |
| 403 | + |
| 404 | + CancelServerStreamCommand actualCmd = cancelCmdCap.getValue(); |
| 405 | + assertThat(actualCmd.reason().getCode()).isEqualTo(status.getCode()); |
| 406 | + assertThat(actualCmd.reason().getDescription()).isEqualTo(status.getDescription()); |
| 407 | + assertThat(actualCmd.wantsHeaders()).isTrue(); |
| 408 | + } |
| 409 | + |
387 | 410 | @Override
|
388 | 411 | @SuppressWarnings("DirectInvocationOnMock")
|
389 | 412 | protected NettyServerStream createStream() {
|
390 | 413 | when(handler.getWriteQueue()).thenReturn(writeQueue);
|
391 | 414 | StatsTraceContext statsTraceCtx = StatsTraceContext.NOOP;
|
392 | 415 | TransportTracer transportTracer = new TransportTracer();
|
393 | 416 | NettyServerStream.TransportState state = new NettyServerStream.TransportState(
|
394 |
| - handler, channel.eventLoop(), http2Stream, DEFAULT_MAX_MESSAGE_SIZE, statsTraceCtx, |
| 417 | + handler, channel.eventLoop(), http2Stream, TEST_MAX_MESSAGE_SIZE, statsTraceCtx, |
395 | 418 | transportTracer, "method");
|
396 | 419 | NettyServerStream stream = new NettyServerStream(channel, state, Attributes.EMPTY,
|
397 | 420 | "test-authority", statsTraceCtx);
|
|
0 commit comments