use of com.nike.riposte.server.error.handler.ErrorResponseBody in project riposte by Nike-Inc.
the class ExceptionHandlingHandler method processUnhandledError.
/**
* Produces a generic error response. Call this if you know the error is a non-normal unhandled error of the "how
* did we get here, this should never happen" variety, or if other attempts to deal with the error failed and you
* need a guaranteed fallback that will produce a generic error response that follows our error contract. If you
* have an error that happened during normal processing you should try {@link #processError(HttpProcessingState,
* Object, Throwable)} instead in order to get an error response that is better tailored to the given error rather
* than this one which guarantees a somewhat unhelpful generic error response.
*/
ResponseInfo<ErrorResponseBody> processUnhandledError(HttpProcessingState state, Object msg, Throwable cause) throws JsonProcessingException {
RequestInfo<?> requestInfo = getRequestInfo(state, msg);
// Run the error through the riposteUnhandledErrorHandler
ErrorResponseInfo contentFromErrorHandler = riposteUnhandledErrorHandler.handleError(cause, requestInfo);
ResponseInfo<ErrorResponseBody> responseInfo = new FullResponseInfo<>();
setupResponseInfoBasedOnErrorResponseInfo(responseInfo, contentFromErrorHandler);
return responseInfo;
}
use of com.nike.riposte.server.error.handler.ErrorResponseBody in project riposte by Nike-Inc.
the class ExceptionHandlingHandlerTest method setupResponseInfoBasedOnErrorResponseInfo_sets_response_content_and_httpStatusCode_and_adds_extra_headers.
@Test
public void setupResponseInfoBasedOnErrorResponseInfo_sets_response_content_and_httpStatusCode_and_adds_extra_headers() {
// given
ResponseInfo<ErrorResponseBody> responseInfo = new FullResponseInfo<>();
ErrorResponseBody errorResponseBodyMock = mock(ErrorResponseBody.class);
int httpStatusCode = 42;
Map<String, List<String>> extraHeaders = new HashMap<>();
extraHeaders.put("key1", Arrays.asList("foo", "bar"));
extraHeaders.put("key2", Arrays.asList("baz"));
ErrorResponseInfo errorInfoMock = mock(ErrorResponseInfo.class);
doReturn(errorResponseBodyMock).when(errorInfoMock).getErrorResponseBody();
doReturn(httpStatusCode).when(errorInfoMock).getErrorHttpStatusCode();
doReturn(extraHeaders).when(errorInfoMock).getExtraHeadersToAddToResponse();
// when
handler.setupResponseInfoBasedOnErrorResponseInfo(responseInfo, errorInfoMock);
// then
assertThat(responseInfo.getContentForFullResponse(), is(errorResponseBodyMock));
assertThat(responseInfo.getHttpStatusCode(), is(httpStatusCode));
int numIndividualValuesInHeaderMap = extraHeaders.entrySet().stream().map(entry -> entry.getValue()).mapToInt(list -> list.size()).sum();
assertThat(responseInfo.getHeaders().entries().size(), is(numIndividualValuesInHeaderMap));
extraHeaders.entrySet().stream().forEach(expectedEntry -> assertThat(responseInfo.getHeaders().getAll(expectedEntry.getKey()), is(expectedEntry.getValue())));
}
use of com.nike.riposte.server.error.handler.ErrorResponseBody in project riposte by Nike-Inc.
the class ExceptionHandlingHandlerTest method processError_returns_value_of_processUnhandledError_if_riposteErrorHandler_explodes.
@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));
}
use of com.nike.riposte.server.error.handler.ErrorResponseBody in project riposte by Nike-Inc.
the class ExceptionHandlingHandlerTest method processUnhandledError_uses_getRequestInfo_and_calls_riposteUnhandledErrorHandler_and_returns_value_of_setupResponseInfoBasedOnErrorResponseInfo.
@Test
public void processUnhandledError_uses_getRequestInfo_and_calls_riposteUnhandledErrorHandler_and_returns_value_of_setupResponseInfoBasedOnErrorResponseInfo() throws JsonProcessingException, UnexpectedMajorErrorHandlingError {
// 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);
doReturn(requestInfoMock).when(handlerSpy).getRequestInfo(stateMock, msg);
doReturn(errorResponseInfoMock).when(riposteUnhandledErrorHandlerMock).handleError(cause, requestInfoMock);
// when
ResponseInfo<ErrorResponseBody> response = handlerSpy.processUnhandledError(stateMock, msg, cause);
// then
verify(handlerSpy).getRequestInfo(stateMock, msg);
verify(riposteUnhandledErrorHandlerMock).handleError(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));
}
use of com.nike.riposte.server.error.handler.ErrorResponseBody in project riposte by Nike-Inc.
the class ExceptionHandlingHandlerTest method doExceptionCaught_should_call_getStateAndCreateIfNeeded_and_then_processError_and_then_set_response_on_state_and_return_CONTINUE.
@Test
public void doExceptionCaught_should_call_getStateAndCreateIfNeeded_and_then_processError_and_then_set_response_on_state_and_return_CONTINUE() throws Exception {
// 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));
assertThat(result, is(PipelineContinuationBehavior.CONTINUE));
}
Aggregations