/*
* Copyright 2013-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cloud.aws.autoconfigure.jdbc;
import com.amazonaws.services.rds.AmazonRDS;
import com.amazonaws.services.rds.AmazonRDSClient;
import com.amazonaws.services.rds.model.DBInstance;
import com.amazonaws.services.rds.model.DescribeDBInstancesRequest;
import com.amazonaws.services.rds.model.DescribeDBInstancesResult;
import com.amazonaws.services.rds.model.Endpoint;
import org.junit.After;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.cloud.aws.jdbc.rds.AmazonRdsDataSourceFactoryBean;
import org.springframework.cloud.aws.jdbc.rds.AmazonRdsReadReplicaAwareDataSourceFactoryBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
public class AmazonRdsDatabaseAutoConfigurationTest {
private AnnotationConfigApplicationContext context;
@After
public void tearDown() throws Exception {
if (this.context != null) {
this.context.close();
}
}
@Test
public void configureBean_withDefaultClientSpecifiedAndNoReadReplica_configuresFactoryBeanWithoutReadReplica() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
this.context.register(ApplicationConfigurationWithoutReadReplica.class);
this.context.register(AmazonRdsDatabaseAutoConfiguration.class);
EnvironmentTestUtils.addEnvironment(this.context, "cloud.aws.rds.test.password:secret");
//Act
this.context.refresh();
//Assert
assertNotNull(this.context.getBean(DataSource.class));
assertNotNull(this.context.getBean(AmazonRdsDataSourceFactoryBean.class));
}
@Test
public void configureBean_withCustomDataBaseName_configuresFactoryBeanWithCustomDatabaseName() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
this.context.register(ApplicationConfigurationWithoutReadReplica.class);
this.context.register(AmazonRdsDatabaseAutoConfiguration.class);
EnvironmentTestUtils.addEnvironment(this.context, "cloud.aws.rds.test.password:secret",
"cloud.aws.rds.test.databaseName:fooDb");
//Act
this.context.refresh();
//Assert
DataSource dataSource = this.context.getBean(DataSource.class);
assertNotNull(dataSource);
assertNotNull(this.context.getBean(AmazonRdsDataSourceFactoryBean.class));
assertTrue(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource);
assertTrue(((org.apache.tomcat.jdbc.pool.DataSource) dataSource).getUrl().endsWith("fooDb"));
}
@Test
public void configureBean_withDefaultClientSpecifiedAndNoReadReplicaAndMultipleDatabases_configuresBothDatabases() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
this.context.register(ApplicationConfigurationWithMultipleDatabases.class);
this.context.register(AmazonRdsDatabaseAutoConfiguration.class);
EnvironmentTestUtils.addEnvironment(this.context, "cloud.aws.rds.test.password:secret", "cloud.aws.rds.anotherOne.password:verySecret");
//Act
this.context.refresh();
//Assert
assertNotNull(this.context.getBean("test", DataSource.class));
assertNotNull(this.context.getBean("&test", AmazonRdsDataSourceFactoryBean.class));
assertNotNull(this.context.getBean("anotherOne", DataSource.class));
assertNotNull(this.context.getBean("&anotherOne", AmazonRdsDataSourceFactoryBean.class));
}
@Test
public void configureBean_withDefaultClientSpecifiedAndReadReplica_configuresFactoryBeanWithReadReplicaEnabled() throws Exception {
//Arrange
this.context = new AnnotationConfigApplicationContext();
this.context.register(ApplicationConfigurationWithReadReplica.class);
this.context.register(AmazonRdsDatabaseAutoConfiguration.class);
EnvironmentTestUtils.addEnvironment(this.context, "cloud.aws.rds.test.password:secret",
"cloud.aws.rds.test.readReplicaSupport:true");
//Act
this.context.refresh();
//Assert
assertNotNull(this.context.getBean(DataSource.class));
assertNotNull(this.context.getBean(AmazonRdsReadReplicaAwareDataSourceFactoryBean.class));
}
public static class ApplicationConfigurationWithoutReadReplica {
@Bean
public AmazonRDSClient amazonRDS() {
AmazonRDSClient client = Mockito.mock(AmazonRDSClient.class);
when(client.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier("test"))).thenReturn(
new DescribeDBInstancesResult().
withDBInstances(new DBInstance().
withDBInstanceStatus("available").
withDBName("test").
withDBInstanceIdentifier("test").
withEngine("mysql").
withMasterUsername("admin").
withEndpoint(new Endpoint().
withAddress("localhost").
withPort(3306)
).withReadReplicaDBInstanceIdentifiers("read1")
)
);
return client;
}
}
public static class ApplicationConfigurationWithMultipleDatabases {
@Bean
public AmazonRDS amazonRDS() {
AmazonRDSClient client = Mockito.mock(AmazonRDSClient.class);
when(client.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier("test"))).thenReturn(
new DescribeDBInstancesResult().
withDBInstances(new DBInstance().
withDBInstanceStatus("available").
withDBName("test").
withDBInstanceIdentifier("test").
withEngine("mysql").
withMasterUsername("admin").
withEndpoint(new Endpoint().
withAddress("localhost").
withPort(3306)
)
)
);
when(client.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier("anotherOne"))).thenReturn(
new DescribeDBInstancesResult().
withDBInstances(new DBInstance().
withDBInstanceStatus("available").
withDBName("test").
withDBInstanceIdentifier("anotherOne").
withEngine("mysql").
withMasterUsername("admin").
withEndpoint(new Endpoint().
withAddress("localhost").
withPort(3306)
)
)
);
return client;
}
}
public static class ApplicationConfigurationWithReadReplica {
@Bean
public AmazonRDS amazonRDS() {
AmazonRDSClient client = Mockito.mock(AmazonRDSClient.class);
when(client.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier("test"))).thenReturn(
new DescribeDBInstancesResult().
withDBInstances(new DBInstance().
withDBInstanceStatus("available").
withDBName("test").
withDBInstanceIdentifier("test").
withEngine("mysql").
withMasterUsername("admin").
withEndpoint(new Endpoint().
withAddress("localhost").
withPort(3306)
).withReadReplicaDBInstanceIdentifiers("read1")
)
);
when(client.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier("read1"))).thenReturn(
new DescribeDBInstancesResult().
withDBInstances(new DBInstance().
withDBInstanceStatus("available").
withDBName("read1").
withDBInstanceIdentifier("read1").
withEngine("mysql").
withMasterUsername("admin").
withEndpoint(new Endpoint().
withAddress("localhost").
withPort(3306)
)
)
);
return client;
}
}
}