/* 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.api.event;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import org.activiti.engine.delegate.event.ActivitiActivityCancelledEvent;
import org.activiti.engine.delegate.event.ActivitiActivityEvent;
import org.activiti.engine.delegate.event.ActivitiErrorEvent;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.ActivitiMessageEvent;
import org.activiti.engine.delegate.event.ActivitiSignalEvent;
import org.activiti.engine.delegate.event.impl.ActivitiActivityEventImpl;
import org.activiti.engine.event.EventLogEntry;
import org.activiti.engine.impl.event.logger.EventLogger;
import org.activiti.engine.impl.persistence.entity.MessageEventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.SignalEventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.TimerEntity;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* Test case for all {@link ActivitiEvent}s related to activities.
*
* @author Frederik Heremans
* @author Joram Barrez
*/
public class ActivityEventsTest extends PluggableActivitiTestCase {
private TestActivitiActivityEventListener listener;
protected EventLogger databaseEventLogger;
@Override
protected void setUp() throws Exception {
super.setUp();
// Database event logger setup
databaseEventLogger = new EventLogger(processEngineConfiguration.getClock(), processEngineConfiguration.getObjectMapper());
runtimeService.addEventListener(databaseEventLogger);
}
@Override
protected void tearDown() throws Exception {
if (listener != null) {
listener.clearEventsReceived();
processEngineConfiguration.getEventDispatcher().removeEventListener(listener);
}
// Remove entries
for (EventLogEntry eventLogEntry : managementService.getEventLogEntries(null, null)) {
managementService.deleteEventLogEntry(eventLogEntry.getLogNumber());
}
// Database event logger teardown
runtimeService.removeEventListener(databaseEventLogger);
super.tearDown();
}
@Override
protected void initializeServices() {
super.initializeServices();
listener = new TestActivitiActivityEventListener(true);
processEngineConfiguration.getEventDispatcher().addEventListener(listener);
}
/**
* Test starting and completed events for activity. Since these events are dispatched in the core
* of the PVM, not all individual activity-type is tested. Rather, we test the main types (tasks, gateways, events,
* subprocesses).
*/
@Deployment
public void testActivityEvents() throws Exception {
// We're interested in the raw events, alter the listener to keep those as well
listener.setIgnoreRawActivityEvents(false);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("activityProcess");
assertNotNull(processInstance);
assertEquals(3, listener.getEventsReceived().size());
// Start-event activity started
ActivitiActivityEvent activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("theStart", activityEvent.getActivityId());
assertEquals(processInstance.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
// Start-event finished
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("theStart", activityEvent.getActivityId());
assertEquals(processInstance.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
// Usertask started
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("shipOrder", activityEvent.getActivityId());
assertEquals(processInstance.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
// Complete usertask
listener.clearEventsReceived();
Task task = taskService.createTaskQuery()
.processInstanceId(processInstance.getId())
.singleResult();
assertNotNull(task);
taskService.complete(task.getId());
// Subprocess execution is created
Execution execution = runtimeService.createExecutionQuery().parentId(processInstance.getId()).singleResult();
assertNotNull(execution);
assertEquals(5, listener.getEventsReceived().size());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("shipOrder", activityEvent.getActivityId());
assertEquals(processInstance.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("subProcess", activityEvent.getActivityId());
assertEquals(execution.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("subProcessStart", activityEvent.getActivityId());
assertEquals(execution.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(3);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("subProcessStart", activityEvent.getActivityId());
assertEquals(execution.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(4);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("subTask", activityEvent.getActivityId());
assertEquals(execution.getId(), activityEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
listener.clearEventsReceived();
// Check gateway and intermediate throw event
Task subTask = taskService.createTaskQuery().executionId(execution.getId()).singleResult();
assertNotNull(subTask);
taskService.complete(subTask.getId());
assertEquals(10, listener.getEventsReceived().size());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("subTask", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("gateway", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("gateway", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(3);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("throwMessageEvent", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(4);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("throwMessageEvent", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(5);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("endSubProcess", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(6);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("endSubProcess", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(7);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("subProcess", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(8);
assertEquals(ActivitiEventType.ACTIVITY_STARTED, activityEvent.getType());
assertEquals("theEnd", activityEvent.getActivityId());
activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(9);
assertEquals(ActivitiEventType.ACTIVITY_COMPLETED, activityEvent.getType());
assertEquals("theEnd", activityEvent.getActivityId());
}
/**
* Test events related to signalling
*/
@Deployment
public void testActivitySignalEvents() throws Exception {
// Two paths are active in the process, one receive-task and one
// intermediate catching signal-event
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("signalProcess");
assertNotNull(processInstance);
// Check regular signal through API
Execution executionWithSignal = runtimeService.createExecutionQuery().activityId("receivePayment").singleResult();
assertNotNull(executionWithSignal);
runtimeService.signal(executionWithSignal.getId());
assertEquals(1, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiSignalEvent);
ActivitiSignalEvent signalEvent = (ActivitiSignalEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_SIGNALED, signalEvent.getType());
assertEquals("receivePayment", signalEvent.getActivityId());
assertEquals(executionWithSignal.getId(), signalEvent.getExecutionId());
assertEquals(executionWithSignal.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertNull(signalEvent.getSignalName());
assertNull(signalEvent.getSignalData());
listener.clearEventsReceived();
// Check signal using event, and pass in additional payload
Execution executionWithSignalEvent = runtimeService.createExecutionQuery().activityId("shipOrder").singleResult();
runtimeService.signalEventReceived("alert", executionWithSignalEvent.getId(),
Collections.singletonMap("test", (Object) "test"));
assertEquals(1, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiSignalEvent);
signalEvent = (ActivitiSignalEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_SIGNALED, signalEvent.getType());
assertEquals("shipOrder", signalEvent.getActivityId());
assertEquals(executionWithSignalEvent.getId(), signalEvent.getExecutionId());
assertEquals(executionWithSignalEvent.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertEquals("alert", signalEvent.getSignalName());
assertNotNull(signalEvent.getSignalData());
listener.clearEventsReceived();
assertDatabaseEventPresent(ActivitiEventType.ACTIVITY_SIGNALED);
}
/**
* Test to verify if signals coming from an intermediate throw-event trigger
* the right events to be dispatched.
*/
@Deployment
public void testActivitySignalEventsWithinProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("signalProcess");
assertNotNull(processInstance);
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(task);
Execution executionWithSignalEvent = runtimeService.createExecutionQuery().activityId("shipOrder").singleResult();
taskService.complete(task.getId());
assertEquals(1L, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiSignalEvent);
ActivitiSignalEvent signalEvent = (ActivitiSignalEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_SIGNALED, signalEvent.getType());
assertEquals("shipOrder", signalEvent.getActivityId());
assertEquals(executionWithSignalEvent.getId(), signalEvent.getExecutionId());
assertEquals(executionWithSignalEvent.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertEquals("alert", signalEvent.getSignalName());
assertNull(signalEvent.getSignalData());
}
/**
* Test events related to message events, called from the API.
*/
@Deployment
public void testActivityMessageEvents() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("messageProcess");
assertNotNull(processInstance);
Execution executionWithMessage = runtimeService.createExecutionQuery().activityId("shipOrder").singleResult();
assertNotNull(executionWithMessage);
runtimeService.messageEventReceived("messageName", executionWithMessage.getId());
assertEquals(2, listener.getEventsReceived().size());
// First, a message-event is expected
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiMessageEvent);
ActivitiMessageEvent messageEvent = (ActivitiMessageEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, messageEvent.getType());
assertEquals("shipOrder", messageEvent.getActivityId());
assertEquals(executionWithMessage.getId(), messageEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), messageEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), messageEvent.getProcessDefinitionId());
assertEquals("messageName", messageEvent.getMessageName());
assertNull(messageEvent.getMessageData());
// Next, an signal-event is expected, as a result of the message
assertTrue(listener.getEventsReceived().get(1) instanceof ActivitiSignalEvent);
ActivitiSignalEvent signalEvent = (ActivitiSignalEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_SIGNALED, signalEvent.getType());
assertEquals("shipOrder", signalEvent.getActivityId());
assertEquals(executionWithMessage.getId(), signalEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertEquals("messageName", signalEvent.getSignalName());
assertNull(signalEvent.getSignalData());
assertDatabaseEventPresent(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED);
}
/**
* Test events related to message events, called from the API, targeting an event-subprocess.
*/
@Deployment
public void testActivityMessageEventsInEventSubprocess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("messageProcess");
assertNotNull(processInstance);
Execution executionWithMessage = runtimeService.createExecutionQuery().activityId("shipOrder").singleResult();
assertNotNull(executionWithMessage);
runtimeService.messageEventReceived("messageName", executionWithMessage.getId());
// Only a message-event should be present, no signal-event, since the
// event-subprocess is
// not signaled, but executed instead
assertEquals(1, listener.getEventsReceived().size());
// A message-event is expected
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiMessageEvent);
ActivitiMessageEvent messageEvent = (ActivitiMessageEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, messageEvent.getType());
assertEquals("catchMessage", messageEvent.getActivityId());
assertEquals(executionWithMessage.getId(), messageEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), messageEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), messageEvent.getProcessDefinitionId());
assertEquals("messageName", messageEvent.getMessageName());
assertNull(messageEvent.getMessageData());
}
/**
* Test events related to compensation events.
*/
@Deployment
public void testActivityCompensationEvents() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("compensationProcess");
assertNotNull(processInstance);
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId())
.singleResult();
assertNotNull(task);
// Complete task, next a compensation event will be thrown
taskService.complete(task.getId());
assertEquals(2, listener.getEventsReceived().size());
// A compensate-event is expected
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiActivityEvent);
ActivitiActivityEvent activityEvent = (ActivitiActivityEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_COMPENSATE, activityEvent.getType());
assertEquals("compensate", activityEvent.getActivityId());
// A new execution is created for the compensation-event, this should be visible in the event
assertFalse(processInstance.getId().equals(activityEvent.getExecutionId()));
assertEquals(processInstance.getProcessInstanceId(), activityEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), activityEvent.getProcessDefinitionId());
// Also, a signal-event is received, representing the boundary-event being executed.
assertTrue(listener.getEventsReceived().get(1) instanceof ActivitiSignalEvent);
ActivitiSignalEvent signalEvent = (ActivitiSignalEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_SIGNALED, signalEvent.getType());
assertEquals("throwCompensation", signalEvent.getActivityId());
assertEquals(processInstance.getId(), signalEvent.getExecutionId());
assertEquals(processInstance.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertEquals("compensationDone", signalEvent.getSignalName());
assertNull(signalEvent.getSignalData());
// Check if the process is still alive
processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.singleResult();
assertNotNull(processInstance);
assertDatabaseEventPresent(ActivitiEventType.ACTIVITY_COMPENSATE);
}
/**
* Test events related to error-events
*/
@Deployment
public void testActivityErrorEvents() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("errorProcess");
assertNotNull(processInstance);
// Error-handling should have ended the process
ProcessInstance afterErrorInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId())
.singleResult();
assertNull(afterErrorInstance);
ActivitiErrorEvent errorEvent = null;
for(ActivitiEvent event : listener.getEventsReceived()) {
if(event instanceof ActivitiErrorEvent) {
if(errorEvent == null) {
errorEvent = (ActivitiErrorEvent) event;
} else {
fail("Only one ActivityErrorEvent expected");
}
}
}
assertNotNull(errorEvent);
assertEquals(ActivitiEventType.ACTIVITY_ERROR_RECEIVED, errorEvent.getType());
assertEquals("catchError", errorEvent.getActivityId());
assertEquals("123", errorEvent.getErrorCode());
assertEquals(processInstance.getId(), errorEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), errorEvent.getProcessDefinitionId());
assertFalse(processInstance.getId().equals(errorEvent.getExecutionId()));
}
/**
* Test events related to error-events, thrown from within process-execution (eg. service-task).
*/
@Deployment
public void testActivityErrorEventsFromBPMNError() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("errorProcess");
assertNotNull(processInstance);
// Error-handling should have ended the process
ProcessInstance afterErrorInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId())
.singleResult();
assertNull(afterErrorInstance);
ActivitiErrorEvent errorEvent = null;
for(ActivitiEvent event : listener.getEventsReceived()) {
if(event instanceof ActivitiErrorEvent) {
if(errorEvent == null) {
errorEvent = (ActivitiErrorEvent) event;
} else {
fail("Only one ActivityErrorEvent expected");
}
}
}
assertNotNull(errorEvent);
assertEquals(ActivitiEventType.ACTIVITY_ERROR_RECEIVED, errorEvent.getType());
assertEquals("catchError", errorEvent.getActivityId());
assertEquals("23", errorEvent.getErrorCode());
assertEquals(processInstance.getId(), errorEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), errorEvent.getProcessDefinitionId());
assertFalse(processInstance.getId().equals(errorEvent.getExecutionId()));
}
@Deployment(resources = "org/activiti/engine/test/api/event/JobEventsTest.testJobEntityEvents.bpmn20.xml")
public void testActivityTimeOutEvent(){
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testJobEvents");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar tomorrow = Calendar.getInstance();
tomorrow.add(Calendar.DAY_OF_YEAR, 1);
processEngineConfiguration.getClock().setCurrentTime(tomorrow.getTime());
waitForJobExecutorToProcessAllJobs(2000, 100);
// Check timeout has been dispatched
assertEquals(1, listener.getEventsReceived().size());
ActivitiEvent activitiEvent = listener.getEventsReceived().get(0);
assertEquals("ACTIVITY_CANCELLED event expected", ActivitiEventType.ACTIVITY_CANCELLED, activitiEvent.getType());
ActivitiActivityCancelledEvent cancelledEvent = (ActivitiActivityCancelledEvent) activitiEvent;
assertTrue("TIMER is the cause of the cancellation", cancelledEvent.getCause() instanceof TimerEntity);
}
@Deployment(resources = "org/activiti/engine/test/bpmn/event/timer/BoundaryTimerEventTest.testTimerOnNestingOfSubprocesses.bpmn20.xml")
public void testActivityTimeOutEventInSubProcess() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("timerOnNestedSubprocesses");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar timeToFire = Calendar.getInstance();
timeToFire.add(Calendar.HOUR, 2);
timeToFire.add(Calendar.SECOND, 5);
processEngineConfiguration.getClock().setCurrentTime(timeToFire.getTime());
waitForJobExecutorToProcessAllJobs(2000, 200);
// Check timeout-events have been dispatched
assertEquals(3, listener.getEventsReceived().size());
List<String> eventIdList = new ArrayList<String>();
for (ActivitiEvent event : listener.getEventsReceived()) {
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, event.getType());
assertTrue("TIMER is the cause of the cancellation", ((ActivitiActivityCancelledEvent) event).getCause() instanceof TimerEntity);
eventIdList.add(((ActivitiActivityEventImpl) event).getActivityId());
}
assertTrue(eventIdList.indexOf("innerTask1") >= 0);
assertTrue(eventIdList.indexOf("innerTask2") >= 0);
assertTrue(eventIdList.indexOf("innerFork") >= 0);
}
@Deployment
public void testActivityTimeOutEventInCallActivity() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("timerOnCallActivity");
Job theJob = managementService.createJobQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(theJob);
// Force timer to fire
Calendar timeToFire = Calendar.getInstance();
timeToFire.add(Calendar.HOUR, 2);
timeToFire.add(Calendar.SECOND, 5);
processEngineConfiguration.getClock().setCurrentTime(timeToFire.getTime());
waitForJobExecutorToProcessAllJobs(20000, 500);
// Check timeout-events have been dispatched
assertEquals(4, listener.getEventsReceived().size());
List<String> eventIdList = new ArrayList<String>();
for (ActivitiEvent event : listener.getEventsReceived()) {
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, event.getType());
assertTrue("TIMER is the cause of the cancellation", ((ActivitiActivityCancelledEvent) event).getCause() instanceof TimerEntity);
eventIdList.add(((ActivitiActivityEventImpl) event).getActivityId());
}
assertTrue(eventIdList.indexOf("innerTask1") >= 0);
assertTrue(eventIdList.indexOf("innerTask2") >= 0);
assertTrue(eventIdList.indexOf("innerFork") >= 0);
assertTrue(eventIdList.indexOf("callActivity") >= 0);
}
/**
* Test events related to message events, called from the API.
*/
@Deployment
public void testActivityMessageBoundaryEventsOnUserTask() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("messageOnUserTaskProcess");
assertNotNull(processInstance);
Execution executionWithMessage = runtimeService.createExecutionQuery().activityId("cloudformtask1").singleResult();
assertNotNull(executionWithMessage);
runtimeService.messageEventReceived("message_1", executionWithMessage.getId());
assertEquals(2, listener.getEventsReceived().size());
// First, a message-event is expected
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiMessageEvent);
ActivitiMessageEvent messageEvent = (ActivitiMessageEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, messageEvent.getType());
assertEquals("boundaryMessageEventCatching", messageEvent.getActivityId());
assertEquals(executionWithMessage.getId(), messageEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), messageEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), messageEvent.getProcessDefinitionId());
assertEquals("message_1", messageEvent.getMessageName());
assertNull(messageEvent.getMessageData());
// Next, an signal-event is expected, as a result of the message
assertTrue(listener.getEventsReceived().get(1) instanceof ActivitiActivityCancelledEvent);
ActivitiActivityCancelledEvent signalEvent = (ActivitiActivityCancelledEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, signalEvent.getType());
assertEquals("cloudformtask1", signalEvent.getActivityId());
assertEquals(executionWithMessage.getId(), signalEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertNotNull(signalEvent.getCause());
assertTrue(signalEvent.getCause() instanceof MessageEventSubscriptionEntity);
MessageEventSubscriptionEntity cause = (MessageEventSubscriptionEntity) signalEvent.getCause();
assertEquals("message_1", cause.getEventName());
assertDatabaseEventPresent(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED);
}
/**
* Test events related to message events, called from the API.
*/
@Deployment
public void testActivityMessageBoundaryEventsOnSubProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("messageOnSubProcess");
assertNotNull(processInstance);
Execution executionWithMessage = runtimeService.createExecutionQuery().activityId("cloudformtask1").singleResult();
assertNotNull(executionWithMessage);
runtimeService.messageEventReceived("message_1", executionWithMessage.getId());
assertEquals(2, listener.getEventsReceived().size());
// First, a message-event is expected
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiMessageEvent);
ActivitiMessageEvent messageEvent = (ActivitiMessageEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, messageEvent.getType());
assertEquals("boundaryMessageEventCatching", messageEvent.getActivityId());
assertEquals(executionWithMessage.getId(), messageEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), messageEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), messageEvent.getProcessDefinitionId());
assertEquals("message_1", messageEvent.getMessageName());
assertNull(messageEvent.getMessageData());
// Next, an signal-event is expected, as a result of the message
assertTrue(listener.getEventsReceived().get(1) instanceof ActivitiActivityCancelledEvent);
ActivitiActivityCancelledEvent signalEvent = (ActivitiActivityCancelledEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, signalEvent.getType());
assertEquals("cloudformtask1", signalEvent.getActivityId());
assertEquals(executionWithMessage.getId(), signalEvent.getExecutionId());
assertEquals(executionWithMessage.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertNotNull(signalEvent.getCause());
assertTrue(signalEvent.getCause() instanceof MessageEventSubscriptionEntity);
MessageEventSubscriptionEntity cause = (MessageEventSubscriptionEntity) signalEvent.getCause();
assertEquals("message_1", cause.getEventName());
assertDatabaseEventPresent(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED);
}
@Deployment
public void testActivitySignalBoundaryEventsOnSubProcess() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("signalOnSubProcess");
assertNotNull(processInstance);
Execution executionWithSignal = runtimeService.createExecutionQuery().activityId("userTaskInsideProcess").singleResult();
assertNotNull(executionWithSignal);
runtimeService.signalEventReceived("signalName");
assertEquals(1, listener.getEventsReceived().size());
// Next, an signal-event is expected, as a result of the message
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiActivityCancelledEvent);
ActivitiActivityCancelledEvent signalEvent = (ActivitiActivityCancelledEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, signalEvent.getType());
assertEquals("userTaskInsideProcess", signalEvent.getActivityId());
assertEquals(executionWithSignal.getId(), signalEvent.getExecutionId());
assertEquals(executionWithSignal.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertNotNull(signalEvent.getCause());
assertTrue(signalEvent.getCause() instanceof SignalEventSubscriptionEntity);
SignalEventSubscriptionEntity cause = (SignalEventSubscriptionEntity) signalEvent.getCause();
assertEquals("signalName", cause.getEventName());
}
@Deployment
public void testActivitySignalBoundaryEventsOnUserTask() throws Exception {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("signalOnUserTask");
assertNotNull(processInstance);
Execution executionWithSignal = runtimeService.createExecutionQuery().activityId("userTask").singleResult();
assertNotNull(executionWithSignal);
runtimeService.signalEventReceived("signalName");
assertEquals(1, listener.getEventsReceived().size());
// Next, an signal-event is expected, as a result of the message
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiActivityCancelledEvent);
ActivitiActivityCancelledEvent signalEvent = (ActivitiActivityCancelledEvent) listener.getEventsReceived().get(0);
assertEquals(ActivitiEventType.ACTIVITY_CANCELLED, signalEvent.getType());
assertEquals("userTask", signalEvent.getActivityId());
assertEquals(executionWithSignal.getId(), signalEvent.getExecutionId());
assertEquals(executionWithSignal.getProcessInstanceId(), signalEvent.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), signalEvent.getProcessDefinitionId());
assertNotNull(signalEvent.getCause());
assertTrue(signalEvent.getCause() instanceof SignalEventSubscriptionEntity);
SignalEventSubscriptionEntity cause = (SignalEventSubscriptionEntity) signalEvent.getCause();
assertEquals("signalName", cause.getEventName());
}
protected void assertDatabaseEventPresent(ActivitiEventType eventType) {
String eventTypeString = eventType.name();
List<EventLogEntry> eventLogEntries = managementService.getEventLogEntries(0L, 100000L);
boolean found = false;
for (EventLogEntry entry : eventLogEntries) {
if (entry.getType().equals(eventTypeString)) {
found = true;
}
}
assertTrue(found);
}
}