package org.springframework.cloud.config.java;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.cloud.service.PooledServiceConnectorConfig.PoolConfig;
import org.springframework.cloud.service.relational.BasicDbcpPooledDataSourceCreator;
import org.springframework.cloud.service.relational.DataSourceConfig;
import org.springframework.cloud.service.relational.DataSourceConfig.ConnectionConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperties;
import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertConnectionProperty;
import static org.springframework.cloud.config.DataSourceCloudConfigTestHelper.assertPoolProperties;
/**
* Common base class for testing datasource-related Java config
*
* @author Ramnivas Laddad
*
*/
public abstract class DataSourceJavaConfigTest extends AbstractServiceJavaConfigTest<DataSource> {
protected abstract String getDriverClassName();
protected abstract String getValidationQuery();
public DataSourceJavaConfigTest() {
super(DatasourceConfigWithId.class, DatasourceConfigWithoutId.class);
}
protected Class<DataSource> getConnectorType() {
return DataSource.class;
}
// Mixed relational services test (mysql+postgresql)
@Test(expected=BeanCreationException.class)
public void cloudDataSourceWithoutServiceNameSpecified_TwoMixedServiceExist_byType() {
ApplicationContext testContext = getTestApplicationContextWithoutServiceId(
createMysqlService("my-service"), createPostgresqlService("my-service-2"));
testContext.getBean("my-service", getConnectorType());
}
@Test(expected=BeanCreationException.class)
public void cloudDataSourceWithoutServiceNameSpecified_TwoMixedServiceExist_byId() {
ApplicationContext testContext = getTestApplicationContextWithoutServiceId(
createMysqlService("my-service"), createPostgresqlService("my-service-2"));
testContext.getBean(getConnectorType());
}
@Test
public void cloudDataSourceWithNoConfig() {
ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class,
createService("my-service"));
DataSource ds = testContext.getBean("dataSourceWithNoConfig", getConnectorType());
assertConnectionProperties(ds, null);
assertConnectionProperty(ds, "driverClassName", getDriverClassName());
assertConnectionProperty(ds, "validationQuery", getValidationQuery());
}
@Test
public void cloudDataSourceWithMaxPool() {
ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class,
createService("my-service"));
DataSource ds = testContext.getBean("dataSourceWithPoolAndConnectionConfig", getConnectorType());
assertPoolProperties(ds, 20, 0, 200);
Properties connectionProp = new Properties();
connectionProp.put("sessionVariables", "sql_mode='ANSI'");
connectionProp.put("characterEncoding", "UTF-8");
assertConnectionProperties(ds, connectionProp);
}
@Test
public void cloudDataSourceWithMinMaxPool() {
ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class,
createService("my-service"));
DataSource ds = testContext.getBean("dataSourceWithPoolConfig", getConnectorType());
assertPoolProperties(ds, 30, 5, 3000);
}
@Test
public void cloudDataSourceWithConnectionProperties() {
ApplicationContext testContext = getTestApplicationContext(DatasourceConfigWithServiceConfig.class,
createService("my-service"));
DataSource ds = testContext.getBean("dataSourceWithConnectionPropertiesConfig", getConnectorType());
assertConnectionProperty(ds, "driverClassName", "test.driver");
assertConnectionProperty(ds, "validationQuery", "test validation query");
assertConnectionProperty(ds, "testOnBorrow", false);
}
}
class DatasourceConfigWithId extends AbstractCloudConfig {
@Bean(name="my-service")
public DataSource testDatasource() {
return connectionFactory().dataSource("my-service");
}
}
class DatasourceConfigWithoutId extends AbstractCloudConfig {
@Bean(name="my-service")
public DataSource testDatasource() {
return connectionFactory().dataSource();
}
}
class DatasourceConfigWithServiceConfig extends AbstractCloudConfig {
@Bean
public DataSource dataSourceWithNoConfig() {
return connectionFactory().dataSource("my-service");
}
@Bean
public DataSource dataSourceWithPoolAndConnectionConfig() {
PoolConfig poolConfig = new PoolConfig(20, 200);
ConnectionConfig connectionConfig = new ConnectionConfig("sessionVariables=sql_mode='ANSI';characterEncoding=UTF-8");
DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig, basicDbcpConnectionPool());
return connectionFactory().dataSource("my-service", serviceConfig);
}
@Bean
public DataSource dataSourceWithPoolConfig() {
PoolConfig poolConfig = new PoolConfig(5, 30, 3000);
DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, null, basicDbcpConnectionPool());
return connectionFactory().dataSource("my-service", serviceConfig);
}
@Bean
public DataSource dataSourceWithConnectionPropertiesConfig() {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("driverClassName", "test.driver");
properties.put("validationQuery", "test validation query");
properties.put("testOnBorrow", false);
DataSourceConfig serviceConfig = new DataSourceConfig(null, null, basicDbcpConnectionPool(), properties);
return connectionFactory().dataSource("my-service", serviceConfig);
}
private List<String> basicDbcpConnectionPool() {
return Collections.singletonList(BasicDbcpPooledDataSourceCreator.class.getSimpleName());
}
}