@Test public void StreamingChannel_doStreamChunk_works_as_expected_when_crazy_exception_is_thrown() { // given Throwable crazyEx = new RuntimeException("kaboom"); doThrow(crazyEx).when(channelMock).writeAndFlush(any(Object.class)); // when ChannelFuture result = streamingChannelSpy.doStreamChunk(contentChunkMock); // then verify(channelMock).writeAndFlush(any(Object.class)); verify(contentChunkMock, never()).release(); verifyFailedChannelFuture( result, "StreamingChannel.doStreamChunk() threw an exception", crazyEx ); }
() -> doStreamChunk(chunkToWrite).addListener(future -> { if (future.isCancelled()) { result.cancel(true);
() -> doStreamChunk(chunkToWrite).addListener(future -> { if (future.isCancelled()) { result.cancel(true);
doReturn(doStreamChunkFutureMock).when(streamingChannelSpy).doStreamChunk(any(HttpContent.class)); verify(streamingChannelSpy, never()).doStreamChunk(any(HttpContent.class)); // not yet called verify(streamingChannelSpy).doStreamChunk(contentChunkMock); ArgumentCaptor<GenericFutureListener> listenerCaptor = ArgumentCaptor.forClass(GenericFutureListener.class); verify(doStreamChunkFutureMock).addListener(listenerCaptor.capture());
@DataProvider(value = { "false | 0", "true | 42" }, splitBy = "\\|") @Test public void StreamingChannel_doStreamChunk_works_as_expected_when_last_chunk_already_sent_downstream_and_incoming_chunk_does_not_match_requirements( boolean chunkIsLastChunk, int readableBytes ) { // given streamingChannelSpy.downstreamLastChunkSentHolder.heldObject = true; streamingChannelSpy.callActiveHolder.heldObject = true; streamingChannelSpy.channelClosedDueToUnrecoverableError = false; HttpContent contentChunkMock = (chunkIsLastChunk) ? mock(LastHttpContent.class) : mock(HttpContent.class); ByteBuf contentByteBufMock = mock(ByteBuf.class); doReturn(contentByteBufMock).when(contentChunkMock).content(); doReturn(readableBytes).when(contentByteBufMock).readableBytes(); doReturn(writeAndFlushChannelFutureMock).when(channelMock).writeAndFlush(contentChunkMock); // when ChannelFuture result = streamingChannelSpy.doStreamChunk(contentChunkMock); // then verify(channelMock).writeAndFlush(contentChunkMock); assertThat(result).isSameAs(writeAndFlushChannelFutureMock); }
@Test public void StreamingChannel_doStreamChunk_works_as_expected_when_last_chunk_already_sent_downstream_and_incoming_chunk_is_empty_last_chunk() { // given streamingChannelSpy.downstreamLastChunkSentHolder.heldObject = true; LastHttpContent contentChunkMock = mock(LastHttpContent.class); ByteBuf contentByteBufMock = mock(ByteBuf.class); doReturn(contentByteBufMock).when(contentChunkMock).content(); doReturn(0).when(contentByteBufMock).readableBytes(); ChannelFuture successFutureMock = mock(ChannelFuture.class); doReturn(successFutureMock).when(channelMock).newSucceededFuture(); // when ChannelFuture result = streamingChannelSpy.doStreamChunk(contentChunkMock); // then verify(channelMock, never()).writeAndFlush(any(Object.class)); verify(contentChunkMock).release(); verify(channelMock).newSucceededFuture(); assertThat(result).isSameAs(successFutureMock); }
@Test public void StreamingChannel_doStreamChunk_works_as_expected_when_closeChannelDueToUnrecoverableError_was_called_previously() { // given streamingChannelSpy.channelClosedDueToUnrecoverableError = true; // when ChannelFuture result = streamingChannelSpy.doStreamChunk(contentChunkMock); // then verify(channelMock, never()).writeAndFlush(any(Object.class)); verify(contentChunkMock).release(); verifyFailedChannelFuture( result, "Unable to stream chunks downstream - the channel was closed previously due to an unrecoverable error", null ); }
@Test public void StreamingChannel_doStreamChunk_works_as_expected_when_downstream_call_is_not_active() { // given streamingChannelSpy.callActiveHolder.heldObject = false; // when ChannelFuture result = streamingChannelSpy.doStreamChunk(contentChunkMock); // then verify(channelMock, never()).writeAndFlush(any(Object.class)); verify(contentChunkMock).release(); verifyFailedChannelFuture( result, "Unable to stream chunk - downstream call is no longer active.", null ); }