Search in sources :

Example 1 with ErrorResponseBody

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;
}
Also used : ErrorResponseInfo(com.nike.riposte.server.error.handler.ErrorResponseInfo) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) FullResponseInfo(com.nike.riposte.server.http.impl.FullResponseInfo)

Example 2 with ErrorResponseBody

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())));
}
Also used : CoreMatchers.is(org.hamcrest.CoreMatchers.is) Arrays(java.util.Arrays) ResponseInfo(com.nike.riposte.server.http.ResponseInfo) DataProviderRunner(com.tngtech.java.junit.dataprovider.DataProviderRunner) DO_NOT_FIRE_CONTINUE_EVENT(com.nike.riposte.server.handler.base.PipelineContinuationBehavior.DO_NOT_FIRE_CONTINUE_EVENT) Collections.singletonList(java.util.Collections.singletonList) CoreMatchers.notNullValue(org.hamcrest.CoreMatchers.notNullValue) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) Mockito.doThrow(org.mockito.Mockito.doThrow) DefaultHttpRequest(io.netty.handler.codec.http.DefaultHttpRequest) Matchers.eq(org.mockito.Matchers.eq) Map(java.util.Map) ErrorResponseInfo(com.nike.riposte.server.error.handler.ErrorResponseInfo) Assertions(org.assertj.core.api.Assertions) Mockito.doReturn(org.mockito.Mockito.doReturn) RiposteErrorHandler(com.nike.riposte.server.error.handler.RiposteErrorHandler) IncompleteHttpCallTimeoutException(com.nike.riposte.server.error.exception.IncompleteHttpCallTimeoutException) HttpRequest(io.netty.handler.codec.http.HttpRequest) UUID(java.util.UUID) TooManyOpenChannelsException(com.nike.riposte.server.error.exception.TooManyOpenChannelsException) Matchers.any(org.mockito.Matchers.any) List(java.util.List) Whitebox(org.mockito.internal.util.reflection.Whitebox) ChannelAttributes(com.nike.riposte.server.channelpipeline.ChannelAttributes) Mockito.mock(org.mockito.Mockito.mock) HttpProcessingState(com.nike.riposte.server.http.HttpProcessingState) FullResponseInfo(com.nike.riposte.server.http.impl.FullResponseInfo) UnexpectedMajorErrorHandlingError(com.nike.riposte.server.error.exception.UnexpectedMajorErrorHandlingError) RequestInfo(com.nike.riposte.server.http.RequestInfo) HttpVersion(io.netty.handler.codec.http.HttpVersion) RunWith(org.junit.runner.RunWith) CoreMatchers.not(org.hamcrest.CoreMatchers.not) HashMap(java.util.HashMap) PipelineContinuationBehavior(com.nike.riposte.server.handler.base.PipelineContinuationBehavior) Mockito.spy(org.mockito.Mockito.spy) DataProvider(com.tngtech.java.junit.dataprovider.DataProvider) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) ArgumentCaptor(org.mockito.ArgumentCaptor) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) CoreMatchers.nullValue(org.hamcrest.CoreMatchers.nullValue) Before(org.junit.Before) Attribute(io.netty.util.Attribute) UseDataProvider(com.tngtech.java.junit.dataprovider.UseDataProvider) HttpMethod(io.netty.handler.codec.http.HttpMethod) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Test(org.junit.Test) Mockito.times(org.mockito.Mockito.times) Mockito.verify(org.mockito.Mockito.verify) Channel(io.netty.channel.Channel) RiposteUnhandledErrorHandler(com.nike.riposte.server.error.handler.RiposteUnhandledErrorHandler) Mockito.never(org.mockito.Mockito.never) ErrorResponseInfo(com.nike.riposte.server.error.handler.ErrorResponseInfo) HashMap(java.util.HashMap) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) Collections.singletonList(java.util.Collections.singletonList) List(java.util.List) FullResponseInfo(com.nike.riposte.server.http.impl.FullResponseInfo) Test(org.junit.Test)

Example 3 with ErrorResponseBody

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));
}
Also used : HttpProcessingState(com.nike.riposte.server.http.HttpProcessingState) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) IncompleteHttpCallTimeoutException(com.nike.riposte.server.error.exception.IncompleteHttpCallTimeoutException) TooManyOpenChannelsException(com.nike.riposte.server.error.exception.TooManyOpenChannelsException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Test(org.junit.Test)

Example 4 with ErrorResponseBody

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));
}
Also used : ResponseInfo(com.nike.riposte.server.http.ResponseInfo) ErrorResponseInfo(com.nike.riposte.server.error.handler.ErrorResponseInfo) FullResponseInfo(com.nike.riposte.server.http.impl.FullResponseInfo) ErrorResponseInfo(com.nike.riposte.server.error.handler.ErrorResponseInfo) HttpProcessingState(com.nike.riposte.server.http.HttpProcessingState) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) IncompleteHttpCallTimeoutException(com.nike.riposte.server.error.exception.IncompleteHttpCallTimeoutException) TooManyOpenChannelsException(com.nike.riposte.server.error.exception.TooManyOpenChannelsException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Test(org.junit.Test)

Example 5 with ErrorResponseBody

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));
}
Also used : PipelineContinuationBehavior(com.nike.riposte.server.handler.base.PipelineContinuationBehavior) ErrorResponseBody(com.nike.riposte.server.error.handler.ErrorResponseBody) IncompleteHttpCallTimeoutException(com.nike.riposte.server.error.exception.IncompleteHttpCallTimeoutException) TooManyOpenChannelsException(com.nike.riposte.server.error.exception.TooManyOpenChannelsException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) Test(org.junit.Test)

Aggregations

ErrorResponseBody (com.nike.riposte.server.error.handler.ErrorResponseBody)24 Test (org.junit.Test)18 HttpProcessingState (com.nike.riposte.server.http.HttpProcessingState)9 JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)8 IncompleteHttpCallTimeoutException (com.nike.riposte.server.error.exception.IncompleteHttpCallTimeoutException)6 TooManyOpenChannelsException (com.nike.riposte.server.error.exception.TooManyOpenChannelsException)6 ErrorResponseInfo (com.nike.riposte.server.error.handler.ErrorResponseInfo)6 FullResponseInfo (com.nike.riposte.server.http.impl.FullResponseInfo)6 PipelineContinuationBehavior (com.nike.riposte.server.handler.base.PipelineContinuationBehavior)5 RequestInfo (com.nike.riposte.server.http.RequestInfo)5 List (java.util.List)5 ErrorResponseInfo (com.nike.backstopper.handler.ErrorResponseInfo)4 ResponseInfo (com.nike.riposte.server.http.ResponseInfo)4 RequestInfoForLogging (com.nike.backstopper.handler.RequestInfoForLogging)3 DefaultErrorContractDTO (com.nike.backstopper.model.DefaultErrorContractDTO)2 ErrorResponseBodyImpl (com.nike.backstopper.model.riposte.ErrorResponseBodyImpl)2 ErrorResponseInfoImpl (com.nike.backstopper.model.riposte.ErrorResponseInfoImpl)2 ChannelAttributes (com.nike.riposte.server.channelpipeline.ChannelAttributes)2 RiposteErrorHandler (com.nike.riposte.server.error.handler.RiposteErrorHandler)2 UseDataProvider (com.tngtech.java.junit.dataprovider.UseDataProvider)2