/*
* Copyright 2012 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.bpmn2.structureref;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.jbpm.bpmn2.JbpmBpmn2TestCase;
import org.jbpm.bpmn2.StartEventTest;
import org.jbpm.bpmn2.objects.Person;
import org.jbpm.bpmn2.objects.TestWorkItemHandler;
import org.jbpm.process.core.context.variable.VariableScope;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.ProcessInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RunWith(Parameterized.class)
public class StructureRefTest extends JbpmBpmn2TestCase {
@Parameters
public static Collection<Object[]> persistence() {
Object[][] data = new Object[][] { { false } };
return Arrays.asList(data);
};
private static final Logger logger = LoggerFactory.getLogger(StartEventTest.class);
public StructureRefTest(boolean persistence) {
super(persistence);
}
@Test
public void testStringStructureRef() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-StringStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", "test value");
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testBooleanStructureRef() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-BooleanStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", "true");
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testIntegerStructureRef() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-IntegerStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", "25");
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testFloatStructureRef() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-FloatStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", "5.5");
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testObjectStructureRef() throws Exception {
String personAsXml = "<org.jbpm.bpmn2.objects.Person><id>1</id><name>john</name></org.jbpm.bpmn2.objects.Person>";
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-ObjectStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", personAsXml);
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testDefaultObjectStructureRef() throws Exception {
String value = "simple text for testing";
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DefaultObjectStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", value);
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test
public void testNoStructureRef() throws Exception {
Person person = new Person();
person.setId(1L);
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-NoStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", person);
ksession.getWorkItemManager().completeWorkItem(
workItemHandler.getWorkItem().getId(), res);
assertProcessInstanceCompleted(processInstance.getId(), ksession);
}
@Test(expected=IllegalArgumentException.class)
public void testNotExistingVarBooleanStructureRefOnStart() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-BooleanStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
Map<String, Object> params = new HashMap<String, Object>();
params.put("not existing", "invalid boolean");
ksession.startProcess("StructureRef", params);
}
@Test(expected=IllegalArgumentException.class)
public void testInvalidBooleanStructureRefOnStart() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-BooleanStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
Map<String, Object> params = new HashMap<String, Object>();
params.put("test", "invalid boolean");
ksession.startProcess("StructureRef", params);
}
@Test
public void testInvalidBooleanStructureRefOnWIComplete() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-IntegerStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Map<String, Object> res = new HashMap<String, Object>();
res.put("testHT", true);
try {
ksession.getWorkItemManager().completeWorkItem(workItemHandler.getWorkItem().getId(), res);
fail();
} catch (IllegalArgumentException iae) {
logger.info("Expected IllegalArgumentException caught: " + iae);
} catch (Exception e) {
fail();
}
}
@Test
public void testInvalidBooleanStructureRefOnStartVerifyErrorMsg() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-BooleanStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
try {
Map<String, Object> params = new HashMap<String, Object>();
params.put("test", "invalid boolean");
ksession.startProcess("StructureRef", params);
} catch (IllegalArgumentException e) {
assertEquals("Variable 'test' has incorrect data type expected:Boolean actual:java.lang.String", e.getMessage());
}
}
@Test
public void testInvalidBooleanStructureRefOnStartWithDisabledCheck() throws Exception {
// Temporarily disable check for variables strict that is enabled by default for tests
VariableScope.setVariableStrictOption(false);
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-BooleanStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
Map<String, Object> params = new HashMap<String, Object>();
params.put("test", "invalid boolean");
ksession.startProcess("StructureRef", params);
// enable it back for other tests
VariableScope.setVariableStrictOption(true);
}
@Test
public void testNotExistingBooleanStructureRefOnWIComplete() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-IntegerStructureRef.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
workItemHandler);
ProcessInstance processInstance = ksession.startProcess("StructureRef");
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
String wrongDataOutput = "not existing";
Map<String, Object> res = new HashMap<String, Object>();
res.put(wrongDataOutput, true);
try {
ksession.getWorkItemManager().completeWorkItem(workItemHandler.getWorkItem().getId(), res);
fail();
} catch (IllegalArgumentException iae) {
System.out.println("Expected IllegalArgumentException catched: " + iae);
assertEquals("Data output '"+ wrongDataOutput +"' is not defined in process 'StructureRef' for task 'User Task'", iae.getMessage());
} catch (Exception e) {
fail();
}
}
}