@Test public void testMultipleMessageSignalSubprocess() throws Exception { KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-MultipleMessageSignalSubprocess.bpmn2"); ksession = createKnowledgeSession(kbase); ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.Multiple_MessageSignal_Subprocess"); logger.debug("Parent Process ID: " + processInstance.getId()); ksession.signalEvent("Message-Message 1","Test",processInstance.getId()); assertProcessInstanceActive(processInstance.getId(), ksession); ksession.signalEvent("Message-Message 1","Test",processInstance.getId()); assertProcessInstanceCompleted(processInstance.getId(), ksession); }
@Test public void compensationInvokingSubProcess() throws Exception { KieSession ksession = createKnowledgeSession("compensation/BPMN2-UserTaskCompensation.bpmn2"); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler()); Map<String, Object> params = new HashMap<String, Object>(); params.put("compensation", "True"); ProcessInstance processInstance = ksession.startProcess("UserTaskCompensation", params); assertProcessInstanceCompleted(processInstance.getId(), ksession); assertProcessVarValue(processInstance, "compensation", "compensation"); }
@Test public void testMultipleEnabledOnSingleConditionalSequenceFlow() throws Exception { System.setProperty("jbpm.enable.multi.con", "true"); KieBase kbase = createKnowledgeBase("BPMN2-MultiConnEnabled.bpmn2"); ksession = createKnowledgeSession(kbase); final List<Long> list = new ArrayList<Long>(); ksession.addEventListener(new DefaultProcessEventListener() { public void afterNodeTriggered(org.kie.api.event.process.ProcessNodeTriggeredEvent event) { if ("Task2".equals(event.getNodeInstance().getNodeName())) { list.add(event.getNodeInstance().getNodeId()); } } }); assertEquals(0, list.size()); ProcessInstance processInstance = ksession.startProcess("BPMN2-MultiConnEnabled"); assertProcessInstanceActive(processInstance); ksession.signalEvent("signal", null, processInstance.getId()); assertProcessInstanceCompleted(processInstance); assertEquals(1, list.size()); System.clearProperty("jbpm.enable.multi.con"); }
@Test public void noProcessInstancesLeftWithPreTxKSessionAndRollback() throws Exception { long[] notProcess = new long[4]; StatefulKnowledgeSession ksession = reloadKnowledgeSession(); UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" ); ut.begin(); notProcess[0] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); notProcess[1] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); ut.rollback(); // Validate that proc inst mgr cache is also flushed on rollback assertEquals(0, ksession.getProcessInstances().size()); ksession = reloadKnowledgeSession(ksession); assertEquals(0, ksession.getProcessInstances().size()); ksession.dispose(); assertProcessInstancesNotExist(notProcess); }
@Test public void testPersistenceState() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( new ClassPathResource( "StateProcess.rf" ), ResourceType.DRF ); InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addPackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); long id = ksession.getIdentifier(); ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" ); logger.debug( "Started process instance {}", processInstance.getId() ); ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env ); processInstance = ksession.getProcessInstance( processInstance.getId() ); assertNotNull( processInstance ); ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env ); ksession.insert(new ArrayList<Object>()); ksession.fireAllRules(); ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env ); processInstance = ksession.getProcessInstance( processInstance.getId() ); assertNull( processInstance ); }
@Test public void createProcessStartItDisposeAndLoadItAgain() { String processId = "minimalProcess"; String workName = "MyWork"; KieBase kbase = createKieBase(ProcessCreatorForHelp.newProcessWithOneWork( processId, workName )); StatefulKnowledgeSession ksession = createSession(kbase); long ksessionId = ksession.getIdentifier(); DummyWorkItemHandler handler = new DummyWorkItemHandler(); ksession.getWorkItemManager() .registerWorkItemHandler(workName, handler); long process1Id = ksession.startProcess(processId).getId(); ksession = disposeAndReloadSession(ksession, ksessionId, kbase); ksession.getWorkItemManager().registerWorkItemHandler(workName, handler); long workItemId = handler.getLatestWorkItem().getId(); ksession.getWorkItemManager().completeWorkItem(workItemId, null); Assert.assertNotNull(ksession); Assert.assertNull( ksession.getProcessInstance( process1Id ) ); }
@Test public void testErrorBoundaryEventOnEntry() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-BoundaryErrorEventCatchingOnEntryException.bpmn2"); ksession = createKnowledgeSession(kbase); TestWorkItemHandler handler = new TestWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task",handler); ProcessInstance processInstance = ksession .startProcess("BoundaryErrorEventOnEntry"); assertProcessInstanceActive(processInstance.getId(), ksession); assertEquals(1, handler.getWorkItems().size()); }
@Test public void testAsyncAuditProducer() throws Exception { Environment env = createEnvironment(context); // load the process KieBase kbase = createKnowledgeBase(); // create a new session KieSession session = createSession(kbase, env); Map<String, Object> jmsProps = new HashMap<String, Object>(); jmsProps.put("jbpm.audit.jms.transacted", false); jmsProps.put("jbpm.audit.jms.connection.factory", factory); jmsProps.put("jbpm.audit.jms.queue", queue); AbstractAuditLogger logger = AuditLoggerFactory.newInstance(Type.JMS, session, jmsProps); Assertions.assertThat(logger).isNotNull(); Assertions.assertThat((logger instanceof AsyncAuditLogProducer)).isTrue(); // start process instance long processInstanceId = session.startProcess("com.sample.ruleflow").getId(); // setup listener MessageReceiver receiver = new MessageReceiver(); List<Message> messages = receiver.receive(queue); Assertions.assertThat(messages).isNotNull(); Assertions.assertThat(messages.size()).isEqualTo(11); }
@Test public void noProcessInstancesLeftAfterRollback() throws Exception { long[] notProcess = new long[2]; UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" ); ut.begin(); StatefulKnowledgeSession ksession = reloadKnowledgeSession(); notProcess[0] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); notProcess[1] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); assertEquals(2, ksession.getProcessInstances().size()); ut.rollback(); // Validate that proc inst mgr cache is also flushed on rollback assertEquals(0, ksession.getProcessInstances().size()); ksession = reloadKnowledgeSession(ksession); assertEquals(0, ksession.getProcessInstances().size()); ksession.dispose(); assertProcessInstancesNotExist(notProcess); }
@Test public void testEscalationEndEventProcess() throws Exception { KieBase kbase = createKnowledgeBase("escalation/BPMN2-EscalationEndEvent.bpmn2"); KieSession ksession = createKnowledgeSession(kbase); ProcessInstance processInstance = ksession.startProcess("EscalationEndEvent"); assertProcessInstanceAborted(processInstance.getId(), ksession); }
@Test public void testErrorBoundaryEvent() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-ErrorBoundaryEventInterrupting.bpmn2"); KieSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("MyTask", new DoNothingWorkItemHandler()); ProcessInstance processInstance = ksession.startProcess("ErrorBoundaryEvent"); assertProcessInstanceCompleted(processInstance.getId(), ksession); }
@Test public void createProcessInstanceAndGetStartDate() throws Exception { StatefulKnowledgeSession ksession = reloadKnowledgeSession(); long processId= ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); assertEquals(0, ksession.getProcessInstances().size()); RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) ksession.getProcessInstance(processId); assertNotNull("Process " + processId + " exist!", processInstance); assertNotNull("Process start at " + processInstance.getStartDate(), processInstance.getStartDate()); ksession.dispose(); }
@Test public void create2ProcessInstancesInsideTransaction() throws Exception { long[] processId = new long[2]; UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" ); ut.begin(); StatefulKnowledgeSession ksession = reloadKnowledgeSession(); processId[0] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); processId[1] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId(); assertEquals(2, ksession.getProcessInstances().size()); // process instance manager cache flushed on tx ut.commit(); assertEquals(0, ksession.getProcessInstances().size()); ksession = reloadKnowledgeSession(ksession); assertEquals(0, ksession.getProcessInstances().size()); ksession.dispose(); assertProcessInstancesExist(processId); }
@Test public void testErrorEndEventProcess() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-ErrorEndEvent.bpmn2"); KieSession ksession = createKnowledgeSession(kbase); ProcessInstance processInstance = ksession.startProcess("ErrorEndEvent"); assertProcessInstanceAborted(processInstance.getId(), ksession); }
@Test public void testBoundaryErrorEventDefaultHandlerWithoutErrorCodeWithoutStructureRef() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-BoundaryErrorEventDefaultHandlerWithoutErrorCodeWithoutStructureRef.bpmn2"); ksession = createKnowledgeSession(kbase); ExceptionWorkItemHandler handler = new ExceptionWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler); ProcessInstance processInstance = ksession .startProcess("com.sample.bpmn.hello"); assertNodeTriggered(processInstance.getId(), "Start", "User Task", "MyBoundaryErrorEvent"); }
@Test @RequirePersistence public void testCallActivityWithHistoryLog() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-CallActivity.bpmn2", "BPMN2-CallActivitySubProcess.bpmn2"); ksession = createKnowledgeSession(kbase); Map<String, Object> params = new HashMap<String, Object>(); params.put("x", "oldValue"); ProcessInstance processInstance = ksession.startProcess( "ParentProcess", params); assertProcessInstanceCompleted(processInstance); assertEquals("new value", ((WorkflowProcessInstance) processInstance).getVariable("y")); AuditLogService logService = new JPAAuditLogService(ksession.getEnvironment()); List<ProcessInstanceLog> subprocesses = logService.findSubProcessInstances(processInstance.getId()); assertNotNull(subprocesses); assertEquals(1, subprocesses.size()); logService.dispose(); }
@Test public void testErrorBoundaryEventOnBusinessRuleTask() throws Exception { KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-ErrorBoundaryEventOnBusinessRuleTask.bpmn2", "BPMN2-ErrorBoundaryEventOnBusinessRuleTask.drl"); ksession = createKnowledgeSession(kbase); ksession.addEventListener(new RuleAwareProcessEventLister()); ProcessInstance processInstance = ksession.startProcess("BPMN2-ErrorBoundaryEventOnBusinessRuleTask"); assertProcessInstanceFinished(processInstance, ksession); assertNodeTriggered(processInstance.getId(), "start", "business rule task error attached", "error1"); }
@Test public void testBoundaryErrorEventStructureRef() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-BoundaryErrorEventStructureRef.bpmn2"); ksession = createKnowledgeSession(kbase); ExceptionWorkItemHandler handler = new ExceptionWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler); ProcessInstance processInstance = ksession.startProcess("com.sample.bpmn.hello"); assertNodeTriggered(processInstance.getId(), "Start", "User Task", "MyBoundaryErrorEvent"); }
@Test @RequirePersistence public void testScriptTaskWithHistoryLog() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-ScriptTask.bpmn2"); ksession = createKnowledgeSession(kbase); ProcessInstance processInstance = ksession.startProcess("ScriptTask"); assertProcessInstanceCompleted(processInstance); AuditLogService logService = new JPAAuditLogService(ksession.getEnvironment()); List<NodeInstanceLog> logs = logService.findNodeInstances(processInstance.getId()); assertNotNull(logs); assertEquals(6, logs.size()); for (NodeInstanceLog log : logs) { assertNotNull(log.getDate()); } ProcessInstanceLog pilog = logService.findProcessInstance(processInstance.getId()); assertNotNull(pilog); assertNotNull(pilog.getEnd()); List<ProcessInstanceLog> pilogs = logService.findActiveProcessInstances(processInstance.getProcessId()); assertNotNull(pilogs); assertEquals(0, pilogs.size()); logService.dispose(); }
@Test public void testIntermediateCatchEventMessage() throws Exception { KieBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventMessage.bpmn2"); KieSession ksession = createKnowledgeSession(kbase); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler()); ProcessInstance processInstance = ksession.startProcess("IntermediateCatchEvent"); assertThat(processInstance.getState()).isEqualTo(ProcessInstance.STATE_ACTIVE); ksession = restoreSession(ksession, true); // now signal process instance ksession.signalEvent("Message-HelloMessage", "SomeValue", processInstance.getId()); assertProcessInstanceCompleted(processInstance.getId(), ksession); }