/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.jbpm.test.container.test.ejbservices.process; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.EJB; import org.assertj.core.api.Assertions; import org.jbpm.services.api.admin.MigrationReport; import org.jbpm.services.ejb.api.admin.ProcessInstanceMigrationServiceEJBLocal; import org.jbpm.test.container.AbstractRuntimeEJBServicesTest; import org.jbpm.test.container.groups.EAP; import org.jbpm.test.container.groups.WAS; import org.jbpm.test.container.groups.WLS; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.kie.api.task.model.TaskSummary; import org.kie.internal.query.QueryFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Category({ EAP.class, WAS.class, WLS.class }) public class EMigrateProcessTest extends AbstractRuntimeEJBServicesTest { private static final Logger LOGGER = LoggerFactory.getLogger(EMigrateProcessTest.class); protected static final String USER_YODA = "yoda"; @EJB protected ProcessInstanceMigrationServiceEJBLocal migrationService; protected static String kieJar2; @Before @Override public void deployKieJar() { if (kieJar == null) { kieJar = archive.deployMigrationV1KieJar().getIdentifier(); } if (kieJar2 == null) { kieJar2 = archive.deployMigrationV2KieJar().getIdentifier(); } } @After @Override public void cleanup() { super.cleanup(); kieJar2 = null; } @Test public void testUpgradeProcessInstance() throws Exception { Long processInstanceId = processService.startProcess(kieJar, EVALUATION_PROCESS_ID_V1); if (processInstanceId != null) { archive.getPids().add(processInstanceId); } List<TaskSummary> tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(1); TaskSummary task = tasks.get(0); Assertions.assertThat(task.getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V1); Assertions.assertThat(task.getProcessInstanceId()).isEqualTo(processInstanceId); // migrate process instance to evaluation 2 in container 2 MigrationReport report = migrationService.migrate(kieJar, processInstanceId, kieJar2, EVALUATION_PROCESS_ID_V2); Assertions.assertThat(report).isNotNull(); Assertions.assertThat(report.isSuccessful()).isTrue(); // it stays in the same task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(1); task = tasks.get(0); Assertions.assertThat(task.getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); Assertions.assertThat(task.getProcessInstanceId()).isEqualTo(processInstanceId); userTaskService.completeAutoProgress(task.getId(), USER_YODA, null); // but next task should be Approve user task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(1); task = tasks.get(0); Assertions.assertThat(task.getName()).isEqualTo("Approve"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); Assertions.assertThat(task.getProcessInstanceId()).isEqualTo(processInstanceId); } @Test public void testUpgradeProcessInstanceWithNodeMapping() throws Exception { Long processInstanceId = processService.startProcess(kieJar, EVALUATION_PROCESS_ID_V1); if (processInstanceId != null) { archive.getPids().add(processInstanceId); } List<TaskSummary> tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(1); TaskSummary task = tasks.get(0); Assertions.assertThat(tasks.get(0).getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V1); Assertions.assertThat(task.getProcessInstanceId()).isEqualTo(processInstanceId); Map<String, String> nodeMapping = new HashMap<String, String>(); nodeMapping.put("_4E8E7545-FB70-494E-9136-2B9ABE655889", "_56FB3E50-DEDD-415B-94DD-0357C91836B9"); // migrate process instance to evaluation 2 in container 2 MigrationReport report = migrationService.migrate(kieJar, processInstanceId, kieJar2, EVALUATION_PROCESS_ID_V2, nodeMapping); Assertions.assertThat(report).isNotNull(); Assertions.assertThat(report.isSuccessful()).isTrue(); // migrated to Approve user task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(1); task = tasks.get(0); Assertions.assertThat(task.getName()).isEqualTo("Approve"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); Assertions.assertThat(task.getProcessInstanceId()).isEqualTo(processInstanceId); } @Test public void testUpgradeProcessInstances() throws Exception { List<Long> ids = new ArrayList<Long>(); for (int i = 0; i < 5; i++) { Long processInstanceId = processService.startProcess(kieJar, EVALUATION_PROCESS_ID_V1); ids.add(processInstanceId); if (processInstanceId != null) { archive.getPids().add(processInstanceId); } } List<TaskSummary> tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(5); for (TaskSummary task : tasks) { Assertions.assertThat(task.getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V1); } // migrate process instance to evaluation 2 in container 2 List<MigrationReport> reports = migrationService.migrate(kieJar, ids, kieJar2, EVALUATION_PROCESS_ID_V2); Assertions.assertThat(reports).isNotNull(); for (MigrationReport report : reports) { Assertions.assertThat(report.isSuccessful()).isTrue(); } // it stays in the same task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(5); for (TaskSummary task : tasks) { Assertions.assertThat(task.getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); userTaskService.completeAutoProgress(task.getId(), USER_YODA, null); } // but next task should be Approve user task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(5); for (TaskSummary task : tasks) { Assertions.assertThat(task.getName()).isEqualTo("Approve"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); } } @Test public void testUpgradeProcessInstancesWithNodeMapping() throws Exception { List<Long> ids = new ArrayList<Long>(); for (int i = 0; i < 5; i++) { Long processInstanceId = processService.startProcess(kieJar, EVALUATION_PROCESS_ID_V1); ids.add(processInstanceId); if (processInstanceId != null) { archive.getPids().add(processInstanceId); } } List<TaskSummary> tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(5); for (TaskSummary task : tasks) { Assertions.assertThat(task.getName()).isEqualTo("Evaluate items"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V1); } Map<String, String> nodeMapping = new HashMap<String, String>(); nodeMapping.put("_4E8E7545-FB70-494E-9136-2B9ABE655889", "_56FB3E50-DEDD-415B-94DD-0357C91836B9"); // migrate process instance to evaluation 2 in container 2 List<MigrationReport> reports = migrationService.migrate(kieJar, ids, kieJar2, EVALUATION_PROCESS_ID_V2, nodeMapping); Assertions.assertThat(reports).isNotNull(); for (MigrationReport report : reports) { Assertions.assertThat(report.isSuccessful()).isTrue(); } // but next task should be Approve user task tasks = runtimeDataService.getTasksAssignedAsPotentialOwner(USER_YODA, new QueryFilter(0, 10)); Assertions.assertThat(tasks.size()).isEqualTo(5); for (TaskSummary task : tasks) { Assertions.assertThat(task.getName()).isEqualTo("Approve"); Assertions.assertThat(task.getDeploymentId()).isEqualTo(kieJar2); Assertions.assertThat(task.getProcessId()).isEqualTo(EVALUATION_PROCESS_ID_V2); } } }