diff options
author | Ivan Motsch | 2019-10-23 10:18:30 +0000 |
---|---|---|
committer | Ivan Motsch | 2019-10-23 10:30:11 +0000 |
commit | ecfbd1d5162716cd12c072ccb75ceced16c61a59 (patch) | |
tree | 42aaff9118279f5b3050f773d433296c19e5a68c | |
parent | 1d6a1ee0bc0aca03aa8d03ab80c8187cd88cc51b (diff) | |
download | org.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.java | 33 |
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()); } |