/*
* 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.session;
import static org.jbpm.persistence.util.PersistenceUtil.JBPM_PERSISTENCE_UNIT_NAME;
import static org.jbpm.persistence.util.PersistenceUtil.cleanUp;
import static org.jbpm.persistence.util.PersistenceUtil.createEnvironment;
import static org.jbpm.persistence.util.PersistenceUtil.setupWithPoolingDataSource;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.HashMap;
import javax.naming.InitialContext;
import javax.transaction.UserTransaction;
import org.jbpm.persistence.processinstance.InfinispanProcessInstanceManager;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.Environment;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.persistence.infinispan.InfinispanKnowledgeService;
import org.kie.internal.runtime.StatefulKnowledgeSession;
/**
* This test looks at the behavior of the {@link InfinispanProcessInstanceManager}
* with regards to created (but not started) process instances
* and whether the process instances are available or not after creation.
*/
public class GetProcessInstancesTest {
private HashMap<String, Object> context;
private Environment env;
private KnowledgeBase kbase;
private long sessionId;
@Before
public void setUp() throws Exception {
context = setupWithPoolingDataSource(JBPM_PERSISTENCE_UNIT_NAME);
env = createEnvironment(context);
kbase = createBase();
StatefulKnowledgeSession ksession = InfinispanKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
sessionId = ksession.getIdentifier();
ksession.dispose();
}
@After
public void tearDown() throws Exception {
cleanUp(context);
}
@Test
public void getEmptyProcessInstances() throws Exception {
StatefulKnowledgeSession ksession = reloadKnowledgeSession();
assertEquals(0, ksession.getProcessInstances().size());
ksession.dispose();
}
@Test
public void create2ProcessInstances() throws Exception {
long[] processId = new long[2];
StatefulKnowledgeSession ksession = reloadKnowledgeSession();
processId[0] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId();
processId[1] = ksession.createProcessInstance("org.jbpm.processinstance.helloworld", null).getId();
ksession.dispose();
assertProcessInstancesExist(processId);
}
/**
* Helper functions
*/
private void assertProcessInstancesExist(long[] processId) {
StatefulKnowledgeSession ksession = reloadKnowledgeSession();
for (long id : processId) {
assertNotNull("Process instance " + id + " should not exist!", ksession.getProcessInstance(id));
}
}
private void assertProcessInstancesNotExist(long[] processId) {
StatefulKnowledgeSession ksession = reloadKnowledgeSession();
for (long id : processId) {
assertNull(ksession.getProcessInstance(id));
}
}
private KnowledgeBase createBase() {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("processinstance/HelloWorld.rf"), ResourceType.DRF);
assertFalse(kbuilder.getErrors().toString(), kbuilder.hasErrors());
return kbuilder.newKnowledgeBase();
}
private StatefulKnowledgeSession reloadKnowledgeSession() {
return InfinispanKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env);
}
private StatefulKnowledgeSession reloadKnowledgeSession(StatefulKnowledgeSession ksession) {
ksession.dispose();
return reloadKnowledgeSession();
}
}