package org.springframework.cloud;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.springframework.cloud.CloudTestUtil.getTestCloudConnector;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import org.springframework.cloud.service.UriBasedServiceInfo;
import org.springframework.cloud.service.ServiceConnectorCreator;
import org.springframework.cloud.service.ServiceInfo;
import org.springframework.cloud.service.common.MongoServiceInfo;
import org.springframework.cloud.service.common.MysqlServiceInfo;
import org.springframework.cloud.service.common.AmqpServiceInfo;
import org.springframework.cloud.service.common.RedisServiceInfo;
import org.springframework.cloud.service.common.RelationalServiceInfo;
import org.springframework.cloud.service.relational.MysqlDataSourceCreator;
/**
* Test cases for service properties
*
* @author Ramnivas Laddad
* @author Chris Schaefer
*/
public class CloudTest extends StubCloudConnectorTest {
private List<ServiceConnectorCreator<?, ? extends ServiceInfo>> serviceCreators;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
serviceCreators = new ArrayList<ServiceConnectorCreator<?, ? extends ServiceInfo>>();
serviceCreators.add(new MysqlDataSourceCreator());
}
@Test
public void serviceConnectorCreation() {
String serviceId = "mysql-db";
CloudConnector stubCloudConnector = getTestCloudConnector(createMysqlService(serviceId));
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
DataSource serviceConnector = testCloud.getServiceConnector(serviceId, DataSource.class, null);
assertNotNull(serviceConnector);
}
@Test
public void serviceInfosForConnectorType() {
String serviceId = "mysql-db";
CloudConnector stubCloudConnector = getTestCloudConnector(createMysqlService(serviceId));
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
List<ServiceInfo> serviceInfos = testCloud.getServiceInfos(DataSource.class);
assertEquals(1, serviceInfos.size());
}
@Test
public void servicePropsTwoServicesOfTheSameLabel() {
MysqlServiceInfo mysqlServiceInfo1 = createMysqlService("my-mysql1");
MysqlServiceInfo mysqlServiceInfo2 = createMysqlService("my-mysql2");
CloudConnector stubCloudConnector = getTestCloudConnector(mysqlServiceInfo1, mysqlServiceInfo2);
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
Properties cloudProperties = testCloud.getCloudProperties();
assertRelationalProps("cloud.services.my-mysql1", mysqlServiceInfo1, cloudProperties);
assertRelationalProps("cloud.services.my-mysql2", mysqlServiceInfo2, cloudProperties);
assertNull(cloudProperties.get("cloud.services.mysql.connection.host"));
}
@Test
public void servicePropsOneServiceOfTheSameLabel() {
MysqlServiceInfo mysqlServiceInfo = createMysqlService("my-mysql");
MongoServiceInfo mongoServiceInfo = createMongoService("my-mongo");
CloudConnector stubCloudConnector = getTestCloudConnector(mysqlServiceInfo, mongoServiceInfo);
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
Properties cloudProperties = testCloud.getCloudProperties();
assertRelationalProps("cloud.services.my-mysql", mysqlServiceInfo, cloudProperties);
assertMongoProps("cloud.services.my-mongo", mongoServiceInfo, cloudProperties);
assertRelationalProps("cloud.services.mysql", mysqlServiceInfo, cloudProperties);
assertMongoProps("cloud.services.mongo", mongoServiceInfo, cloudProperties);
}
@Test
public void servicePropsRedis() {
String serviceId = "my-redis";
RedisServiceInfo redisServiceInfo = createRedisService(serviceId);
CloudConnector stubCloudConnector = getTestCloudConnector(redisServiceInfo);
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
Properties cloudProperties = testCloud.getCloudProperties();
assertBasicProps("cloud.services.my-redis", redisServiceInfo, cloudProperties);
assertBasicProps("cloud.services.redis", redisServiceInfo, cloudProperties);
}
@Test
public void servicePropsRabbit() {
String serviceId = "my-rabbit";
AmqpServiceInfo rabbitServiceInfo = createRabbitService(serviceId);
CloudConnector stubCloudConnector = getTestCloudConnector(rabbitServiceInfo);
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
Properties cloudProperties = testCloud.getCloudProperties();
assertRabbitProps("cloud.services.my-rabbit", rabbitServiceInfo, cloudProperties);
assertRabbitProps("cloud.services.rabbitmq", rabbitServiceInfo, cloudProperties);
}
@Test
public void servicePropsMongoMultipleHostsUriString() {
String serviceId = "my-mongo-multiple-hosts-uri";
MongoServiceInfo mongoServiceInfo = createMongoServiceWithMultipleHostsByUri(serviceId);
CloudConnector stubCloudConnector = getTestCloudConnector(mongoServiceInfo);
Cloud testCloud = new Cloud(stubCloudConnector, serviceCreators);
Properties cloudProperties = testCloud.getCloudProperties();
assertMongoPropsWithMultipleHostsByUri("cloud.services.my-mongo-multiple-hosts-uri", mongoServiceInfo, cloudProperties);
assertMongoPropsWithMultipleHostsByUri("cloud.services.mongo", mongoServiceInfo, cloudProperties);
}
private void assertMongoPropsWithMultipleHostsByUri(String leadKey, MongoServiceInfo serviceInfo, Properties cloudProperties) {
assertEquals(serviceInfo.getId(), cloudProperties.get(leadKey + ".id"));
assertEquals(serviceInfo.getUri(), cloudProperties.get(leadKey + ".connection.uri"));
assertEquals(-1, cloudProperties.get(leadKey + ".connection.port"));
assertNull(cloudProperties.get(leadKey + ".connection.host"));
assertNull(cloudProperties.get(leadKey + ".connection.username"));
assertNull(cloudProperties.get(leadKey + ".connection.password"));
}
private void assertBasicProps(String leadKey, UriBasedServiceInfo serviceInfo, Properties cloudProperties) {
assertEquals(serviceInfo.getId(), cloudProperties.get(leadKey + ".id"));
assertEquals(serviceInfo.getUri(), cloudProperties.get(leadKey + ".connection.uri"));
assertEquals(serviceInfo.getHost(), cloudProperties.get(leadKey + ".connection.host"));
assertEquals(serviceInfo.getPort(), cloudProperties.get(leadKey + ".connection.port"));
assertEquals(serviceInfo.getUserName(), cloudProperties.get(leadKey + ".connection.username"));
assertEquals(serviceInfo.getPassword(), cloudProperties.get(leadKey + ".connection.password"));
}
private void assertRelationalProps(String leadKey, RelationalServiceInfo serviceInfo, Properties cloudProperties) {
assertBasicProps(leadKey, serviceInfo, cloudProperties);
assertEquals(serviceInfo.getJdbcUrl(), cloudProperties.get(leadKey + ".connection.jdbcurl"));
}
private void assertMongoProps(String leadKey, MongoServiceInfo serviceInfo, Properties cloudProperties) {
assertBasicProps(leadKey, serviceInfo, cloudProperties);
}
private void assertRabbitProps(String leadKey, AmqpServiceInfo serviceInfo, Properties cloudProperties) {
assertBasicProps(leadKey, serviceInfo, cloudProperties);
}
}