package org.ow2.choreos.ee.bus;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.ow2.choreos.chors.datamodel.Choreography;
import org.ow2.choreos.chors.datamodel.LegacyService;
import org.ow2.choreos.chors.datamodel.LegacyServiceInstance;
import org.ow2.choreos.chors.datamodel.LegacyServiceSpec;
import org.ow2.choreos.ee.bus.ESBNodesSelector;
import org.ow2.choreos.ee.bus.EasyESBNode;
import org.ow2.choreos.ee.bus.EasyESBNodeImpl;
import org.ow2.choreos.ee.bus.ProxificationTask;
import org.ow2.choreos.ee.bus.selector.ESBNodeSelector;
import org.ow2.choreos.nodes.datamodel.ResourceImpact;
import org.ow2.choreos.services.datamodel.PackageType;
import org.ow2.choreos.services.datamodel.ServiceInstance;
import org.ow2.choreos.services.datamodel.ServiceType;
import org.ow2.choreos.tests.ModelsForTest;
public class ESBNodesSelectorTest {
private static final String ESB_ADMIN_ENDPOINT = "http://localhost:8180/services/adminExternalEndpoint";
private static final String BANK_ENDPOINT = "http://bank.com/ws";
private Choreography chor;
private ServiceInstance airlineInstance, travelInstance;
private LegacyServiceInstance bankInstance;
private EasyESBNode esbNode = new EasyESBNodeImpl(ESB_ADMIN_ENDPOINT);
private ESBNodeSelector esbNodeSelectorMock;
@Before
public void setUp() throws Exception {
ModelsForTest models = new ModelsForTest(ServiceType.SOAP, PackageType.COMMAND_LINE);
chor = models.getChoreography();
airlineInstance = models.getAirlineService().getInstances().get(0);
travelInstance = models.getTravelService().getInstances().get(0);
esbNodeSelectorMock = mock(ESBNodeSelector.class);
List<EasyESBNode> esbNodes = Collections.singletonList(esbNode);
when(esbNodeSelectorMock.select(any(ResourceImpact.class), anyInt())).thenReturn(esbNodes);
}
@Test
public void shouldReturnProxificationTasksForEachServiceSpec() {
ESBNodesSelector selector = new ESBNodesSelector();
selector.setSelector(esbNodeSelectorMock);
List<ProxificationTask> tasks = selector.selectESBNodes(chor);
assertEquals(2, tasks.size());
verifyDeployableServicesProxification(tasks);
}
private void verifyDeployableServicesProxification(List<ProxificationTask> tasks) {
List<String> names = new ArrayList<String>();
List<String> uris = new ArrayList<String>();
for (ProxificationTask task : tasks) {
names.add(task.getSvcName());
uris.add(task.getNativeUri());
assertEquals(ESB_ADMIN_ENDPOINT, task.getEasyEsbNode().getAdminEndpoint());
}
assertTrue(names.contains(airlineInstance.getServiceSpec().getName()));
assertTrue(names.contains(travelInstance.getServiceSpec().getName()));
assertTrue(uris.contains(airlineInstance.getNativeUri()));
assertTrue(uris.contains(travelInstance.getNativeUri()));
}
@Test
public void shouldReturnProxificationTasksForEachServiceSpecIncludingLegacyServices() {
addLegacyServiceToChorSpec();
ESBNodesSelector selector = new ESBNodesSelector();
selector.setSelector(esbNodeSelectorMock);
List<ProxificationTask> tasks = selector.selectESBNodes(chor);
assertEquals(3, tasks.size());
verifyDeployableServicesProxification(tasks);
verifyLegacyServicesProxification(tasks);
}
private void addLegacyServiceToChorSpec() {
LegacyServiceSpec bankSpec = new LegacyServiceSpec();
List<String> bankUris = Collections.singletonList(BANK_ENDPOINT);
bankSpec.setName("bank");
bankSpec.setRoles(Collections.singletonList("bank"));
bankSpec.setServiceType(ServiceType.SOAP);
bankSpec.setNativeURIs(bankUris);
LegacyService bankService = new LegacyService(bankSpec);
chor.getChoreographySpec().addServiceSpec(bankSpec);
chor.addService(bankService);
bankInstance = bankService.getLegacyServiceInstances().get(0);
}
private void verifyLegacyServicesProxification(List<ProxificationTask> tasks) {
List<String> names = new ArrayList<String>();
List<String> uris = new ArrayList<String>();
for (ProxificationTask task : tasks) {
names.add(task.getSvcName());
uris.add(task.getNativeUri());
}
assertTrue(names.contains(bankInstance.getSpec().getName()));
assertTrue(uris.contains(bankInstance.getUri()));
}
}