Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Motsch2019-10-23 10:18:30 +0000
committerIvan Motsch2019-10-23 10:30:11 +0000
commitecfbd1d5162716cd12c072ccb75ceced16c61a59 (patch)
tree42aaff9118279f5b3050f773d433296c19e5a68c
parent1d6a1ee0bc0aca03aa8d03ab80c8187cd88cc51b (diff)
downloadorg.eclipse.scout.rt-ecfbd1d5162716cd12c072ccb75ceced16c61a59.tar.gz
org.eclipse.scout.rt-ecfbd1d5162716cd12c072ccb75ceced16c61a59.tar.xz
org.eclipse.scout.rt-ecfbd1d5162716cd12c072ccb75ceced16c61a59.zip
Improved test: directly use Jobs.schedule
This test variant has a better chance to produce the expected failure in case the cancellation cancels the wrong thread. Change-Id: Ic69a545450705387fa3024db01dddc98e12517ca Signed-off-by: Ivan Motsch <ivan.motsch@bsiag.com>
-rw-r--r--org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/job/JobFutureTaskTest.java33
1 files changed, 20 insertions, 13 deletions
diff --git a/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/job/JobFutureTaskTest.java b/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/job/JobFutureTaskTest.java
index 7b70dca329..0aaf5a60d0 100644
--- a/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/job/JobFutureTaskTest.java
+++ b/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/job/JobFutureTaskTest.java
@@ -2,13 +2,12 @@ package org.eclipse.scout.rt.platform.job;
import java.util.Random;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
import org.eclipse.scout.rt.platform.chain.callable.CallableChain;
import org.eclipse.scout.rt.platform.context.RunMonitor;
@@ -18,10 +17,12 @@ import org.eclipse.scout.rt.platform.job.internal.NamedThreadFactory.ThreadInfo;
import org.eclipse.scout.rt.platform.util.Assertions;
import org.eclipse.scout.rt.platform.util.SleepUtil;
import org.eclipse.scout.rt.platform.util.concurrent.FutureCancelledError;
+import org.eclipse.scout.rt.platform.util.concurrent.ThreadInterruptedError;
import org.junit.Test;
public class JobFutureTaskTest {
private static final int ROUNDS = 100000;
+ private static final String TEST_HINT = "JobFutureTaskTest_testRaceConditionOnCancelWithJobManager";
/**
* Test that cancelling a Job will not interrupt a wrong Thread. The test only runs for a short time, so the
@@ -33,7 +34,6 @@ public class JobFutureTaskTest {
*/
@Test
public void testRaceConditionOnCancel() throws InterruptedException, ExecutionException, TimeoutException {
- ExecutorService service = Executors.newFixedThreadPool(50);
Semaphore scheduleLock = new Semaphore(100, true);
AtomicInteger failureCount = new AtomicInteger();
AtomicBoolean active = new AtomicBoolean(true);
@@ -41,7 +41,7 @@ public class JobFutureTaskTest {
//progress
AtomicInteger runCount = new AtomicInteger();
- service.submit(() -> {
+ Jobs.schedule(() -> {
long t0 = System.currentTimeMillis();
while (active.get()) {
SleepUtil.sleepSafe(1, TimeUnit.SECONDS);
@@ -49,20 +49,26 @@ public class JobFutureTaskTest {
long t1 = System.currentTimeMillis();
System.out.println("Run: " + c + " [" + (1000L * c / (t1 - t0)) + " run/sec]");
}
- });
+ }, Jobs.newInput().withExecutionHint(TEST_HINT));
+
try {
for (int i = 0; i < ROUNDS; i++) {
scheduleLock.acquire(1);
RunMonitor r = new RunMonitor();
- JobFutureTask<String> f = new JobFutureTask<String>((JobManager) Jobs.getJobManager(), r, Jobs.newInput(), new CallableChain<String>(), () -> "FOO");
- service.submit(() -> {
+ JobFutureTask<String> f = new JobFutureTask<String>((JobManager) Jobs.getJobManager(), r, Jobs.newInput(), new CallableChain<String>(), () -> {
+ SleepUtil.sleepSafe(1, TimeUnit.MILLISECONDS);
+ return "FOO";
+ });
+
+ Jobs.schedule(() -> {
Thread.interrupted();//clear state
ThreadInfo.CURRENT.set(new ThreadInfo(Thread.currentThread(), "foo-thread", 123L));
RunMonitor.CURRENT.set(r);
IFuture.CURRENT.set(f);
f.run();
- });
- service.submit(() -> {
+ }, Jobs.newInput().withExecutionHint(TEST_HINT));
+
+ Jobs.schedule(() -> {
Thread.interrupted();//clear state
try {
Thread.sleep(0L, rnd.nextInt(100000));
@@ -79,7 +85,7 @@ public class JobFutureTaskTest {
System.out.println("FAILURE: value is null");
}
}
- catch (FutureCancelledError e) {
+ catch (FutureCancelledError | ThreadInterruptedError e) {
//nop
}
catch (Throwable t) {
@@ -87,13 +93,14 @@ public class JobFutureTaskTest {
}
runCount.incrementAndGet();
scheduleLock.release(1);
- });
+ }, Jobs.newInput().withExecutionHint(TEST_HINT));
}
}
finally {
active.set(false);
- service.shutdown();
- service.awaitTermination(1, TimeUnit.MINUTES);
+ Predicate<IFuture<?>> filter = Jobs.newFutureFilterBuilder().andMatchExecutionHint(TEST_HINT).toFilter();
+ Jobs.getJobManager().cancel(filter, true);
+ Jobs.getJobManager().awaitFinished(filter, 1, TimeUnit.MINUTES);
}
Assertions.assertEqual(0, failureCount.get());
}

Back to the top