/* * 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 static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.kie.server.api.model.ReleaseId; import org.kie.server.api.model.ServiceResponse; import org.kie.server.api.model.definition.UserTaskDefinition; import org.kie.server.api.model.definition.UserTaskDefinitionList; import org.kie.server.api.model.instance.TaskSummary; import org.kie.server.integrationtests.shared.KieServerAssert; import org.kie.server.integrationtests.shared.KieServerDeployer; public class ContainerUpdateIntegrationTest extends JbpmKieServerBaseIntegrationTest { private static final 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"); @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()); } @Before public void cleanContainers() { disposeAllContainers(); createContainer(CONTAINER_ID, releaseId); } @Test public void testUserTaskWithUpdatedContainer() throws Exception { Long processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK); try { List<TaskSummary> tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(1, tasks.size()); assertEquals("First task", tasks.get(0).getName()); assertTrue("Task should be skippable.", tasks.get(0).getSkipable().booleanValue()); // Update container to new version and restart process. processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); KieServerAssert.assertSuccess(client.updateReleaseId(CONTAINER_ID, releaseId101)); processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK); tasks = taskClient.findTasksAssignedAsPotentialOwner(USER_YODA, 0, 10); assertEquals(1, tasks.size()); assertEquals("Updated first task", tasks.get(0).getName()); assertFalse("Task shouldn't be skippable.", tasks.get(0).getSkipable().booleanValue()); } finally { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } @Test public void testProcessDefinitionWithUpdatedContainer() throws Exception { UserTaskDefinitionList userTaskDefinitions = processClient.getUserTaskDefinitions(CONTAINER_ID, PROCESS_ID_USERTASK); assertEquals(2, userTaskDefinitions.getItems().size()); Map<String, UserTaskDefinition> map = mapByName(userTaskDefinitions.getItems()); assertTrue(map.containsKey("First task")); assertTrue(map.containsKey("Second task")); UserTaskDefinition firstTaskDefinition = map.get("First task"); assertEquals("First task", firstTaskDefinition.getName()); assertTrue("Task should be skippable.", firstTaskDefinition.isSkippable()); // Update container to new version. KieServerAssert.assertSuccess(client.updateReleaseId(CONTAINER_ID, releaseId101)); userTaskDefinitions = processClient.getUserTaskDefinitions(CONTAINER_ID, PROCESS_ID_USERTASK); assertEquals(2, userTaskDefinitions.getItems().size()); map = mapByName(userTaskDefinitions.getItems()); assertTrue(map.containsKey("Updated first task")); assertTrue(map.containsKey("Second task")); firstTaskDefinition = map.get("Updated first task"); assertEquals("Updated first task", firstTaskDefinition.getName()); assertFalse("Task shouldn't be skippable.", firstTaskDefinition.isSkippable()); } @Test public void testUpdateContainerWithActiveProcessInstance() throws Exception { Long processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK); try { ServiceResponse<ReleaseId> updateReleaseId = client.updateReleaseId(CONTAINER_ID, releaseId101); KieServerAssert.assertFailure(updateReleaseId); assertEquals("Update of container forbidden - there are active process instances for container " + CONTAINER_ID, updateReleaseId.getMsg()); } finally { processClient.abortProcessInstance(CONTAINER_ID, processInstanceId); } } protected Map<String, UserTaskDefinition> mapByName(List<UserTaskDefinition> taskDefinitions) { Map<String, UserTaskDefinition> mapped = new HashMap<String, UserTaskDefinition>(); for (UserTaskDefinition definition : taskDefinitions) { mapped.put(definition.getName(), definition); } return mapped; } }