Skip to content

Commit

Permalink
feat(quarkus-extension): add persistence integration
Browse files Browse the repository at this point in the history
* Integrates the Quarkus engine extension into Agroal.
* Configures on-disk H2 as default datasource (CAM-13635).
* Adds the config property `datasource` to select a datasource.
* Introduces a JUnit 5 extension `ProcessEngineAwareExtension` which allows using the `@Deployment` annotation on test methods.

related to CAM-13632, closes camunda#1576
  • Loading branch information
tasso94 authored Aug 18, 2021
1 parent 6df60d6 commit 6f03067
Show file tree
Hide file tree
Showing 48 changed files with 1,475 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ public void testRollbackTransactionOnActivitiException() {

// The hello() method will start the process. The process will wait in a user task
userBean.hello();

jdbcTemplate.update("insert into MY_TABLE values ('test');");
int results = jdbcTemplate.queryForObject("select count(*) from MY_TABLE", Integer.class);
assertEquals(0, results);
assertEquals(1, results);

// The completeTask() method will write a record to the 'MY_TABLE' table and complete the user task
try {
Expand All @@ -77,7 +79,7 @@ public void testRollbackTransactionOnActivitiException() {
// the record and the process must be rolled back !
assertEquals("My Task", taskService.createTaskQuery().singleResult().getName());
results = jdbcTemplate.queryForObject("select count(*) from MY_TABLE", Integer.class);
assertEquals(0, results);
assertEquals(1, results);

// Cleanup
jdbcTemplate.execute("drop table MY_TABLE if exists;");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.Assert.assertEquals;

/**
* @author Tom Baeyens
Expand Down Expand Up @@ -52,14 +53,18 @@ public void completeTask(String taskId) {

// First insert a record in the MY_TABLE table
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int results = jdbcTemplate.queryForObject("select count(*) from MY_TABLE", Integer.class);
assertEquals(1, results);
int nrOfRows = jdbcTemplate.update("insert into MY_TABLE values ('test');");
if (nrOfRows != 1) {
throw new RuntimeException("Insert into MY_TABLE failed");
}


results = jdbcTemplate.queryForObject("select count(*) from MY_TABLE", Integer.class);
assertEquals(2, results);
taskService.complete(taskId);
}

// getters and setters //////////////////////////////////////////////////////

@Required
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
import org.camunda.bpm.engine.test.Deployment;
import org.camunda.bpm.engine.test.RequiredHistoryLevel;
import org.junit.Assert;
import org.junit.runner.Description;
import org.slf4j.Logger;


Expand Down Expand Up @@ -206,17 +205,6 @@ private static String createResourceName(Class< ? > type, String name, String su
return r.append("." + suffix).toString();
}

public static boolean annotationRequiredHistoryLevelCheck(ProcessEngine processEngine, Description description) {
RequiredHistoryLevel annotation = description.getAnnotation(RequiredHistoryLevel.class);

if (annotation != null) {
return historyLevelCheck(processEngine, annotation);

} else {
return annotationRequiredHistoryLevelCheck(processEngine, description.getTestClass(), description.getMethodName());
}
}

private static boolean historyLevelCheck(ProcessEngine processEngine, RequiredHistoryLevel annotation) {
ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration();

Expand Down Expand Up @@ -246,17 +234,6 @@ public static boolean annotationRequiredHistoryLevelCheck(ProcessEngine processE
}
}

public static boolean annotationRequiredDatabaseCheck(ProcessEngine processEngine, Description description) {
RequiredDatabase annotation = description.getAnnotation(RequiredDatabase.class);

if (annotation != null) {
return databaseCheck(processEngine, annotation);

} else {
return annotationRequiredDatabaseCheck(processEngine, description.getTestClass(), description.getMethodName());
}
}

public static boolean annotationRequiredDatabaseCheck(ProcessEngine processEngine, Class<?> testClass, String methodName) {
RequiredDatabase annotation = getAnnotation(processEngine, testClass, methodName, RequiredDatabase.class);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,10 @@ public Statement apply(final Statement base, final Description description) {

initializeServices();

final boolean hasRequiredHistoryLevel = TestHelper.annotationRequiredHistoryLevelCheck(processEngine, description);
final boolean runsWithRequiredDatabase = TestHelper.annotationRequiredDatabaseCheck(processEngine, description);
final boolean hasRequiredHistoryLevel =
TestHelper.annotationRequiredHistoryLevelCheck(processEngine, description.getTestClass(), description.getMethodName());
final boolean runsWithRequiredDatabase =
TestHelper.annotationRequiredDatabaseCheck(processEngine, description.getTestClass(), description.getMethodName());
return new Statement() {

@Override
Expand Down
16 changes: 5 additions & 11 deletions quarkus-extension/engine/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,11 @@
<scope>test</scope>
</dependency>

<!-- <dependency>-->
<!-- <groupId>io.quarkus</groupId>-->
<!-- <artifactId>quarkus-jdbc-h2-deployment</artifactId>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->

<!-- <dependency>-->
<!-- <groupId>io.quarkus</groupId>-->
<!-- <artifactId>quarkus-test-h2</artifactId>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-h2-deployment</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.assertj</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,11 @@
*/
package org.camunda.bpm.quarkus.engine.extension.deployment.impl;

import static io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem.ContextConfiguratorBuildItem;
import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;

import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.BeanContainerBuildItem;
import io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem;
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
import io.quarkus.arc.runtime.BeanContainer;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Consume;
Expand All @@ -31,7 +29,6 @@
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.runtime.RuntimeValue;
import org.camunda.bpm.engine.cdi.BusinessProcess;
import org.camunda.bpm.engine.cdi.CdiStandaloneProcessEngineConfiguration;
import org.camunda.bpm.engine.cdi.ProcessVariables;
import org.camunda.bpm.engine.cdi.annotation.BusinessProcessScoped;
import org.camunda.bpm.engine.cdi.compat.CamundaTaskForm;
Expand All @@ -45,10 +42,14 @@
import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineConfig;
import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineRecorder;
import org.camunda.bpm.quarkus.engine.extension.impl.InjectableBusinessProcessContext;
import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration;
import org.jboss.jandex.DotName;

import javax.enterprise.context.Dependent;

import static io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem.ContextConfiguratorBuildItem;
import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;

public class CamundaEngineProcessor {

protected static final String FEATURE = "camunda-platform-engine";
Expand All @@ -62,7 +63,7 @@ protected FeatureBuildItem feature() {
protected void unremovableBeans(BuildProducer<UnremovableBeanBuildItem> unremovableBeansProducer) {
unremovableBeansProducer.produce(UnremovableBeanBuildItem.beanTypes(
RequestScopedAssociation.class,
CdiStandaloneProcessEngineConfiguration.class // TODO: replace Standalone with JTA configuration
QuarkusProcessEngineConfiguration.class
));
}

Expand Down Expand Up @@ -101,20 +102,20 @@ protected void cdiConfig(CamundaEngineRecorder recorder, BeanContainerBuildItem
@BuildStep
@Record(RUNTIME_INIT)
protected void processEngineConfiguration(CamundaEngineRecorder recorder,
BeanContainerBuildItem beanContainer,
BeanContainerBuildItem beanContainerBuildItem,
CamundaEngineConfig camundaEngineConfig,
BuildProducer<ProcessEngineConfigurationBuildItem> configurationProducer) {

recorder.configureProcessEngineCdiBeans(beanContainer.getValue());
BeanContainer beanContainer = beanContainerBuildItem.getValue();
recorder.configureProcessEngineCdiBeans(beanContainer);
RuntimeValue<ProcessEngineConfigurationImpl> processEngineConfiguration =
recorder.createProcessEngineConfiguration(beanContainer.getValue(), camundaEngineConfig);
recorder.createProcessEngineConfiguration(beanContainer, camundaEngineConfig);
configurationProducer.produce(new ProcessEngineConfigurationBuildItem(processEngineConfiguration));
}

@BuildStep
@Record(RUNTIME_INIT)
protected void processEngine(CamundaEngineRecorder recorder,
BeanContainerBuildItem beanContainerBuildItem,
ProcessEngineConfigurationBuildItem processEngineConfigurationBuildItem,
BuildProducer<ProcessEngineBuildItem> processEngineProducer) {

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.quarkus.arc.InjectableInstance;
import io.quarkus.test.QuarkusUnitTest;
import org.camunda.bpm.engine.cdi.annotation.BusinessProcessScoped;
import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
Expand All @@ -34,7 +35,7 @@
public class BusinessProcessContextTest {

@RegisterExtension
protected static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
protected static final QuarkusUnitTest unitTest = new ProcessEngineAwareExtension()
.withConfigurationResource("application.properties")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import io.quarkus.test.QuarkusUnitTest;
import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineConfig;
import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
Expand All @@ -30,7 +31,7 @@
public class CamundaEngineConfigTest {

@RegisterExtension
static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
static final QuarkusUnitTest unitTest = new ProcessEngineAwareExtension()
.withConfigurationResource("job-executor-application.properties")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,6 @@
*/
package org.camunda.bpm.quarkus.engine.test;

import static org.assertj.core.api.Assertions.assertThat;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;

import io.quarkus.test.QuarkusUnitTest;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration;
Expand All @@ -30,6 +24,12 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;

import static org.assertj.core.api.Assertions.assertThat;

public class ConfigurableProcessEngineTest {

@RegisterExtension
Expand All @@ -41,12 +41,13 @@ public class ConfigurableProcessEngineTest {
static class MyConfig {

@Produces
public QuarkusProcessEngineConfiguration getCustomProcessEngineConfig() {
public QuarkusProcessEngineConfiguration customEngineConfig() {

QuarkusProcessEngineConfiguration quarkusProcessEngineConfiguration = new QuarkusProcessEngineConfiguration();
quarkusProcessEngineConfiguration.setProcessEngineName("customEngine");
QuarkusProcessEngineConfiguration engineConfig = new QuarkusProcessEngineConfiguration();
engineConfig.setProcessEngineName("customEngine");
engineConfig.setJobExecutorActivate(false);

return quarkusProcessEngineConfiguration;
return engineConfig;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import io.quarkus.test.QuarkusUnitTest;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
Expand All @@ -30,7 +31,7 @@
public class EmbeddedProcessEngineTest {

@RegisterExtension
protected static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
protected static final QuarkusUnitTest unitTest = new ProcessEngineAwareExtension()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,34 +16,36 @@
*/
package org.camunda.bpm.quarkus.engine.test;

import static org.assertj.core.api.Assertions.assertThat;

import javax.inject.Inject;

import io.quarkus.test.QuarkusUnitTest;
import org.camunda.bpm.engine.ManagementService;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.camunda.bpm.engine.impl.jobexecutor.JobExecutor;
import org.camunda.bpm.engine.impl.test.TestHelper;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.test.Deployment;
import org.camunda.bpm.quarkus.engine.extension.impl.ManagedJobExecutor;
import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration;
import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension;
import org.eclipse.microprofile.context.ManagedExecutor;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import javax.inject.Inject;

import static org.assertj.core.api.Assertions.assertThat;

public class ManagedJobExecutorTest {

@RegisterExtension
static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
static final QuarkusUnitTest unitTest = new ProcessEngineAwareExtension()
.engineConfig(QuarkusProcessEngineConfiguration::new) // Use default config with Job Executor enabled
.withConfigurationResource("job-executor-application.properties")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addAsResource("org/camunda/bpm/quarkus/engine/test/asyncServiceTask.bpmn20.xml"));
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));

@Inject
ManagedExecutor managedExecutor;
Expand All @@ -57,16 +59,10 @@ public class ManagedJobExecutorTest {
@Inject
protected ManagementService managementService;

@Inject
protected RepositoryService repositoryService;

protected ProcessEngineConfigurationImpl processEngineConfiguration;

@BeforeEach
protected void setUp() {
repositoryService.createDeployment()
.addClasspathResource("org/camunda/bpm/quarkus/engine/test/asyncServiceTask.bpmn20.xml")
.deploy();
processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine
.getProcessEngineConfiguration();
}
Expand Down Expand Up @@ -118,7 +114,8 @@ public void shouldNotReuseManagedExecutor() {
}

@Test
public void shouldExecuteJob() throws InterruptedException {
@Deployment
public void shouldExecuteJob() {
// given
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("asyncTaskProcess");

Expand Down
Loading

0 comments on commit 6f03067

Please sign in to comment.