package io.dropwizard.db; import com.google.common.io.Resources; import io.dropwizard.configuration.YamlConfigurationFactory; import io.dropwizard.jackson.Jackson; import io.dropwizard.jersey.validation.Validators; import io.dropwizard.util.Duration; import org.junit.Test; import java.io.File; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; public class DataSourceConfigurationTest { @Test public void testFullConfiguration() throws Exception { DataSourceFactory ds = getDataSourceFactory("yaml/full_db_pool.yml"); assertThat(ds.getDriverClass()).isEqualTo("org.postgresql.Driver"); assertThat(ds.getUser()).isEqualTo("pg-user"); assertThat(ds.getUrl()).isEqualTo("jdbc:postgresql://db.example.com/db-prod"); assertThat(ds.getPassword()).isEqualTo("iAMs00perSecrEET"); assertThat(ds.getProperties()).containsEntry("charSet", "UTF-8"); assertThat(ds.getMaxWaitForConnection()).isEqualTo(Duration.seconds(1)); assertThat(ds.getValidationQuery()).isEqualTo("/* MyService Health Check */ SELECT 1"); assertThat(ds.getMinSize()).isEqualTo(8); assertThat(ds.getInitialSize()).isEqualTo(15); assertThat(ds.getMaxSize()).isEqualTo(32); assertThat(ds.getCheckConnectionWhileIdle()).isFalse(); assertThat(ds.getEvictionInterval()).isEqualTo(Duration.seconds(10)); assertThat(ds.getMinIdleTime()).isEqualTo(Duration.minutes(1)); assertThat(ds.getValidationInterval()).isEqualTo(Duration.minutes(1)); assertThat(ds.isAutoCommentsEnabled()).isFalse(); assertThat(ds.getReadOnlyByDefault()).isFalse(); assertThat(ds.isRemoveAbandoned()).isTrue(); assertThat(ds.getRemoveAbandonedTimeout()).isEqualTo(Duration.seconds(15L)); assertThat(ds.getAbandonWhenPercentageFull()).isEqualTo(75); assertThat(ds.isAlternateUsernamesAllowed()).isTrue(); assertThat(ds.getCommitOnReturn()).isTrue(); assertThat(ds.getRollbackOnReturn()).isTrue(); assertThat(ds.getAutoCommitByDefault()).isFalse(); assertThat(ds.getDefaultCatalog()).isEqualTo("test_catalog"); assertThat(ds.getDefaultTransactionIsolation()) .isEqualTo(DataSourceFactory.TransactionIsolation.READ_COMMITTED); assertThat(ds.getUseFairQueue()).isFalse(); assertThat(ds.getInitializationQuery()).isEqualTo("insert into connections_log(ts) values (now())"); assertThat(ds.getLogAbandonedConnections()).isEqualTo(true); assertThat(ds.getLogValidationErrors()).isEqualTo(true); assertThat(ds.getMaxConnectionAge()).isEqualTo(Optional.of(Duration.hours(1))); assertThat(ds.getCheckConnectionOnBorrow()).isEqualTo(true); assertThat(ds.getCheckConnectionOnConnect()).isEqualTo(false); assertThat(ds.getCheckConnectionOnReturn()).isEqualTo(true); assertThat(ds.getValidationQueryTimeout()).isEqualTo(Optional.of(Duration.seconds(3))); assertThat(ds.getValidatorClassName()).isEqualTo(Optional.of("io.dropwizard.db.CustomConnectionValidator")); assertThat(ds.getJdbcInterceptors()).isEqualTo(Optional.of("StatementFinalizer;SlowQueryReport")); } @Test public void testMinimalConfiguration() throws Exception { DataSourceFactory ds = getDataSourceFactory("yaml/minimal_db_pool.yml"); assertThat(ds.getDriverClass()).isEqualTo("org.postgresql.Driver"); assertThat(ds.getUser()).isEqualTo("pg-user"); assertThat(ds.getUrl()).isEqualTo("jdbc:postgresql://db.example.com/db-prod"); assertThat(ds.getPassword()).isEqualTo("iAMs00perSecrEET"); assertThat(ds.getProperties()).isEmpty(); assertThat(ds.getMaxWaitForConnection()).isEqualTo(Duration.seconds(30)); assertThat(ds.getValidationQuery()).isEqualTo("/* Health Check */ SELECT 1"); assertThat(ds.getMinSize()).isEqualTo(10); assertThat(ds.getInitialSize()).isEqualTo(10); assertThat(ds.getMaxSize()).isEqualTo(100); assertThat(ds.getCheckConnectionWhileIdle()).isTrue(); assertThat(ds.getEvictionInterval()).isEqualTo(Duration.seconds(5)); assertThat(ds.getMinIdleTime()).isEqualTo(Duration.minutes(1)); assertThat(ds.getValidationInterval()).isEqualTo(Duration.seconds(30)); assertThat(ds.isAutoCommentsEnabled()).isTrue(); assertThat(ds.getReadOnlyByDefault()).isNull(); assertThat(ds.isRemoveAbandoned()).isFalse(); assertThat(ds.getRemoveAbandonedTimeout()).isEqualTo(Duration.seconds(60L)); assertThat(ds.getAbandonWhenPercentageFull()).isEqualTo(0); assertThat(ds.isAlternateUsernamesAllowed()).isFalse(); assertThat(ds.getCommitOnReturn()).isFalse(); assertThat(ds.getRollbackOnReturn()).isFalse(); assertThat(ds.getAutoCommitByDefault()).isNull(); assertThat(ds.getDefaultCatalog()).isNull(); assertThat(ds.getDefaultTransactionIsolation()) .isEqualTo(DataSourceFactory.TransactionIsolation.DEFAULT); assertThat(ds.getUseFairQueue()).isTrue(); assertThat(ds.getInitializationQuery()).isNull(); assertThat(ds.getLogAbandonedConnections()).isEqualTo(false); assertThat(ds.getLogValidationErrors()).isEqualTo(false); assertThat(ds.getMaxConnectionAge()).isEqualTo(Optional.empty()); assertThat(ds.getCheckConnectionOnBorrow()).isEqualTo(false); assertThat(ds.getCheckConnectionOnConnect()).isEqualTo(true); assertThat(ds.getCheckConnectionOnReturn()).isEqualTo(false); assertThat(ds.getValidationQueryTimeout()).isEqualTo(Optional.empty()); } @Test public void testInlineUserPasswordConfiguration() throws Exception { DataSourceFactory ds = getDataSourceFactory("yaml/inline_user_pass_db_pool.yml"); assertThat(ds.getDriverClass()).isEqualTo("org.postgresql.Driver"); assertThat(ds.getUrl()).isEqualTo("jdbc:postgresql://db.example.com/db-prod?user=scott&password=tiger"); assertThat(ds.getUser()).isNull(); assertThat(ds.getPassword()).isNull(); } @Test public void testInitialSizeZeroIsAllowed() throws Exception { DataSourceFactory ds = getDataSourceFactory("yaml/empty_initial_pool.yml"); assertThat(ds.getInitialSize()).isEqualTo(0); } private DataSourceFactory getDataSourceFactory(String resourceName) throws Exception { return new YamlConfigurationFactory<>(DataSourceFactory.class, Validators.newValidator(), Jackson.newObjectMapper(), "dw") .build(new File(Resources.getResource(resourceName).toURI())); } }