@Test public void processError_returns_value_of_processUnhandledError_if_riposteErrorHandler_explodes() throws UnexpectedMajorErrorHandlingError, JsonProcessingException { // given HttpProcessingState stateMock = mock(HttpProcessingState.class); Object msg = new Object(); Throwable cause = new Exception(); ExceptionHandlingHandler handlerSpy = spy(handler); ResponseInfo<ErrorResponseBody> responseInfoMockFromCatchallMethod = mock(ResponseInfo.class); doThrow(new RuntimeException()).when(riposteErrorHandlerMock).maybeHandleError(any(), any()); doReturn(responseInfoMockFromCatchallMethod).when(handlerSpy).processUnhandledError(stateMock, msg, cause); // when ResponseInfo<ErrorResponseBody> response = handlerSpy.processError(stateMock, msg, cause); // then verify(riposteErrorHandlerMock).maybeHandleError(any(), any()); assertThat(response, is(responseInfoMockFromCatchallMethod)); }
@Test public void processError_returns_value_of_processUnhandledError_if_riposteErrorHandler_returns_null() throws UnexpectedMajorErrorHandlingError, JsonProcessingException { // given HttpProcessingState stateMock = mock(HttpProcessingState.class); Object msg = new Object(); Throwable cause = new Exception(); ExceptionHandlingHandler handlerSpy = spy(handler); ResponseInfo<ErrorResponseBody> responseInfoMockFromCatchallMethod = mock(ResponseInfo.class); doReturn(null).when(riposteErrorHandlerMock).maybeHandleError(any(), any()); doReturn(responseInfoMockFromCatchallMethod).when(handlerSpy).processUnhandledError(stateMock, msg, cause); // when ResponseInfo<ErrorResponseBody> response = handlerSpy.processError(stateMock, msg, cause); // then verify(riposteErrorHandlerMock).maybeHandleError(any(), any()); assertThat(response, is(responseInfoMockFromCatchallMethod)); }
@UseDataProvider("exceptionsThatShouldForceCloseConnection") @Test public void doExceptionCaught_should_setForceConnectionCloseAfterResponseSent_to_true_on_request_when_exception_matches_certain_types( Throwable exThatShouldForceCloseConnection ) throws Exception { // given ExceptionHandlingHandler handlerSpy = spy(handler); ResponseInfo<ErrorResponseBody> errorResponseMock = mock(ResponseInfo.class); doReturn(errorResponseMock).when(handlerSpy).processError(state, null, exThatShouldForceCloseConnection); assertThat(state.getResponseInfo(), nullValue()); // when PipelineContinuationBehavior result = handlerSpy.doExceptionCaught(ctxMock, exThatShouldForceCloseConnection); // then verify(errorResponseMock).setForceConnectionCloseAfterResponseSent(true); verify(handlerSpy).getStateAndCreateIfNeeded(ctxMock, exThatShouldForceCloseConnection); verify(handlerSpy).processError(state, null, exThatShouldForceCloseConnection); assertThat(state.getResponseInfo(), is(errorResponseMock)); assertThat(result, is(PipelineContinuationBehavior.CONTINUE)); }
@Test public void doExceptionCaught_should_cancel_proxy_router_processing_if_endpoint_is_ProxyRouterEndpoint() { // given ExceptionHandlingHandler handlerSpy = spy(handler); Throwable cause = new Exception("intentional test exception"); ResponseInfo<ErrorResponseBody> errorResponseMock = mock(ResponseInfo.class); doReturn(errorResponseMock).when(handlerSpy).processError(state, null, cause); assertThat(state.getResponseInfo(), nullValue()); // when PipelineContinuationBehavior result = handlerSpy.doExceptionCaught(ctxMock, cause); // then verify(handlerSpy).getStateAndCreateIfNeeded(ctxMock, cause); verify(handlerSpy).processError(state, null, cause); assertThat(state.getResponseInfo(), is(errorResponseMock)); Assertions.assertThat(state.getErrorThatTriggeredThisResponse()).isSameAs(cause); verify(handlerSpy).addErrorAnnotationToOverallRequestSpan(state, errorResponseMock, cause); assertThat(result, is(PipelineContinuationBehavior.CONTINUE)); }
@DataProvider(value = { "true", "false" }) @Test public void doExceptionCaught_should_do_nothing_and_return_DO_NOT_FIRE_CONTINUE_EVENT_if_response_sending_already_started( boolean causeIsNullPointerException ) { // given ExceptionHandlingHandler handlerSpy = spy(handler); Throwable cause = (causeIsNullPointerException) ? new NullPointerException("intentional NPE") : new Exception("intentional test exception"); ResponseInfo<?> responseInfoMock = mock(ResponseInfo.class); doReturn(true).when(responseInfoMock).isResponseSendingStarted(); state.setResponseInfo(responseInfoMock, cause); // when PipelineContinuationBehavior result = handlerSpy.doExceptionCaught(ctxMock, cause); // then verify(handlerSpy, never()).processError(any(HttpProcessingState.class), any(Object.class), any(Throwable.class)); Assertions.assertThat(result).isEqualTo(DO_NOT_FIRE_CONTINUE_EVENT); }
@Test public void processError_gets_requestInfo_then_calls_riposteErrorHandler_then_converts_to_response_using_setupResponseInfoBasedOnErrorResponseInfo() throws UnexpectedMajorErrorHandlingError, JsonProcessingException { // given HttpProcessingState stateMock = mock(HttpProcessingState.class); Object msg = new Object(); Throwable cause = new Exception(); ExceptionHandlingHandler handlerSpy = spy(handler); RequestInfo<?> requestInfoMock = mock(RequestInfo.class); ErrorResponseInfo errorResponseInfoMock = mock(ErrorResponseInfo.class); RiposteErrorHandler riposteErrorHandlerMock = mock(RiposteErrorHandler.class); Whitebox.setInternalState(handlerSpy, "riposteErrorHandler", riposteErrorHandlerMock); doReturn(requestInfoMock).when(handlerSpy).getRequestInfo(stateMock, msg); doReturn(errorResponseInfoMock).when(riposteErrorHandlerMock).maybeHandleError(cause, requestInfoMock); // when ResponseInfo<ErrorResponseBody> response = handlerSpy.processError(stateMock, msg, cause); // then verify(handlerSpy).getRequestInfo(stateMock, msg); verify(riposteErrorHandlerMock).maybeHandleError(cause, requestInfoMock); ArgumentCaptor<ResponseInfo> responseInfoArgumentCaptor = ArgumentCaptor.forClass(ResponseInfo.class); verify(handlerSpy).setupResponseInfoBasedOnErrorResponseInfo(responseInfoArgumentCaptor.capture(), eq(errorResponseInfoMock)); ResponseInfo<ErrorResponseBody> responseInfoPassedIntoSetupMethod = responseInfoArgumentCaptor.getValue(); assertThat(response, is(responseInfoPassedIntoSetupMethod)); }
ResponseInfo<ErrorResponseBody> responseInfo = processError(state, null, cause);
ResponseInfo<ErrorResponseBody> responseInfo = processError(state, null, cause);
Throwable cause = new Exception("intentional test exception"); ResponseInfo<ErrorResponseBody> errorResponseMock = mock(ResponseInfo.class); doReturn(errorResponseMock).when(handlerSpy).processError(state, null, cause); assertThat(state.getResponseInfo(), nullValue()); verify(handlerSpy).processError(state, null, cause); assertThat(state.getResponseInfo(), is(errorResponseMock)); Assertions.assertThat(state.getErrorThatTriggeredThisResponse()).isSameAs(cause);