@Test public void constructor_sets_fields_as_expected() { // when RequestStateCleanerHandler handler = new RequestStateCleanerHandler( metricsListenerMock, incompleteHttpCallTimeoutMillis, distributedTracingConfigMock ); // then assertThat(handler.metricsListener).isSameAs(metricsListenerMock); assertThat(handler.incompleteHttpCallTimeoutMillis).isEqualTo(incompleteHttpCallTimeoutMillis); assertThat(handler.distributedTracingConfig).isSameAs(distributedTracingConfigMock); }
@Before public void beforeMethod() { stateMock = mock(HttpProcessingState.class); proxyRouterProcessingStateMock = mock(ProxyRouterProcessingState.class); ctxMock = mock(ChannelHandlerContext.class); channelMock = mock(Channel.class); pipelineMock = mock(ChannelPipeline.class); stateAttrMock = mock(Attribute.class); proxyRouterProcessingStateAttrMock = mock(Attribute.class); metricsListenerMock = mock(MetricsListener.class); distributedTracingConfigMock = mock(DistributedTracingConfig.class); msgMockFirstChunkOnly = mock(HttpRequest.class); msgMockFullRequest = mock(FullHttpRequest.class); msgMockLastChunkOnly = mock(LastHttpContent.class); idleChannelTimeoutHandlerMock = mock(IdleChannelTimeoutHandler.class); doReturn(channelMock).when(ctxMock).channel(); doReturn(pipelineMock).when(ctxMock).pipeline(); doReturn(idleChannelTimeoutHandlerMock).when(pipelineMock).get(IDLE_CHANNEL_TIMEOUT_HANDLER_NAME); doReturn(stateAttrMock).when(channelMock).attr(ChannelAttributes.HTTP_PROCESSING_STATE_ATTRIBUTE_KEY); doReturn(stateMock).when(stateAttrMock).get(); doReturn(proxyRouterProcessingStateAttrMock).when(channelMock).attr(ChannelAttributes.PROXY_ROUTER_PROCESSING_STATE_ATTRIBUTE_KEY); doReturn(proxyRouterProcessingStateMock).when(proxyRouterProcessingStateAttrMock).get(); handler = new RequestStateCleanerHandler( metricsListenerMock, incompleteHttpCallTimeoutMillis, distributedTracingConfigMock ); }
@Test public void channelRead_does_not_explode_if_metricsListener_is_null() throws Exception { // given RequestStateCleanerHandler handlerNoMetrics = new RequestStateCleanerHandler( null, incompleteHttpCallTimeoutMillis, distributedTracingConfigMock ); // when handlerNoMetrics.channelRead(ctxMock, msgMockFirstChunkOnly); // then verify(stateMock).cleanStateForNewRequest(); verifyZeroInteractions(metricsListenerMock); }
@Test public void channelRead_replaces_IncompleteHttpCallTimeoutHandler_if_one_already_exists() throws Exception { // given long timeoutMillis = 42; RequestStateCleanerHandler handlerToUse = new RequestStateCleanerHandler( null, timeoutMillis, distributedTracingConfigMock ); IncompleteHttpCallTimeoutHandler alreadyExistingHandler = mock(IncompleteHttpCallTimeoutHandler.class); doReturn(alreadyExistingHandler).when(pipelineMock).get(INCOMPLETE_HTTP_CALL_TIMEOUT_HANDLER_NAME); doReturn(null).when(pipelineMock).get(IDLE_CHANNEL_TIMEOUT_HANDLER_NAME); // when handlerToUse.channelRead(ctxMock, msgMockFirstChunkOnly); // then // The normal happy path addition of the timeout handler should not have occurred. verify(pipelineMock, never()).addFirst(eq(INCOMPLETE_HTTP_CALL_TIMEOUT_HANDLER_NAME), any(ChannelHandler.class)); // Instead, the existing handler should have been replaced. ArgumentCaptor<ChannelHandler> handlerArgCaptor = ArgumentCaptor.forClass(ChannelHandler.class); verify(pipelineMock).replace(eq(alreadyExistingHandler), eq(INCOMPLETE_HTTP_CALL_TIMEOUT_HANDLER_NAME), handlerArgCaptor.capture()); assertThat(handlerArgCaptor.getValue()).isInstanceOf(IncompleteHttpCallTimeoutHandler.class); IncompleteHttpCallTimeoutHandler handlerAdded = (IncompleteHttpCallTimeoutHandler)handlerArgCaptor.getValue(); assertThat(handlerAdded.idleTimeoutMillis).isEqualTo(timeoutMillis); }
RequestStateCleanerHandler handlerToUse = new RequestStateCleanerHandler( null, timeoutMillis, distributedTracingConfigMock );
new RequestStateCleanerHandler( metricsListener, incompleteHttpCallTimeoutMillis,
new RequestStateCleanerHandler( metricsListener, incompleteHttpCallTimeoutMillis,