@Override public Response toResponse(UserException exception) { final String errorMessage = exception.getErrorType() == ErrorType.SYSTEM ? SYSTEM_ERROR_MSG : exception.getOriginalMessage(); return Response.status(getStatus(exception)) .entity(new ErrorMessageWithContext( errorMessage, removeStatus(exception.getContextStrings()), sendStackTrace ? GenericErrorMessage.printStackTrace(exception): null )) .type(APPLICATION_JSON_TYPE) .build(); }
@Test public void testBuildSystemException() { String message = "This is an exception"; UserException uex = UserException.systemError(new Exception(new RuntimeException(message))).build(logger); Assert.assertTrue(uex.getOriginalMessage().contains(message)); Assert.assertTrue(uex.getOriginalMessage().contains("RuntimeException")); DremioPBError error = uex.getOrCreatePBError(true); Assert.assertEquals(ErrorType.SYSTEM, error.getErrorType()); }
public void bad(String passwd, String err) throws Exception { try { SimpleUserService.validatePassword(passwd); fail("Password '" + passwd + "' should not be accepted."); } catch (UserException e) { assertEquals("Expected a VALIDATION error but got " + e.getErrorType(), ErrorType.VALIDATION, e.getErrorType()); assertTrue("Unexpected error message", e.getOriginalMessage().contains(err)); } }
@Test public void testBuildUserExceptionWithCause() { String message = "Test message"; UserException uex = UserException.dataWriteError(new RuntimeException(message)).build(logger); DremioPBError error = uex.getOrCreatePBError(false); // cause message should be used Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType()); Assert.assertEquals(message, uex.getOriginalMessage()); }
@Test public void testBuildUserExceptionWithFormattedMessage() { String format = "This is test #%d"; UserException uex = UserException.connectionError().message(format, 5).build(logger); DremioPBError error = uex.getOrCreatePBError(false); Assert.assertEquals(ErrorType.CONNECTION, error.getErrorType()); Assert.assertEquals(String.format(format, 5), uex.getOriginalMessage()); }
@Test public void testInvalidIsDatePattern() throws Exception { try { test("SELECT IS_DATE(\"date\", 'yummy') FROM cp.\"/is_date.json\""); fail("Query expected to fail"); } catch (UserException uex) { assertEquals(ErrorType.FUNCTION, uex.getErrorType()); assertEquals("Failure parsing the formatting string at column 1 of: yummy", uex.getOriginalMessage()); } }
@Test public void testInvalidIsTimePattern() throws Exception { try { test("SELECT IS_TIME(\"time\", 'yummy') FROM cp.\"/is_time.json\""); fail("Query expected to fail"); } catch (UserException uex) { assertEquals(ErrorType.FUNCTION, uex.getErrorType()); assertEquals("Failure parsing the formatting string at column 1 of: yummy", uex.getOriginalMessage()); } }
@Test public void testBuildUserExceptionWithCauseAndMessage() { String messageA = "Test message A"; String messageB = "Test message B"; UserException uex = UserException.dataWriteError(new RuntimeException(messageA)).message(messageB).build(logger); DremioPBError error = uex.getOrCreatePBError(false); // passed message should override the cause message Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType()); Assert.assertEquals(messageB, uex.getOriginalMessage()); }
@Test public void testInvalidIsTimestampPattern() throws Exception { try { test("SELECT IS_TIMESTAMP(\"time\", 'yummy') FROM cp.\"/is_time.json\""); fail("Query expected to fail"); } catch (UserException uex) { assertEquals(ErrorType.FUNCTION, uex.getErrorType()); assertEquals("Failure parsing the formatting string at column 1 of: yummy", uex.getOriginalMessage()); } }
@Test public void testBuildUserExceptionWithMessage() { String message = "Test message"; UserException uex = UserException.dataWriteError().message(message).build(logger); DremioPBError error = uex.getOrCreatePBError(false); Assert.assertEquals(ErrorType.DATA_WRITE, error.getErrorType()); Assert.assertEquals(message, uex.getOriginalMessage()); }
@Test public void testBuildUserExceptionWithUserExceptionCauseAndMessage() { String messageA = "Test message A"; String messageB = "Test message B"; UserException original = UserException.connectionError().message(messageA).build(logger); UserException uex = UserException.dataWriteError(wrap(original, 5)).message(messageB).build(logger); //builder should return the unwrapped original user exception and not build a new one Assert.assertEquals(original, uex); DremioPBError error = uex.getOrCreatePBError(false); Assert.assertEquals(messageA, uex.getOriginalMessage()); Assert.assertFalse(error.getMessage().contains(messageB)); // messageB should not be part of the context }
/** * returns or creates a DremioPBError object corresponding to this user exception. * * @param verbose should the error object contain the verbose error message ? * @return protobuf error object */ public DremioPBError getOrCreatePBError(final boolean verbose) { final DremioPBError.Builder builder = DremioPBError.newBuilder(); builder.setErrorType(errorType); builder.setErrorId(context.getErrorId()); if (context.getEndpoint() != null) { builder.setEndpoint(context.getEndpoint()); } builder.setMessage(getVerboseMessage()); builder.setOriginalMessage(getOriginalMessage()); if (getCause() != null) { // some unit tests use this information to make sure a specific exception was thrown in the server builder.setException(ErrorHelper.getWrapper(getCause())); } builder.addAllContext(context.getContextAsStrings()); if (rawAdditionalContext != null) { builder.setTypeSpecificContext(rawAdditionalContext); } return builder.build(); }