/*
* Copyright 2011-2017 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.cloudfoundry.reconfiguration.play;
import org.cloudfoundry.reconfiguration.util.Sets;
import org.junit.After;
import org.junit.Test;
import org.springframework.cloud.Cloud;
import org.springframework.cloud.service.ServiceInfo;
import org.springframework.cloud.service.common.MysqlServiceInfo;
import org.springframework.cloud.service.common.PostgresqlServiceInfo;
import org.springframework.cloud.service.common.RelationalServiceInfo;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Properties;
import static org.mockito.Mockito.mock;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
public final class StandardPropertySetterTest {
private final Cloud cloud = mock(Cloud.class);
private final StandardPropertySetter propertySetter = new StandardPropertySetter(this.cloud);
@After
public void tearDown() {
for (Iterator<Object> i = System.getProperties().keySet().iterator(); i.hasNext(); ) {
String key = (String) i.next();
if (key.startsWith("cloud.services") || key.startsWith("applyEvolutions")) {
i.remove();
}
}
}
@Test
public void setCloudPropertiesMultipleMysql() {
Properties cloudProperties = new Properties();
cloudProperties.put("cloud.services.alpha.connection.username", "alpha-user");
cloudProperties.put("cloud.services.alpha.connection.name", "alpha-database");
cloudProperties.put("cloud.services.postgresql.connection.name", "alpha-database");
when(this.cloud.getCloudProperties()).thenReturn(cloudProperties);
RelationalServiceInfo alpha = new PostgresqlServiceInfo("alpha",
"postgres://alpha-user:alpha-password@127.0.0.1:4321/alpha-database");
RelationalServiceInfo bravo = new MysqlServiceInfo("bravo",
"mysql://bravo-user:bravo-password@127.0.0.1:4321/bravo-database");
RelationalServiceInfo charlie = new MysqlServiceInfo("charlie",
"mysql://charlie-user:charlie-password@127.0.0.1:4321/charlie-database");
when(this.cloud.getServiceInfos(DataSource.class)).thenReturn(Arrays.<ServiceInfo>asList(alpha, bravo,
charlie));
this.propertySetter.setCloudProperties();
assertCloudServiceSystemProperty("alpha.connection.username", "alpha-user");
assertCloudServiceSystemProperty("alpha.connection.name", "alpha-database");
assertCloudServiceSystemProperty("postgresql.connection.name", "alpha-database");
assertCloudServiceSystemProperty("alpha.connection.driver", PropertySetter.POSTGRES_DRIVER_CLASS);
assertCloudServiceSystemProperty("postgresql.connection.driver", PropertySetter.POSTGRES_DRIVER_CLASS);
assertCloudServiceSystemProperty("alpha.connection.jdbcUrl", alpha.getJdbcUrl());
assertCloudServiceSystemProperty("postgresql.connection.jdbcUrl", alpha.getJdbcUrl());
assertCloudServiceSystemProperty("bravo.connection.driver", PropertySetter.MYSQL_DRIVER_CLASS);
assertCloudServiceSystemProperty("bravo.connection.jdbcUrl", bravo.getJdbcUrl());
assertCloudServiceSystemProperty("charlie.connection.driver", PropertySetter.MYSQL_DRIVER_CLASS);
assertCloudServiceSystemProperty("charlie.connection.jdbcUrl", charlie.getJdbcUrl());
assertCloudServicesSystemPropertyNull("mysql.connection.driver");
assertCloudServicesSystemPropertyNull("mysql.connection.jdbcUrl");
}
@Test
public void setCloudPropertiesMultiplePostgres() {
Properties cloudProperties = new Properties();
cloudProperties.put("cloud.services.alpha.connection.username", "alpha-user");
cloudProperties.put("cloud.services.alpha.connection.name", "alpha-database");
cloudProperties.put("cloud.services.mysql.connection.name", "alpha-database");
when(this.cloud.getCloudProperties()).thenReturn(cloudProperties);
RelationalServiceInfo alpha = new MysqlServiceInfo("alpha",
"mysql://alpha-user:alpha-password@127.0.0.1:4321/alpha-database");
RelationalServiceInfo bravo = new PostgresqlServiceInfo("bravo",
"postgres://bravo-user:bravo-password@127.0.0.1:4321/bravo-database");
RelationalServiceInfo charlie = new PostgresqlServiceInfo("charlie",
"postgres://charlie-user:charlie-password@127.0.0.1:4321/charlie-database");
when(this.cloud.getServiceInfos(DataSource.class)).thenReturn(Arrays.<ServiceInfo>asList(alpha, bravo,
charlie));
this.propertySetter.setCloudProperties();
assertCloudServiceSystemProperty("alpha.connection.username", "alpha-user");
assertCloudServiceSystemProperty("alpha.connection.name", "alpha-database");
assertCloudServiceSystemProperty("mysql.connection.name", "alpha-database");
assertCloudServiceSystemProperty("alpha.connection.driver", PropertySetter.MYSQL_DRIVER_CLASS);
assertCloudServiceSystemProperty("mysql.connection.driver", PropertySetter.MYSQL_DRIVER_CLASS);
assertCloudServiceSystemProperty("alpha.connection.jdbcUrl", alpha.getJdbcUrl());
assertCloudServiceSystemProperty("mysql.connection.jdbcUrl", alpha.getJdbcUrl());
assertCloudServiceSystemProperty("bravo.connection.driver", PropertySetter.POSTGRES_DRIVER_CLASS);
assertCloudServiceSystemProperty("bravo.connection.jdbcUrl", bravo.getJdbcUrl());
assertCloudServiceSystemProperty("charlie.connection.driver", PropertySetter.POSTGRES_DRIVER_CLASS);
assertCloudServiceSystemProperty("charlie.connection.jdbcUrl", charlie.getJdbcUrl());
assertCloudServicesSystemPropertyNull("postgresql.connection.driver");
assertCloudServicesSystemPropertyNull("postgresql.connection.jdbcUrl");
}
@Test
public void setDatabaseProperties() {
this.propertySetter.setDatabaseProperties(Sets.asSet("default", "other"));
assertSystemProperty("applyEvolutions.default", true);
assertSystemProperty("applyEvolutions.other", true);
}
private void assertCloudServiceSystemProperty(String key, Object value) {
assertSystemProperty(String.format("cloud.services.%s", key), value);
}
private void assertCloudServicesSystemPropertyNull(String key) {
assertNull(System.getProperty(String.format("cloud.services.%s", key)));
}
private void assertSystemProperty(String key, Object value) {
assertEquals(value.toString(), System.getProperty(key));
}
}