From 1df190d1dae0cf8aee9795a112e8bea26e651828 Mon Sep 17 00:00:00 2001 From: holgerhagen Date: Wed, 3 Nov 2021 15:10:32 +0100 Subject: [PATCH] TSK-1757: Added ParallelThreadHelper to support multi threaded tests. --- .../test/util/ParallelThreadHelper.java | 30 +++++++++++++++++++ .../acceptance/jobs/JobRunnerAccTest.java | 14 ++------- .../task/SelectAndClaimTaskAccTest.java | 15 ++-------- 3 files changed, 35 insertions(+), 24 deletions(-) create mode 100644 common/taskana-common-test/src/main/java/pro/taskana/common/test/util/ParallelThreadHelper.java diff --git a/common/taskana-common-test/src/main/java/pro/taskana/common/test/util/ParallelThreadHelper.java b/common/taskana-common-test/src/main/java/pro/taskana/common/test/util/ParallelThreadHelper.java new file mode 100644 index 000000000..2012aaeae --- /dev/null +++ b/common/taskana-common-test/src/main/java/pro/taskana/common/test/util/ParallelThreadHelper.java @@ -0,0 +1,30 @@ +package pro.taskana.common.test.util; + +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Collection; +import java.util.concurrent.ConcurrentLinkedQueue; + +import pro.taskana.common.api.exceptions.SystemException; + +public class ParallelThreadHelper { + + public static void runInThread(Runnable runnable, int threadCount) throws Exception { + Thread[] threads = new Thread[threadCount]; + + Collection errors = new ConcurrentLinkedQueue<>(); + UncaughtExceptionHandler uncaughtExceptionHandler = (t, e) -> errors.add(e); + + for (int i = 0; i < threads.length; i++) { + threads[i] = new Thread(runnable); + threads[i].setUncaughtExceptionHandler(uncaughtExceptionHandler); + threads[i].start(); + } + for (Thread thread : threads) { + thread.join(); + } + if (!errors.isEmpty()) { + errors.forEach(Throwable::printStackTrace); + throw new SystemException("at least 1 thread caught an exception."); + } + } +} diff --git a/lib/taskana-core/src/test/java/acceptance/jobs/JobRunnerAccTest.java b/lib/taskana-core/src/test/java/acceptance/jobs/JobRunnerAccTest.java index 78161662c..e903c858d 100644 --- a/lib/taskana-core/src/test/java/acceptance/jobs/JobRunnerAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/jobs/JobRunnerAccTest.java @@ -22,6 +22,7 @@ import pro.taskana.common.internal.JobServiceImpl; import pro.taskana.common.internal.jobs.JobRunner; import pro.taskana.common.internal.jobs.PlainJavaTransactionProvider; import pro.taskana.common.test.config.DataSourceGenerator; +import pro.taskana.common.test.util.ParallelThreadHelper; import pro.taskana.task.internal.jobs.TaskCleanupJob; @Disabled @@ -37,7 +38,7 @@ class JobRunnerAccTest extends AbstractAccTest { ScheduledJob job = createJob(Instant.now().minus(5, ChronoUnit.MINUTES)); assertThat(jobService.findJobsToRun()).containsExactly(job); - runInThread( + ParallelThreadHelper.runInThread( () -> { try { TaskanaEngine taskanaEngine = @@ -69,17 +70,6 @@ class JobRunnerAccTest extends AbstractAccTest { assertThat(jobsToRun).hasSize(1).doesNotContain(job); } - private void runInThread(Runnable runnable, int threadCount) throws Exception { - Thread[] threads = new Thread[threadCount]; - for (int i = 0; i < threads.length; i++) { - threads[i] = new Thread(runnable); - threads[i].start(); - } - for (Thread thread : threads) { - thread.join(); - } - } - private ScheduledJob createJob(Instant firstDue) { ScheduledJob job = new ScheduledJob(); job.setType(TaskCleanupJob.class.getName()); diff --git a/lib/taskana-core/src/test/java/acceptance/task/SelectAndClaimTaskAccTest.java b/lib/taskana-core/src/test/java/acceptance/task/SelectAndClaimTaskAccTest.java index 6e602c708..709185866 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/SelectAndClaimTaskAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/task/SelectAndClaimTaskAccTest.java @@ -22,6 +22,7 @@ import pro.taskana.common.api.security.UserPrincipal; import pro.taskana.common.internal.util.CheckedConsumer; import pro.taskana.common.test.security.JaasExtension; import pro.taskana.common.test.security.WithAccessId; +import pro.taskana.common.test.util.ParallelThreadHelper; import pro.taskana.task.api.TaskQuery; import pro.taskana.task.api.TaskService; import pro.taskana.task.api.models.Task; @@ -39,7 +40,8 @@ class SelectAndClaimTaskAccTest extends AbstractAccTest { Stream.of("admin", "teamlead-1", "teamlead-2", "taskadmin") .collect(Collectors.toList())); - runInThread(getRunnableTest(selectedAndClaimedTasks, accessIds), accessIds.size()); + ParallelThreadHelper.runInThread( + getRunnableTest(selectedAndClaimedTasks, accessIds), accessIds.size()); assertThat(selectedAndClaimedTasks) .extracting(Task::getId) @@ -67,17 +69,6 @@ class SelectAndClaimTaskAccTest extends AbstractAccTest { + "task query returned nothing!"); } - private void runInThread(Runnable runnable, int threadCount) throws InterruptedException { - Thread[] threads = new Thread[threadCount]; - for (int i = 0; i < threads.length; i++) { - threads[i] = new Thread(runnable); - threads[i].start(); - } - for (Thread thread : threads) { - thread.join(); - } - } - private Runnable getRunnableTest(List selectedAndClaimedTasks, List accessIds) { return () -> { Subject subject = new Subject();