package peal.impl;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;
import betsy.common.tasks.WaitTasks;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import peal.DeploymentException;
import peal.InstanceService;
import peal.ProcessLanguage;
import peal.ProcessModelService;
import peal.helper.ZipFileHelper;
import peal.identifier.EngineId;
import peal.identifier.InstanceId;
import peal.identifier.ProcessModelId;
import peal.impl.engine.EngineServiceImpl;
import peal.impl.instance.InstanceServiceImpl;
import peal.impl.processmodel.ProcessModelServiceImpl;
import peal.observer.EngineState;
import peal.observer.InstanceState;
import peal.observer.ProcessModelState;
import peal.packages.DeploymentPackage;
import peal.packages.LogPackage;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
public class EngineServiceImplBpmnEnginesTest extends AbstractEngineServiceCleanup{
public static final Path SEQUENCE_FOLDER = Paths.get("src/test/resources/SequenceFlow");
private final EngineId engineId;
private final ProcessModelId processModelId;
EngineServiceImpl engineService = new EngineServiceImpl();
ProcessModelService processModelService = new ProcessModelServiceImpl(engineService);
InstanceService instanceService = new InstanceServiceImpl(engineService);
public EngineServiceImplBpmnEnginesTest(EngineId engineId) {
this.engineId = Objects.requireNonNull(engineId);
this.processModelId = new ProcessModelId(engineId.getEngineId(),
new QName("http://dsg.wiai.uniba.de/betsy/activities/bpel/sequence", "SequenceFlow"));
}
@Test
public void testAll() throws IOException, DeploymentException {
if (engineService.getSupportedLanguage(engineId) != ProcessLanguage.BPMN) {
return;
}
assertState(ProcessModelState.NOT_DEPLOYED);
assertState(EngineState.NOT_INSTALLED);
engineService.install(engineId);
assertState(ProcessModelState.NOT_DEPLOYED);
assertState(EngineState.INSTALLED);
engineService.start(engineId);
WaitTasks.sleep(2000);
assertState(ProcessModelState.NOT_DEPLOYED);
assertState(EngineState.STARTED);
DeploymentPackage deployableBpelPackage = processModelService.makeDeployable(engineId,
ZipFileHelper.zipToProcessModelPackage(ZipFileHelper.buildFromFolder(SEQUENCE_FOLDER)));
System.out.println("FILE EXTENSION: " + deployableBpelPackage.fileExtension);
assertState(ProcessModelState.NOT_DEPLOYED);
assertState(EngineState.STARTED);
ProcessModelId processModelId = processModelService.deploy(engineId, deployableBpelPackage);
assertState(ProcessModelState.DEPLOYED);
assertState(EngineState.STARTED);
WaitTasks.sleep(2000);
List<peal.Variable> variables = Arrays.asList(new peal.Variable("testCaseNumber", "Integer", new Integer(1)),
new peal.Variable("integerVariable", "Integer", new Integer(0)));
InstanceId instanceId = instanceService.start(processModelId, variables);
assertState(ProcessModelState.DEPLOYED);
assertState(EngineState.STARTED);
WaitTasks.sleep(2000);
LogPackage instanceLogs = instanceService.getLogs(instanceId);
Path instanceLogFile = ZipFileHelper.extractIntoTemporaryFolder(instanceLogs).resolve("log-" + processModelId.getProcessId().getLocalPart() + "-1.txt");
assertEquals(Collections.singletonList("SCRIPT_task1"), Files.readAllLines(instanceLogFile));
assertState(InstanceState.STOPPED, instanceId);
processModelService.undeploy(processModelId);
WaitTasks.sleep(2000);
assertState(ProcessModelState.NOT_DEPLOYED);
assertState(EngineState.STARTED);
engineService.stop(engineId);
WaitTasks.sleep(5000);
assertState(EngineState.INSTALLED);
assertState(ProcessModelState.NOT_DEPLOYED);
engineService.uninstall(engineId);
assertState(EngineState.NOT_INSTALLED);
assertState(ProcessModelState.NOT_DEPLOYED);
}
private void assertState(InstanceState stopped, InstanceId instanceId) {
instanceService.getState(instanceId);
}
private void assertState(EngineState engineState) {
assertEquals(engineState, engineService.getState(engineId));
}
private void assertState(ProcessModelState engineState) {
assertEquals(engineState, processModelService.getState(processModelId));
}
@Parameterized.Parameters(name = "{index} {0}")
public static Iterable<Object[]> data() {
return new EngineServiceImpl().getSupportedEngines().stream()
.filter(p -> new EngineServiceImpl().getSupportedLanguage(p).equals(ProcessLanguage.BPMN))
.map(p -> new Object[] {p})
.collect(Collectors.toList());
}
@Override public EngineId getEngineId() {
return engineId;
}
}