Commit 9483c91d authored by Stephane Nicoll's avatar Stephane Nicoll

Make sure to include validation query in case of failure

See gh-15055
parent 745ff883
......@@ -110,12 +110,16 @@ public class DataSourceHealthIndicator extends AbstractHealthIndicator
builder.up().withDetail("database", product);
String validationQuery = getValidationQuery(product);
if (StringUtils.hasText(validationQuery)) {
// Avoid calling getObject as it breaks MySQL on Java 7
List<Object> results = this.jdbcTemplate.query(validationQuery,
new SingleColumnRowMapper());
Object result = DataAccessUtils.requiredSingleResult(results);
builder.withDetail("result", result);
builder.withDetail("validationQuery", validationQuery);
try {
// Avoid calling getObject as it breaks MySQL on Java 7
List<Object> results = this.jdbcTemplate.query(validationQuery,
new SingleColumnRowMapper());
Object result = DataAccessUtils.requiredSingleResult(results);
builder.withDetail("result", result);
}
finally {
builder.withDetail("validationQuery", validationQuery);
}
}
}
......
......@@ -32,6 +32,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
......@@ -41,6 +42,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link DataSourceHealthIndicator}.
*
* @author Dave Syer
* @author Stephane Nicoll
*/
public class DataSourceHealthIndicatorTests {
......@@ -64,41 +66,45 @@ public class DataSourceHealthIndicatorTests {
}
@Test
public void database() {
public void healthIndicatorWithDefaultSettings() {
this.indicator.setDataSource(this.dataSource);
Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull();
assertThat(health.getDetails().get("result")).isNotNull();
assertThat(health.getDetails().get("validationQuery"))
.isEqualTo(DatabaseDriver.HSQLDB.getValidationQuery());
assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails()).containsOnly(
entry("database", "HSQL Database Engine"), entry("result", 1L),
entry("validationQuery", DatabaseDriver.HSQLDB.getValidationQuery()));
}
@Test
public void customQuery() {
this.indicator.setDataSource(this.dataSource);
public void healthIndicatorWithCustomValidationQuery() {
String customValidationQuery = "SELECT COUNT(*) from FOO";
new JdbcTemplate(this.dataSource)
.execute("CREATE TABLE FOO (id INTEGER IDENTITY PRIMARY KEY)");
String customValidationQuery = "SELECT COUNT(*) from FOO";
this.indicator.setDataSource(this.dataSource);
this.indicator.setQuery(customValidationQuery);
Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull();
assertThat(health.getStatus()).isEqualTo(Status.UP);
assertThat(health.getDetails().get("result")).isNotNull();
assertThat(health.getDetails().get("validationQuery"))
.isEqualTo(customValidationQuery);
assertThat(health.getDetails()).containsOnly(
entry("database", "HSQL Database Engine"), entry("result", 0L),
entry("validationQuery", customValidationQuery));
}
@Test
public void error() {
public void healthIndicatorWithInvalidValidationQuery() {
String invalidValidationQuery = "SELECT COUNT(*) from BAR";
this.indicator.setDataSource(this.dataSource);
this.indicator.setQuery("SELECT COUNT(*) from BAR");
this.indicator.setQuery(invalidValidationQuery);
Health health = this.indicator.health();
assertThat(health.getDetails().get("database")).isNotNull();
assertThat(health.getStatus()).isEqualTo(Status.DOWN);
assertThat(health.getDetails()).contains(
entry("database", "HSQL Database Engine"),
entry("validationQuery", invalidValidationQuery));
assertThat(health.getDetails()).containsOnlyKeys("database", "error",
"validationQuery");
}
@Test
public void connectionClosed() throws Exception {
public void healthIndicatorCloseConnection() throws Exception {
DataSource dataSource = mock(DataSource.class);
Connection connection = mock(Connection.class);
given(connection.getMetaData())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment