/* * 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. * * 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.persistence.map.impl; import org.drools.core.process.instance.WorkItemHandler; import org.jbpm.process.instance.ProcessInstance; import org.jbpm.ruleflow.core.RuleFlowProcess; import org.jbpm.ruleflow.instance.RuleFlowProcessInstance; import org.jbpm.test.util.AbstractBaseTest; import org.junit.Assert; import org.junit.Test; import org.kie.api.KieBase; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemManager; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; public abstract class MapPersistenceTest extends AbstractBaseTest { @Test public void startProcessInPersistentEnvironment() { String processId = "minimalProcess"; KieBase kbase = createKieBase(ProcessCreatorForHelp.newShortestProcess( processId ) ); StatefulKnowledgeSession crmPersistentSession = createSession(kbase); crmPersistentSession.startProcess(processId); crmPersistentSession.dispose(); } @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 signalEventTest() { String processId = "signalProcessTest"; String eventType = "myEvent"; RuleFlowProcess process = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); KieBase kbase = createKieBase(process); StatefulKnowledgeSession crmPersistentSession = createSession(kbase); RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) crmPersistentSession.startProcess( processId ); long processInstanceId = processInstance.getId(); Assert.assertEquals( ProcessInstance.STATE_ACTIVE, processInstance.getState() ); crmPersistentSession = createSession(kbase); crmPersistentSession.signalEvent( eventType, null ); processInstance = (RuleFlowProcessInstance) crmPersistentSession.getProcessInstance( processInstanceId ); Assert.assertNull( processInstance ); } @Test public void executeMultipleProcessTest() { String processId = "minimalProcess"; String workName = "MyWork"; KieBase kbase = createKieBase(ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession ksession1 = createSession(kbase); long ksession1Id = ksession1.getIdentifier(); StatefulKnowledgeSession ksession2 = createSession(kbase); long ksession2Id = ksession2.getIdentifier(); DummyWorkItemHandler handler1 = new DummyWorkItemHandler(); ksession1.getWorkItemManager() .registerWorkItemHandler( workName, handler1 ); DummyWorkItemHandler handler2 = new DummyWorkItemHandler(); ksession2.getWorkItemManager() .registerWorkItemHandler( workName, handler2 ); long process1Id = ksession1.startProcess( processId ).getId(); long workItem1Id = handler1.getLatestWorkItem().getId(); ksession1 = disposeAndReloadSession( ksession1, ksession1Id, kbase); ksession1.getWorkItemManager().completeWorkItem( workItem1Id, null ); Assert.assertNull( ksession1.getProcessInstance( process1Id ) ); ksession2 = disposeAndReloadSession(ksession2, ksession2Id, kbase); Assert.assertNotNull(ksession2); ksession2.getWorkItemManager() .registerWorkItemHandler( workName, handler2 ); long process2Id = ksession2.startProcess( processId ).getId(); long workItem2Id = handler2.getLatestWorkItem().getId(); ksession2.getWorkItemManager().completeWorkItem( workItem2Id, null ); Assert.assertNull( ksession2.getProcessInstance( process2Id ) ); } @Test public void multipleKSessionDifferentIdTest() { KieBase kbase1 = KnowledgeBaseFactory.newKnowledgeBase(); KieBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase(); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); Assert.assertNotSame(ksession1.getIdentifier(), ksession2.getIdentifier()); } @Test public void multipleSessionsWithSameProcessAndDifferentIdTest() { String processId = "signalProcessTest"; String eventType = "myEvent"; RuleFlowProcess process1 = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); RuleFlowProcess process2 = ProcessCreatorForHelp.newSimpleEventProcess( processId, eventType ); KieBase kbase1 = createKieBase(process1); KieBase kbase2 = createKieBase(process2); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); Assert.assertNotSame(ksession1.getIdentifier(), ksession2.getIdentifier()); Long processInstance1Id = ksession1.startProcess(processId).getId(); Long processInstance2Id = ksession2.startProcess(processId).getId(); Assert.assertNotSame(processInstance1Id, processInstance2Id); } @Test public void multipleSessionsWithSameProcessAndSameWorkItemAndDifferentIdTest() { String processId = "minimalProcess"; String workName = "MyWork"; KieBase kbase1 = createKieBase(ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); KieBase kbase2 = createKieBase(ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession ksession1 = createSession(kbase1); StatefulKnowledgeSession ksession2 = createSession(kbase2); DummyWorkItemHandler handler1 = new DummyWorkItemHandler(); DummyWorkItemHandler handler2 = new DummyWorkItemHandler(); ksession1.getWorkItemManager().registerWorkItemHandler(workName, handler1); ksession2.getWorkItemManager().registerWorkItemHandler(workName, handler2); ksession1.startProcess(processId); ksession2.startProcess(processId); long workItem1Id = handler1.getLatestWorkItem().getId(); long workItem2Id = handler2.getLatestWorkItem().getId(); Assert.assertNotSame(workItem1Id, workItem2Id); } @Test public void crashProcessBeforePersisting() { String processId = "myProcess"; String workName = "someWork"; int knowledgeSessionsCountBeforeTest = getKnowledgeSessionsCount(); int processInstancesBeforeTest = getProcessInstancesCount(); KieBase kbase = createKieBase(ProcessCreatorForHelp.newProcessWithOneWork( processId, workName ) ); StatefulKnowledgeSession crmPersistentSession = createSession( kbase ); ChrashingWorkItemHandler handler = new ChrashingWorkItemHandler(); crmPersistentSession.getWorkItemManager() .registerWorkItemHandler( workName, handler ); try { crmPersistentSession.startProcess( processId ); Assert.fail(); } catch ( RuntimeException re ) { } Assert.assertEquals( knowledgeSessionsCountBeforeTest + 1, getKnowledgeSessionsCount() ); Assert.assertEquals( processInstancesBeforeTest, getProcessInstancesCount() ); } @Test public void processWithSubProcessThatCrashTest() { String processId = "minimalProcess"; String subProcessId = "subProcess"; String workName = "MyWork"; int knowledgeSessionsCountBeforeTest = getKnowledgeSessionsCount(); int processInstancesBeforeTest = getProcessInstancesCount(); KieBase kbase = createKieBase( ProcessCreatorForHelp.newProcessWithOneWork(subProcessId, workName), ProcessCreatorForHelp.newProcessWithOneSubProcess(processId, subProcessId)); StatefulKnowledgeSession ksession = createSession(kbase); ChrashingWorkItemHandler handler = new ChrashingWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler(workName, handler); try { ksession.startProcess(processId); Assert.fail(); } catch ( RuntimeException re ) { Assert.assertEquals( knowledgeSessionsCountBeforeTest + 1, getKnowledgeSessionsCount() ); Assert.assertEquals( processInstancesBeforeTest, getProcessInstancesCount() ); } } protected abstract StatefulKnowledgeSession createSession(KieBase kbase); protected abstract StatefulKnowledgeSession disposeAndReloadSession(StatefulKnowledgeSession crmPersistentSession, long ksessionId, KieBase kbase); protected abstract int getProcessInstancesCount(); protected abstract int getKnowledgeSessionsCount(); private static class DummyWorkItemHandler implements WorkItemHandler { private WorkItem latestWorkItem; public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { this.setLatestWorkItem( workItem ); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } public void setLatestWorkItem(WorkItem latestWorkItem) { this.latestWorkItem = latestWorkItem; } public WorkItem getLatestWorkItem() { return latestWorkItem; } } private static class ChrashingWorkItemHandler implements WorkItemHandler { public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { throw new RuntimeException( "I die" ); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } } }