metricsListener.onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, state); .addListener((ChannelFutureListener) channelFuture -> { if (channelFuture.isSuccess()) metricsListener.onEvent(ServerMetricsEvent.RESPONSE_SENT, stateCopy); else { metricsListener.onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, null);
metricsListener.onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, state); .addListener((ChannelFutureListener) channelFuture -> { if (channelFuture.isSuccess()) metricsListener.onEvent(ServerMetricsEvent.RESPONSE_SENT, stateCopy); else { metricsListener.onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, null);
@Test public void channelRead_cleans_the_state_and_starts_metrics_request_and_removes_any_existing_IdleChannelTimeoutHandler() throws Exception { // when handler.channelRead(ctxMock, msgMockFirstChunkOnly); // then verify(stateMock).cleanStateForNewRequest(); verify(metricsListenerMock).onEvent(ServerMetricsEvent.REQUEST_RECEIVED, stateMock); verify(pipelineMock).get(IDLE_CHANNEL_TIMEOUT_HANDLER_NAME); verify(pipelineMock).remove(idleChannelTimeoutHandlerMock); }
metricsListener.onEvent(ServerMetricsEvent.REQUEST_RECEIVED, httpProcessingState);
metricsListener.onEvent(ServerMetricsEvent.REQUEST_RECEIVED, httpProcessingState);
@Test public void finalizeChannelPipeline_should_send_event_to_metricsListener_for_successful_response_and_flush_context() throws Exception { // given ChannelFuture responseWriterChannelFuture = mock(ChannelFuture.class); state.setResponseWriterFinalChunkChannelFuture(responseWriterChannelFuture); HttpProcessingState stateSpy = spy(state); doReturn(stateSpy).when(stateAttributeMock).get(); ChannelFuture responseWriteFutureResult = mock(ChannelFuture.class); doReturn(true).when(responseWriteFutureResult).isSuccess(); Assertions.assertThat(stateSpy.isRequestMetricsRecordedOrScheduled()).isFalse(); // when handler.finalizeChannelPipeline(ctxMock, null, stateSpy, null); // then ArgumentCaptor<GenericFutureListener> channelFutureListenerArgumentCaptor = ArgumentCaptor.forClass(GenericFutureListener.class); verify(responseWriterChannelFuture).addListener(channelFutureListenerArgumentCaptor.capture()); GenericFutureListener futureListener = channelFutureListenerArgumentCaptor.getValue(); assertThat(futureListener, notNullValue()); futureListener.operationComplete(responseWriteFutureResult); verify(metricsListenerMock).onEvent(eq(ServerMetricsEvent.RESPONSE_SENT), any(HttpProcessingState.class)); verify(ctxMock).flush(); Assertions.assertThat(stateSpy.isRequestMetricsRecordedOrScheduled()).isTrue(); }
@Test public void finalizeChannelPipeline_should_send_error_response_if_state_indicates_no_response_already_sent() throws JsonProcessingException { // given state.setResponseWriterFinalChunkChannelFuture(null); HttpProcessingState stateSpy = spy(state); doReturn(stateSpy).when(stateAttributeMock).get(); doReturn(false).when(responseInfoMock).isResponseSendingStarted(); Object msg = new Object(); Throwable cause = new Exception("intentional test exception"); RequestInfo<?> requestInfoMock = mock(RequestInfo.class); ResponseInfo<ErrorResponseBody> errorResponseMock = mock(ResponseInfo.class); doReturn(requestInfoMock).when(exceptionHandlingHandlerMock).getRequestInfo(stateSpy, msg); doReturn(errorResponseMock).when(exceptionHandlingHandlerMock).processUnhandledError(eq(stateSpy), eq(msg), any(Throwable.class)); // when handler.finalizeChannelPipeline(ctxMock, msg, stateSpy, cause); // then verify(responseSenderMock).sendErrorResponse(ctxMock, requestInfoMock, errorResponseMock); verify(metricsListenerMock).onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, stateSpy); verify(ctxMock).flush(); }
@Test public void finalizeChannelPipeline_should_send_event_to_metricsListener_for_failure_response_and_flush_context() throws Exception { // given ChannelFuture responseWriterChannelFuture = mock(ChannelFuture.class); state.setResponseWriterFinalChunkChannelFuture(responseWriterChannelFuture); HttpProcessingState stateSpy = spy(state); doReturn(stateSpy).when(stateAttributeMock).get(); ChannelFuture responseWriteFutureResult = mock(ChannelFuture.class); doReturn(false).when(responseWriteFutureResult).isSuccess(); Assertions.assertThat(stateSpy.isRequestMetricsRecordedOrScheduled()).isFalse(); // when handler.finalizeChannelPipeline(ctxMock, null, stateSpy, null); // then ArgumentCaptor<GenericFutureListener> channelFutureListenerArgumentCaptor = ArgumentCaptor.forClass(GenericFutureListener.class); verify(responseWriterChannelFuture).addListener(channelFutureListenerArgumentCaptor.capture()); GenericFutureListener futureListener = channelFutureListenerArgumentCaptor.getValue(); assertThat(futureListener, notNullValue()); futureListener.operationComplete(responseWriteFutureResult); verify(metricsListenerMock).onEvent(ServerMetricsEvent.RESPONSE_WRITE_FAILED, null); verify(ctxMock).flush(); Assertions.assertThat(stateSpy.isRequestMetricsRecordedOrScheduled()).isTrue(); }
verify(metricsListenerMock).onEvent(eq(ServerMetricsEvent.REQUEST_RECEIVED), eq(actualHttpState));