/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.activiti.engine.test.bpmn.gateway;
import java.util.Date;
import org.activiti.engine.impl.EventSubscriptionQueryImpl;
import org.activiti.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.impl.util.ClockUtil;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Daniel Meyer
*/
public class EventBasedGatewayTest extends PluggableActivitiTestCase {
@Deployment(resources={
"org/activiti/engine/test/bpmn/gateway/EventBasedGatewayTest.testCatchAlertAndTimer.bpmn20.xml",
"org/activiti/engine/test/bpmn/gateway/EventBasedGatewayTest.throwAlertSignal.bpmn20.xml"})
public void testCatchSignalCancelsTimer() {
runtimeService.startProcessInstanceByKey("catchSignal");
assertEquals(1, createEventSubscriptionQuery().count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(1, managementService.createJobQuery().count());
runtimeService.startProcessInstanceByKey("throwSignal");
assertEquals(0, createEventSubscriptionQuery().count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(0, managementService.createJobQuery().count());
Task task = taskService.createTaskQuery()
.taskName("afterSignal")
.singleResult();
assertNotNull(task);
taskService.complete(task.getId());
}
@Deployment(resources={
"org/activiti/engine/test/bpmn/gateway/EventBasedGatewayTest.testCatchAlertAndTimer.bpmn20.xml"
})
public void testCatchTimerCancelsSignal() {
runtimeService.startProcessInstanceByKey("catchSignal");
assertEquals(1, createEventSubscriptionQuery().count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(1, managementService.createJobQuery().count());
ClockUtil.setCurrentTime(new Date(ClockUtil.getCurrentTime().getTime() +10000));
try {
// wait for timer to fire
waitForJobExecutorToProcessAllJobs(10000, 100);
assertEquals(0, createEventSubscriptionQuery().count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(0, managementService.createJobQuery().count());
Task task = taskService.createTaskQuery()
.taskName("afterTimer")
.singleResult();
assertNotNull(task);
taskService.complete(task.getId());
}finally{
ClockUtil.setCurrentTime(new Date());
}
}
@Deployment
public void testCatchSignalAndMessageAndTimer() {
runtimeService.startProcessInstanceByKey("catchSignal");
assertEquals(2, createEventSubscriptionQuery().count());
EventSubscriptionQueryImpl messageEventSubscriptionQuery = createEventSubscriptionQuery().eventType("message");
assertEquals(1, messageEventSubscriptionQuery.count());
assertEquals(1, createEventSubscriptionQuery().eventType("signal").count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(1, managementService.createJobQuery().count());
// we can query for an execution with has both a signal AND message subscription
Execution execution = runtimeService.createExecutionQuery()
.messageEventSubscriptionName("newInvoice")
.signalEventSubscriptionName("alert")
.singleResult();
assertNotNull(execution);
ClockUtil.setCurrentTime(new Date(ClockUtil.getCurrentTime().getTime() +10000));
try {
EventSubscriptionEntity messageEventSubscription = messageEventSubscriptionQuery.singleResult();
runtimeService.messageEventReceived(messageEventSubscription.getEventName(), messageEventSubscription.getExecutionId());
assertEquals(0, createEventSubscriptionQuery().count());
assertEquals(1, runtimeService.createProcessInstanceQuery().count());
assertEquals(0, managementService.createJobQuery().count());
Task task = taskService.createTaskQuery()
.taskName("afterMessage")
.singleResult();
assertNotNull(task);
taskService.complete(task.getId());
}finally{
ClockUtil.setCurrentTime(new Date());
}
}
public void testConnectedToActitiy() {
try {
repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/bpmn/gateway/EventBasedGatewayTest.testConnectedToActivity.bpmn20.xml")
.deploy();
fail("exception expected");
} catch (Exception e) {
if(!e.getMessage().contains("Event based gateway can only be connected to elements of type intermediateCatchEvent")) {
fail("different exception expected");
}
}
}
public void testInvalidSequenceFlow() {
try {
repositoryService.createDeployment()
.addClasspathResource("org/activiti/engine/test/bpmn/gateway/EventBasedGatewayTest.testEventInvalidSequenceFlow.bpmn20.xml")
.deploy();
fail("exception expected");
} catch (Exception e) {
if(!e.getMessage().contains("Invalid incoming sequenceflow for intermediateCatchEvent")) {
fail("different exception expected");
}
}
}
private EventSubscriptionQueryImpl createEventSubscriptionQuery() {
return new EventSubscriptionQueryImpl(processEngineConfiguration.getCommandExecutorTxRequired());
}
}