@Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(getMessage()); sb.append("\n"); for (final String line : stackTrace) { sb.append(line); sb.append("\n"); } return sb.toString(); }
@Override public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof KsqlErrorMessage)) { return false; } final KsqlErrorMessage that = (KsqlErrorMessage) o; return Objects.equals(getMessage(), that.getMessage()) && Objects.equals(getStackTrace(), that.getStackTrace()); }
@Override public int hashCode() { return Objects.hash(getMessage(), getStackTrace()); } }
@Override protected boolean matchesSafely( final KsqlErrorMessage actual, final Description mismatchDescription ) { if (!expected.matches(actual.getMessage())) { mismatchDescription.appendText("but message "); expected.describeMismatch(actual.getMessage(), mismatchDescription); return false; } return true; }
@Test public void shouldFailForIncorrectCTASStatementResultType() { // When: final KsqlErrorMessage result = makeFailingRequest( "CREATE TABLE s1 AS SELECT * FROM test_stream;", Code.BAD_REQUEST); // Then: assertThat(result.getMessage(), containsString( "Invalid result type. Your SELECT query produces a STREAM. " + "Please use CREATE STREAM AS SELECT statement instead.\n" + "Statement: " + "CREATE TABLE s1 AS SELECT * FROM test_stream;")); }
@Test public void shouldFailForIncorrectDropTableStatement() { // When: final KsqlErrorMessage result = makeFailingRequest( "DROP STREAM test_table;", Code.BAD_REQUEST); // Then: assertThat(result.getMessage().toLowerCase(), is("incompatible data source type is table, but statement was drop stream")); }
@Test public void shouldFailForIncorrectDropStreamStatement() { // When: final KsqlErrorMessage result = makeFailingRequest( "DROP TABLE test_stream;", Code.BAD_REQUEST); // Then: assertThat(result.getMessage().toLowerCase(), is("incompatible data source type is stream, but statement was drop table")); }
@Test public void shouldFailSetPropertyOnInvalidPropertyName() { // When: final KsqlErrorMessage response = makeFailingRequest( "SET 'ksql.unknown.property' = '1';", Code.BAD_REQUEST); // Then: assertThat(response, instanceOf(KsqlStatementErrorMessage.class)); assertThat(response.getErrorCode(), is(Errors.ERROR_CODE_BAD_STATEMENT)); assertThat(response.getMessage(), containsString("Unknown property")); }
@Test public void shouldFailIfCreateStatementMissingKafkaTopicName() { // When: final KsqlErrorMessage result = makeFailingRequest( "CREATE STREAM S (foo INT) WITH(VALUE_FORMAT='JSON');", Code.BAD_REQUEST); // Then: assertThat(result, is(instanceOf(KsqlStatementErrorMessage.class))); assertThat(result.getErrorCode(), is(Errors.ERROR_CODE_BAD_STATEMENT)); assertThat(result.getMessage(), is("Corresponding Kafka topic (KAFKA_TOPIC) should be set in WITH clause.")); assertThat(((KsqlStatementErrorMessage) result).getStatementText(), is("CREATE STREAM S (foo INT) WITH(VALUE_FORMAT='JSON');")); }
@Test public void shouldFailUnsetPropertyOnInvalidPropertyName() { // When: final KsqlErrorMessage response = makeFailingRequest( "UNSET 'ksql.unknown.property';", Code.BAD_REQUEST); // Then: assertThat(response, instanceOf(KsqlStatementErrorMessage.class)); assertThat(response.getErrorCode(), is(Errors.ERROR_CODE_BAD_STATEMENT)); assertThat(response.getMessage(), containsString("Unknown property")); }
@Test public void shouldReportErrorOnNonQueryExplain() { // Given: final String ksqlQueryString = "SHOW TOPICS;"; final String ksqlString = "EXPLAIN " + ksqlQueryString; // When: final KsqlErrorMessage result = makeFailingRequest( ksqlString, Code.BAD_REQUEST); // Then: assertThat(result.getErrorCode(), is(Errors.ERROR_CODE_BAD_STATEMENT)); assertThat(result.getMessage(), is("The provided statement does not run a ksql query")); }
@Test public void shouldReturnCorrectResponseForUnspecificException() { final Response response = exceptionMapper.toResponse(new Exception("error msg")); assertThat(response.getEntity(), instanceOf(KsqlErrorMessage.class)); final KsqlErrorMessage errorMessage = (KsqlErrorMessage)response.getEntity(); assertThat(errorMessage.getMessage(), equalTo("error msg")); assertThat(errorMessage.getErrorCode(), equalTo(Errors.ERROR_CODE_SERVER_ERROR)); assertThat(response.getStatus(), equalTo(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())); } }
@Test public void testGetStatusNotFound() throws Exception { final StatusResource testResource = getTestStatusResource(); final Response response = testResource.getStatus( CommandId.Type.STREAM.name(), "foo", CommandId.Action.CREATE.name()); assertThat(response.getStatus(), equalTo(Response.Status.NOT_FOUND.getStatusCode())); assertThat(response.getEntity(), instanceOf(KsqlErrorMessage.class)); final KsqlErrorMessage errorMessage = (KsqlErrorMessage)response.getEntity(); assertThat(errorMessage.getErrorCode(), equalTo(Errors.ERROR_CODE_NOT_FOUND)); assertThat(errorMessage.getMessage(), equalTo("Command not found")); } }
@Test public void shouldHandleErrorMessageOnGetRequests() { // Given: givenServerWillReturn(new KsqlErrorMessage(12300, "ouch", ImmutableList.of("s1", "s2"))); // When: final RestResponse<?> response = ksqlRestClient.getServerInfo(); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(12300)); assertThat(response.getErrorMessage().getMessage(), is("ouch")); assertThat(response.getErrorMessage().getStackTrace(), is(ImmutableList.of("s1", "s2"))); }
@Test public void shouldHandleArbitraryErrorsOnGetRequests() { // Given: givenServerWillReturn(Status.EXPECTATION_FAILED); // When: final RestResponse<?> response = ksqlRestClient.getServerInfo(); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(Errors.toErrorCode(Status.EXPECTATION_FAILED.getStatusCode()))); assertThat(response.getErrorMessage().getMessage(), is("The server returned an unexpected error.")); }
@Test public void shouldHandleUnauthorizedOnGetRequests() { // Given: givenServerWillReturn(Status.UNAUTHORIZED); // When: final RestResponse<?> response = ksqlRestClient.getServerInfo(); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(Errors.ERROR_CODE_UNAUTHORIZED)); assertThat(response.getErrorMessage().getMessage(), is("Could not authenticate successfully with the supplied credentials.")); }
@Test public void shouldHandleForbiddenOnPostRequests() { // Given: givenServerWillReturn(Status.FORBIDDEN); // When: final RestResponse<?> response = ksqlRestClient.makeKsqlRequest("whateva"); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(Errors.ERROR_CODE_FORBIDDEN)); assertThat(response.getErrorMessage().getMessage(), is("You are forbidden from using this cluster.")); }
@Test public void shouldHandleNotFoundOnPostRequests() { // Given: givenServerWillReturn(Status.NOT_FOUND); // When: final RestResponse<?> response = ksqlRestClient.makeKsqlRequest("whateva"); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(404)); assertThat(response.getErrorMessage().getMessage(), containsString("Path not found. Path='ksql'. " + "Check your ksql http url to make sure you are connecting to a ksql server.")); }
@Test public void shouldHandleUnauthorizedOnPostRequests() { // Given: givenServerWillReturn(Status.UNAUTHORIZED); // When: final RestResponse<?> response = ksqlRestClient.makeKsqlRequest("whateva"); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(Errors.ERROR_CODE_UNAUTHORIZED)); assertThat(response.getErrorMessage().getMessage(), is("Could not authenticate successfully with the supplied credentials.")); }
@Test public void shouldHandleForbiddendOnGetRequests() { // Given: givenServerWillReturn(Status.FORBIDDEN); // When: final RestResponse<?> response = ksqlRestClient.getServerInfo(); // Then: assertThat(response.getErrorMessage().getErrorCode(), is(Errors.ERROR_CODE_FORBIDDEN)); assertThat(response.getErrorMessage().getMessage(), is("You are forbidden from using this cluster.")); }