/*
* 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.
* 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.jbpm.test.functional.event;
import java.util.ArrayList;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.drools.core.command.runtime.process.RegisterWorkItemHandlerCommand;
import org.drools.core.process.instance.WorkItemHandler;
import org.jbpm.test.JbpmTestCase;
import org.jbpm.test.listener.IterableProcessEventListener;
import org.jbpm.test.listener.TrackingProcessEventListener;
import org.junit.Test;
import org.kie.api.command.Command;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemManager;
import org.kie.internal.command.CommandFactory;
import qa.tools.ikeeper.annotation.BZ;
import static org.jbpm.test.tools.IterableListenerAssert.*;
public class EndEventTest extends JbpmTestCase {
private static final String COMPENSATE = "org/jbpm/test/functional/event/EndEvent-compensate.bpmn2";
private static final String COMPENSATE_ID = "org.jbpm.test.functional.event.EndEvent-compensate";
private static final String ERROR = "org/jbpm/test/functional/event/EndEvent-error.bpmn2";
private static final String ERROR_ID = "org.jbpm.test.functional.event.EndEvent-error";
private static final String ESCALATION = "org/jbpm/test/functional/event/EndEvent-escalation.bpmn2";
private static final String ESCALATION_ID = "org.jbpm.test.functional.event.EndEvent-escalation";
private static final String MESSAGE = "org/jbpm/test/functional/event/EndEvent-message.bpmn2";
private static final String MESSAGE_ID = "org.jbpm.test.functional.event.EndEvent-message";
private static final String NONE = "org/jbpm/test/functional/event/EndEvent-none.bpmn2";
private static final String NONE_ID = "org.jbpm.test.functional.event.EndEvent-none";
private static final String TERMINATING = "org/jbpm/test/functional/event/EndEvent-terminating.bpmn2";
private static final String TERMINATING_ID = "org.jbpm.test.functional.event.EndEvent-terminating";
public EndEventTest() {
super(false);
}
@BZ("1021631")
@Test(timeout = 30000)
public void testCompensateEndEvent() {
KieSession ksession = createKSession(COMPENSATE);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
Command<ProcessInstance> cmd = getCommands().newStartProcess(COMPENSATE_ID);
ProcessInstance pi = ksession.execute(cmd);
Assertions.assertThat(process.wasProcessStarted(COMPENSATE_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(COMPENSATE_ID)).isTrue();
assertProcessStarted(events, COMPENSATE_ID);
assertNextNode(events, "start");
assertTriggered(events, "subprocess");
assertNextNode(events, "sub-start");
assertTriggered(events, "script");
assertChangedVariable(events, "x", null, 0);
assertLeft(events, "script");
assertNextNode(events, "sub-end");
assertLeft(events, "subprocess");
assertTriggered(events, "end");
assertLeft(events, "compensate-catch");
assertTriggered(events, "compensate");
assertChangedVariable(events, "x", 0, null);
assertLeft(events, "compensate");
Assertions.assertThat(pi.getState()).isEqualTo(ProcessInstance.STATE_COMPLETED);
}
@Test(timeout = 30000)
public void testErrorEndEvent() {
KieSession ksession = createKSession(ERROR);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
Command<?> cmd = getCommands().newStartProcess(ERROR_ID);
ksession.execute(cmd);
Assertions.assertThat(process.wasProcessStarted(ERROR_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(ERROR_ID)).isFalse();
Assertions.assertThat(process.wasProcessAborted(ERROR_ID)).isTrue();
assertProcessStarted(events, ERROR_ID);
assertNextNode(events, "start");
assertNextNode(events, "script");
assertTriggered(events, "end");
assertProcessCompleted(events, ERROR_ID);
Assertions.assertThat(events.hasNext()).isFalse();
}
@BZ("1015221")
@Test(timeout = 30000)
public void testEscalationEndEvent() {
KieSession ksession = createKSession(ESCALATION);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
Command<?> cmd = getCommands().newStartProcess(ESCALATION_ID);
ksession.execute(cmd);
Assertions.assertThat(process.wasProcessStarted(ESCALATION_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(ESCALATION_ID)).isFalse();
Assertions.assertThat(process.wasProcessAborted(ESCALATION_ID)).isTrue();
assertProcessStarted(events, ESCALATION_ID);
assertNextNode(events, "start");
assertNextNode(events, "script");
assertTriggered(events, "end");
assertProcessCompleted(events, ESCALATION_ID);
assertFalse(events.hasNext());
}
@Test(timeout = 30000)
public void testMessageEndEvent() {
KieSession ksession = createKSession(MESSAGE);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
RecordingHandler handler = new RecordingHandler();
List<Command<?>> cmds = new ArrayList<Command<?>>();
cmds.add(new RegisterWorkItemHandlerCommand("Send Task", handler));
cmds.add(getCommands().newStartProcess(MESSAGE_ID));
ksession.execute(getCommands().newBatchExecution(cmds, null));
Assertions.assertThat(process.wasProcessStarted(MESSAGE_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(MESSAGE_ID)).isTrue();
assertProcessStarted(events, MESSAGE_ID);
assertNextNode(events, "start");
assertNextNode(events, "script");
assertNextNode(events, "end");
assertProcessCompleted(events, MESSAGE_ID);
Assertions.assertThat(events.hasNext()).isFalse();
Assertions.assertThat(handler.item).isNotNull();
}
@Test(timeout = 30000)
public void testNoneEndEvent() {
KieSession ksession = createKSession(NONE);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
Command<?> cmd = CommandFactory.newStartProcess(NONE_ID);
ksession.execute(cmd);
Assertions.assertThat(process.wasProcessStarted(NONE_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(NONE_ID)).isTrue();
assertProcessStarted(events, NONE_ID);
assertNextNode(events, "start");
assertNextNode(events, "script");
assertNextNode(events, "end");
assertProcessCompleted(events, NONE_ID);
Assertions.assertThat(events.hasNext()).isFalse();
}
@Test(timeout = 30000)
public void testTerminatingEndEvent() {
KieSession ksession = createKSession(TERMINATING);
IterableProcessEventListener events = new IterableProcessEventListener();
TrackingProcessEventListener process = new TrackingProcessEventListener();
ksession.addEventListener(events);
ksession.addEventListener(process);
Command<?> cmd = getCommands().newStartProcess(TERMINATING_ID);
ksession.execute(cmd);
Assertions.assertThat(process.wasProcessStarted(TERMINATING_ID)).isTrue();
Assertions.assertThat(process.wasProcessCompleted(TERMINATING_ID)).isTrue();
assertProcessStarted(events, TERMINATING_ID);
assertNextNode(events, "start");
assertNextNode(events, "script");
assertNextNode(events, "end");
assertProcessCompleted(events, TERMINATING_ID);
Assertions.assertThat(events.hasNext()).isFalse();
}
private static class RecordingHandler implements WorkItemHandler {
private WorkItem item = null;
@Override
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
if (item != null) {
throw new IllegalStateException("Work item is already set!");
}
this.item = workItem;
}
@Override
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
// nothing
}
}
}