/*
* Copyright 2015 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.kie.server.integrationtests.jbpm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.server.api.model.KieContainerResource;
import org.kie.server.api.model.ReleaseId;
import org.kie.server.api.model.instance.ProcessInstance;
import org.kie.server.api.model.instance.TaskSummary;
import org.kie.server.integrationtests.config.TestConfig;
import org.kie.server.integrationtests.shared.KieServerDeployer;
import static org.junit.Assert.*;
public class RollingUpdateProcessServiceIntegrationTest extends JbpmKieServerBaseIntegrationTest {
private static ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "definition-project",
"1.0.0.Final");
private static final ReleaseId releaseId101 = new ReleaseId("org.kie.server.testing", "definition-project",
"1.0.1.Final");
protected static final String CONTAINER_ALIAS = "project";
protected static final String CONTAINER_ID_101 = "definition-project-101";
@BeforeClass
public static void buildAndDeployArtifacts() {
KieServerDeployer.buildAndDeployCommonMavenParent();
KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/definition-project").getFile());
KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/definition-project-101").getFile());
kieContainer = KieServices.Factory.get().newKieContainer(releaseId);
createContainer(CONTAINER_ID, releaseId, CONTAINER_ALIAS);
}
@After
public void removeExtraContainer() {
abortAllProcesses();
client.disposeContainer(CONTAINER_ID_101);
}
protected void createExtraContainer() {
KieContainerResource containerResource = new KieContainerResource(CONTAINER_ID_101, releaseId101);
containerResource.setContainerAlias(CONTAINER_ALIAS);
client.createContainer(CONTAINER_ID_101, containerResource);
}
@Override
protected void addExtraCustomClasses(Map<String, Class<?>> extraClasses) throws Exception {
extraClasses.put(PERSON_CLASS_NAME, Class.forName(PERSON_CLASS_NAME, true, kieContainer.getClassLoader()));
}
@Test
public void testStartCheckVariablesAndAbortProcess() throws Exception {
Class<?> personClass = Class.forName(PERSON_CLASS_NAME, true, kieContainer.getClassLoader());
Object person = createPersonInstance(USER_JOHN);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("test", USER_MARY);
parameters.put("number", new Integer(12345));
List<Object> list = new ArrayList<Object>();
list.add("item");
parameters.put("list", list);
parameters.put("person", person);
Long processInstanceId = processClient.startProcess(CONTAINER_ALIAS, PROCESS_ID_EVALUATION, parameters);
assertNotNull(processInstanceId);
assertTrue(processInstanceId.longValue() > 0);
ProcessInstance processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceId);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID, processInstance.getContainerId());
Object personVariable = processClient.getProcessInstanceVariable(CONTAINER_ALIAS, processInstanceId, "person");
assertNotNull(personVariable);
assertTrue(personClass.isAssignableFrom(personVariable.getClass()));
personVariable = processClient.getProcessInstanceVariable(CONTAINER_ALIAS, processInstanceId, "person");
assertNotNull(personVariable);
assertTrue(personClass.isAssignableFrom(personVariable.getClass()));
Map<String, Object> variables = processClient.getProcessInstanceVariables(CONTAINER_ALIAS, processInstanceId);
assertNotNull(variables);
assertEquals(5, variables.size());
assertTrue(variables.containsKey("test"));
assertTrue(variables.containsKey("number"));
assertTrue(variables.containsKey("list"));
assertTrue(variables.containsKey("person"));
assertTrue(variables.containsKey("initiator"));
assertNotNull(variables.get("test"));
assertNotNull(variables.get("number"));
assertNotNull(variables.get("list"));
assertNotNull(variables.get("person"));
assertNotNull(variables.get("initiator"));
assertTrue(String.class.isAssignableFrom(variables.get("test").getClass()));
assertTrue(Integer.class.isAssignableFrom(variables.get("number").getClass()));
assertTrue(List.class.isAssignableFrom(variables.get("list").getClass()));
assertTrue(personClass.isAssignableFrom(variables.get("person").getClass()));
assertTrue(String.class.isAssignableFrom(variables.get("initiator").getClass()));
assertEquals(USER_MARY, variables.get("test"));
assertEquals(12345, variables.get("number"));
assertEquals(1, ((List) variables.get("list")).size());
assertEquals("item", ((List) variables.get("list")).get(0));
assertEquals(USER_JOHN, valueOf(variables.get("person"), "name"));
assertEquals(TestConfig.getUsername(), variables.get("initiator"));
}
@Test
public void testStartProcessInDifferentDeploymentWithAlias() throws Exception {
Object person = createPersonInstance(USER_JOHN);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("test", USER_MARY);
parameters.put("number", new Integer(12345));
List<Object> list = new ArrayList<Object>();
list.add("item");
parameters.put("list", list);
parameters.put("person", person);
Long processInstanceIdV1 = processClient.startProcess(CONTAINER_ALIAS, PROCESS_ID_EVALUATION, parameters);
assertNotNull(processInstanceIdV1);
assertTrue(processInstanceIdV1.longValue() > 0);
ProcessInstance processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceIdV1);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID, processInstance.getContainerId());
List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10);
assertEquals(1, tasks.size());
TaskSummary task = tasks.get(0);
assertEquals(CONTAINER_ID, task.getContainerId());
taskClient.completeAutoProgress(CONTAINER_ALIAS, task.getId(), USER_YODA, null);
createExtraContainer();
Long processInstanceIdV2 = processClient.startProcess(CONTAINER_ALIAS, PROCESS_ID_EVALUATION_2, parameters);
assertNotNull(processInstanceIdV2);
assertTrue(processInstanceIdV2.longValue() > 0);
processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceIdV2);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID_101, processInstance.getContainerId());
tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10);
assertEquals(1, tasks.size());
task = tasks.get(0);
assertEquals(CONTAINER_ID_101, task.getContainerId());
taskClient.completeAutoProgress(CONTAINER_ALIAS, task.getId(), USER_YODA, null);
}
@Test
public void testStartProcessInDifferentDeploymentWithContainerId() throws Exception {
Object person = createPersonInstance(USER_JOHN);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("test", USER_MARY);
parameters.put("number", new Integer(12345));
List<Object> list = new ArrayList<Object>();
list.add("item");
parameters.put("list", list);
parameters.put("person", person);
Long processInstanceIdV1 = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters);
assertNotNull(processInstanceIdV1);
assertTrue(processInstanceIdV1.longValue() > 0);
ProcessInstance processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceIdV1);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID, processInstance.getContainerId());
List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10);
assertEquals(1, tasks.size());
TaskSummary task = tasks.get(0);
assertEquals(CONTAINER_ID, task.getContainerId());
taskClient.completeAutoProgress(CONTAINER_ALIAS, task.getId(), USER_YODA, null);
createExtraContainer();
Long processInstanceIdV2 = processClient.startProcess(CONTAINER_ID_101, PROCESS_ID_EVALUATION_2, parameters);
assertNotNull(processInstanceIdV2);
assertTrue(processInstanceIdV2.longValue() > 0);
processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceIdV2);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID_101, processInstance.getContainerId());
tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10);
assertEquals(1, tasks.size());
task = tasks.get(0);
assertEquals(CONTAINER_ID_101, task.getContainerId());
taskClient.completeAutoProgress(CONTAINER_ALIAS, task.getId(), USER_YODA, null);
// let's start another instance of the old version of container
Long processInstanceIdV3 = processClient.startProcess(CONTAINER_ID, PROCESS_ID_EVALUATION, parameters);
assertNotNull(processInstanceIdV3);
assertTrue(processInstanceIdV3.longValue() > 0);
processInstance = processClient.getProcessInstance(CONTAINER_ALIAS, processInstanceIdV3);
assertNotNull(processInstance);
assertEquals(CONTAINER_ID, processInstance.getContainerId());
tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10);
assertEquals(2, tasks.size());
task = tasks.get(0);
assertEquals(CONTAINER_ID, task.getContainerId());
taskClient.completeAutoProgress(CONTAINER_ALIAS, task.getId(), USER_YODA, null);
}
}