package org.springframework.cloud;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.springframework.cloud.CloudConnector;
import org.springframework.cloud.app.ApplicationInstanceInfo;
import org.springframework.cloud.service.CompositeServiceInfo;
import org.springframework.cloud.service.UriBasedServiceInfo;
import org.springframework.cloud.service.ServiceInfo;
import org.springframework.cloud.service.ServiceInfo.ServiceLabel;
/**
* Class to support testing.
*
* <p>
* NOTE: This class isn't meant to be consumed by end applications. However, it is added here (instead of in src/main/test)
* to allow plugins to use this common testing infrastructure.
* </p>
*
* @author Ramnivas Laddad
*
*/
public class CloudTestUtil {
public static class StubCloudConnector implements CloudConnector {
private List<ServiceInfo> serviceInfos = new ArrayList<ServiceInfo>();
private ApplicationInstanceInfo applicationInstance = new StubApplicationInstanceInfo("default-app-instance", "default-app", Collections.<String, Object> emptyMap());
@Override
public boolean isInMatchingCloud() {
return true;
}
@Override
public ApplicationInstanceInfo getApplicationInstanceInfo() {
return applicationInstance;
}
@Override
public List<ServiceInfo> getServiceInfos() {
return serviceInfos ;
}
// Methods to set test environment
public void addServiceInfo(ServiceInfo info) {
serviceInfos.add(info);
}
public void setApplicationInstance(ApplicationInstanceInfo applicationInstance) {
this.applicationInstance = applicationInstance;
}
}
static public class StubApplicationInstanceInfo implements ApplicationInstanceInfo {
private String instanceId;
private String appId;
private Map<String, Object> properties;
public StubApplicationInstanceInfo(String instanceId, String appId, Map<String, Object> properties) {
this.instanceId = instanceId;
this.appId = appId;
this.properties = properties;
}
@Override
public String getInstanceId() {
return instanceId;
}
@Override
public String getAppId() {
return appId;
}
@Override
public Map<String, Object> getProperties() {
return properties;
}
}
@ServiceLabel("stub")
public static class StubServiceInfo extends UriBasedServiceInfo {
public StubServiceInfo(String id, String host, int port, String username, String password) {
super(id, "stub", host, port, username, password, null);
}
// To test the scenario, where the name attribute of a property is explicitly specified
@ServiceProperty(name="bar")
public String getFoo() {
return "foo";
}
}
public static class StubCompositeServiceInfo implements CompositeServiceInfo {
private String id;
private List<ServiceInfo> constituents;
public StubCompositeServiceInfo(String id, ServiceInfo... constituents) {
this.id = id;
this.constituents = Arrays.asList(constituents);
}
@Override
public String getId() {
return id;
}
@Override
public List<ServiceInfo> getServiceInfos() {
return constituents;
}
}
public static StubCloudConnector getTestCloudConnector(ApplicationInstanceInfo applicationInstanceInfo, ServiceInfo... serviceInfos) {
final StubCloudConnector stubCloudConnector = getTestCloudConnector(serviceInfos);
stubCloudConnector.setApplicationInstance(applicationInstanceInfo);
return stubCloudConnector;
}
public static StubCloudConnector getTestCloudConnector(ServiceInfo... serviceInfos) {
final StubCloudConnector stubCloudConnector = new StubCloudConnector();
for (ServiceInfo serviceInfo: serviceInfos) {
stubCloudConnector.addServiceInfo(serviceInfo);
}
return stubCloudConnector;
}
public static void assertBasicProps(String leadKey, UriBasedServiceInfo serviceInfo, Properties cloudProperties) {
assertEquals(serviceInfo.getId(), cloudProperties.get(leadKey + ".id"));
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"));
}
}