/*
* 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.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.assertj.core.api.Assertions;
import org.jbpm.test.JbpmTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.Context;
import org.kie.api.runtime.manager.audit.ProcessInstanceLog;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.internal.runtime.manager.context.EmptyContext;
import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext;
@RunWith(Parameterized.class)
public class SignalEventTest extends JbpmTestCase {
private static final String END_THROW_DEFAULT = "org/jbpm/test/functional/event/Signal-endThrow-default.bpmn2";
private static final String END_THROW_DEFAULT_ID = "org.jbpm.test.functional.event.Signal-endThrow-default";
private static final String END_THROW_INSTANCE = "org/jbpm/test/functional/event/Signal-endThrow-instance.bpmn2";
private static final String END_THROW_INSTANCE_ID = "org.jbpm.test.functional.event.Signal-endThrow-instance";
private static final String END_THROW_PROJECT = "org/jbpm/test/functional/event/Signal-endThrow-project.bpmn2";
private static final String END_THROW_PROJECT_ID = "org.jbpm.test.functional.event.Signal-endThrow-project";
private static final String INTERMEDIATE_CATCH = "org/jbpm/test/functional/event/Signal-intermediateCatch.bpmn2";
private static final String INTERMEDIATE_CATCH_ID = "org.jbpm.test.functional.event.Signal-intermediateCatch";
private static final String INTERMEDIATE_THROW_DEFAULT =
"org/jbpm/test/functional/event/Signal-intermediateThrow-default.bpmn2";
private static final String INTERMEDIATE_THROW_DEFAULT_ID =
"org.jbpm.test.functional.event.Signal-intermediateThrow-default";
private static final String INTERMEDIATE_THROW_INSTANCE =
"org/jbpm/test/functional/event/Signal-intermediateThrow-instance.bpmn2";
private static final String INTERMEDIATE_THROW_INSTANCE_ID =
"org.jbpm.test.functional.event.Signal-intermediateThrow-instance";
private static final String INTERMEDIATE_THROW_PROJECT =
"org/jbpm/test/functional/event/Signal-intermediateThrow-project.bpmn2";
private static final String INTERMEDIATE_THROW_PROJECT_ID =
"org.jbpm.test.functional.event.Signal-intermediateThrow-project";
private static final String START_CATCH = "org/jbpm/test/functional/event/Signal-startCatch.bpmn2";
private static final String START_CATCH_ID = "org.jbpm.test.functional.event.Signal-startCatch";
private static final String SUBPROCESS_CATCH = "org/jbpm/test/functional/event/Signal-subprocessCatch.bpmn2";
private static final String SUBPROCESS_CATCH_ID = "org.jbpm.test.functional.event.Signal-subprocessCatch";
private enum Scope {
DEFAULT, PROCESS_INSTANCE, PROJECT
}
private final Strategy strategy;
private final Scope scope;
public SignalEventTest(Strategy strategy, Scope scope) {
this.strategy = strategy;
this.scope = scope;
}
@Parameterized.Parameters(name = "{0} strategy, {1} scope")
public static Collection<Object[]> parameters() {
Object[][] combinations = new Object[][]{
{Strategy.SINGLETON, Scope.DEFAULT},
{Strategy.SINGLETON, Scope.PROJECT},
{Strategy.SINGLETON, Scope.PROCESS_INSTANCE},
{Strategy.PROCESS_INSTANCE, Scope.DEFAULT},
{Strategy.PROCESS_INSTANCE, Scope.PROJECT},
{Strategy.PROCESS_INSTANCE, Scope.PROCESS_INSTANCE}
};
return Arrays.asList(combinations);
}
private KieSession getKieSession() {
Context<?> context = strategy == Strategy.PROCESS_INSTANCE ? ProcessInstanceIdContext.get() : EmptyContext.get();
return getRuntimeEngine(context).getKieSession();
}
@Test
public void testSignalManually() {
createRuntimeManager(strategy, (String) null, INTERMEDIATE_CATCH);
KieSession ksession = getKieSession();
ProcessInstance pi1 = ksession.startProcess(INTERMEDIATE_CATCH_ID);
getKieSession().startProcess(INTERMEDIATE_CATCH_ID);
switch (scope) {
case DEFAULT:
ksession.signalEvent("commonSignal", null);
break;
case PROCESS_INSTANCE:
ksession.signalEvent("commonSignal", null, pi1.getId());
break;
case PROJECT:
manager.signalEvent("commonSignal", null);
break;
default:
throw new IllegalArgumentException("unknown scope");
}
List<? extends ProcessInstanceLog> instances = getRuntimeEngine().getAuditService().findProcessInstances();
Assertions.assertThat(instances).hasSize(2);
Assertions.assertThat(instances.get(0).getProcessId()).isEqualTo(INTERMEDIATE_CATCH_ID);
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
Assertions.assertThat(instances.get(1).getProcessId()).isEqualTo(INTERMEDIATE_CATCH_ID);
if (strategy == Strategy.SINGLETON) {
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(scope == Scope.PROCESS_INSTANCE ?
ProcessInstance.STATE_ACTIVE : ProcessInstance.STATE_COMPLETED);
} else if (strategy == Strategy.PROCESS_INSTANCE) {
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(scope == Scope.PROJECT ?
ProcessInstance.STATE_COMPLETED : ProcessInstance.STATE_ACTIVE);
}
}
@Test
public void testSignalEndThrowIntermediateCatch() {
String throwingProcessFile;
String throwingProcessId;
switch (scope) {
case DEFAULT:
throwingProcessFile = END_THROW_DEFAULT;
throwingProcessId = END_THROW_DEFAULT_ID;
break;
case PROJECT:
throwingProcessFile = END_THROW_PROJECT;
throwingProcessId = END_THROW_PROJECT_ID;
break;
case PROCESS_INSTANCE:
throwingProcessFile = END_THROW_INSTANCE;
throwingProcessId = END_THROW_INSTANCE_ID;
break;
default:
throw new IllegalArgumentException("unknown scope");
}
createRuntimeManager(strategy, null, throwingProcessFile, INTERMEDIATE_CATCH);
getKieSession().startProcess(INTERMEDIATE_CATCH_ID);
getKieSession().startProcess(throwingProcessId);
List<? extends ProcessInstanceLog> instances = getRuntimeEngine().getAuditService().findProcessInstances();
Assertions.assertThat(instances).hasSize(2);
Assertions.assertThat(instances.get(0).getProcessId()).isEqualTo(INTERMEDIATE_CATCH_ID);
Assertions.assertThat(instances.get(1).getProcessId()).isEqualTo(throwingProcessId);
if (strategy == Strategy.SINGLETON) {
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(scope == Scope.PROCESS_INSTANCE ?
ProcessInstance.STATE_ACTIVE : ProcessInstance.STATE_COMPLETED);
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
} else if (strategy == Strategy.PROCESS_INSTANCE) {
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(scope == Scope.PROJECT ?
ProcessInstance.STATE_COMPLETED : ProcessInstance.STATE_ACTIVE);
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
}
}
@Test
public void testSignalIntermediateThrowStartCatch() {
String throwingProcessFile;
String throwingProcessId;
switch (scope) {
case DEFAULT:
throwingProcessFile = INTERMEDIATE_THROW_DEFAULT;
throwingProcessId = INTERMEDIATE_THROW_DEFAULT_ID;
break;
case PROJECT:
throwingProcessFile = INTERMEDIATE_THROW_PROJECT;
throwingProcessId = INTERMEDIATE_THROW_PROJECT_ID;
break;
case PROCESS_INSTANCE:
throwingProcessFile = INTERMEDIATE_THROW_INSTANCE;
throwingProcessId = INTERMEDIATE_THROW_INSTANCE_ID;
break;
default:
throw new IllegalArgumentException("unknown scope");
}
createRuntimeManager(strategy, null, throwingProcessFile, START_CATCH);
getKieSession().startProcess(throwingProcessId);
boolean run = (strategy == Strategy.SINGLETON && scope != Scope.PROCESS_INSTANCE) ||
(strategy == Strategy.PROCESS_INSTANCE && scope == Scope.PROJECT) ||
(strategy == Strategy.PROCESS_INSTANCE && scope == Scope.DEFAULT);
List<? extends ProcessInstanceLog> instances = getRuntimeEngine().getAuditService().findProcessInstances();
Assertions.assertThat(instances).hasSize(run ? 2 : 1);
Assertions.assertThat(instances.get(0).getProcessId()).isEqualTo(throwingProcessId);
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
if (run) {
Assertions.assertThat(instances.get(1).getProcessId()).isEqualTo(START_CATCH_ID);
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
}
}
@Test
public void testSignalSubProcess() {
String throwingProcessFile;
String throwingProcessId;
switch (scope) {
case DEFAULT:
throwingProcessFile = INTERMEDIATE_THROW_DEFAULT;
throwingProcessId = INTERMEDIATE_THROW_DEFAULT_ID;
break;
case PROJECT:
throwingProcessFile = INTERMEDIATE_THROW_PROJECT;
throwingProcessId = INTERMEDIATE_THROW_PROJECT_ID;
break;
case PROCESS_INSTANCE:
throwingProcessFile = INTERMEDIATE_THROW_INSTANCE;
throwingProcessId = INTERMEDIATE_THROW_INSTANCE_ID;
break;
default:
throw new IllegalArgumentException("unknown scope");
}
createRuntimeManager(strategy, null, SUBPROCESS_CATCH, throwingProcessFile, INTERMEDIATE_CATCH);
getKieSession().startProcess(INTERMEDIATE_CATCH_ID);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("subprocess", throwingProcessId);
getKieSession().startProcess(SUBPROCESS_CATCH_ID, parameters);
List<? extends ProcessInstanceLog> instances = getRuntimeEngine().getAuditService().findProcessInstances();
Assertions.assertThat(instances).hasSize(3);
Assertions.assertThat(instances.get(0).getProcessId()).isEqualTo(INTERMEDIATE_CATCH_ID);
Assertions.assertThat(instances.get(1).getProcessId()).isEqualTo(SUBPROCESS_CATCH_ID);
Assertions.assertThat(instances.get(2).getProcessId()).isEqualTo(throwingProcessId);
if (strategy == Strategy.SINGLETON) {
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(scope == Scope.PROCESS_INSTANCE ?
ProcessInstance.STATE_ACTIVE : ProcessInstance.STATE_COMPLETED);
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(scope == Scope.PROCESS_INSTANCE ?
ProcessInstance.STATE_ACTIVE : ProcessInstance.STATE_COMPLETED);
} else if (strategy == Strategy.PROCESS_INSTANCE) {
Assertions.assertThat(instances.get(0).getStatus()).isEqualTo(scope == Scope.PROJECT ?
ProcessInstance.STATE_COMPLETED : ProcessInstance.STATE_ACTIVE);
Assertions.assertThat(instances.get(1).getStatus()).isEqualTo(scope == Scope.PROJECT ?
ProcessInstance.STATE_COMPLETED : ProcessInstance.STATE_ACTIVE);
}
Assertions.assertThat(instances.get(2).getStatus()).isEqualTo(ProcessInstance.STATE_COMPLETED);
}
}