--- jsr166/src/test/tck/ForkJoinTaskTest.java 2010/09/13 07:22:29 1.12 +++ jsr166/src/test/tck/ForkJoinTaskTest.java 2010/09/13 23:23:44 1.16 @@ -3,27 +3,16 @@ * Expert Group and released to the public domain, as explained at * http://creativecommons.org/licenses/publicdomain */ -import java.util.*; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.AbstractExecutorService; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; import java.util.concurrent.ExecutionException; import java.util.concurrent.CancellationException; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.ForkJoinWorkerThread; import java.util.concurrent.RecursiveAction; -import java.util.concurrent.RecursiveTask; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.HashSet; import junit.framework.*; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.*; -import java.util.*; public class ForkJoinTaskTest extends JSR166TestCase { @@ -35,7 +24,29 @@ public class ForkJoinTaskTest extends JS return new TestSuite(ForkJoinTaskTest.class); } - /** + private static ForkJoinPool mainPool() { + return new ForkJoinPool(); + } + + private static ForkJoinPool singletonPool() { + return new ForkJoinPool(1); + } + + private static ForkJoinPool asyncSingletonPool() { + return new ForkJoinPool(1, + ForkJoinPool.defaultForkJoinWorkerThreadFactory, + null, true); + } + + private void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) { + try { + assertTrue(pool.invoke(a) == null); + } finally { + joinPool(pool); + } + } + + /* * Testing coverage notes: * * To test extension methods and overrides, most tests use @@ -43,11 +54,6 @@ public class ForkJoinTaskTest extends JS * differently than supplied Recursive forms. */ - static final ForkJoinPool mainPool = new ForkJoinPool(); - static final ForkJoinPool singletonPool = new ForkJoinPool(1); - static final ForkJoinPool asyncSingletonPool = - new ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory, - null, true); static final class FJException extends RuntimeException { FJException() { super(); } } @@ -230,14 +236,14 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib f = new AsyncFib(8); - f.invoke(); + threadAssertNull(f.invoke()); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); threadAssertFalse(f.isCancelled()); threadAssertFalse(f.isCompletedAbnormally()); threadAssertTrue(f.getRawResult() == null); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -256,7 +262,7 @@ public class ForkJoinTaskTest extends JS threadAssertFalse(f.isCompletedAbnormally()); threadAssertTrue(f.getRawResult() == null); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -266,13 +272,13 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib f = new AsyncFib(8); - f.fork(); - f.join(); + threadAssertSame(f, f.fork()); + threadAssertNull(f.join()); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); threadAssertTrue(f.getRawResult() == null); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -283,15 +289,15 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.fork(); - f.get(); + threadAssertSame(f, f.fork()); + threadAssertNull(f.get()); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); } catch (Exception ex) { unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -302,15 +308,15 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.fork(); - f.get(LONG_DELAY_MS, TimeUnit.MILLISECONDS); + threadAssertSame(f, f.fork()); + threadAssertNull(f.get(LONG_DELAY_MS, TimeUnit.MILLISECONDS)); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); } catch (Exception ex) { unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -321,7 +327,7 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.get(5L, null); shouldThrow(); } catch (NullPointerException success) { @@ -329,7 +335,7 @@ public class ForkJoinTaskTest extends JS unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -339,12 +345,12 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.quietlyJoin(); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } @@ -356,13 +362,13 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.helpQuiesce(); threadAssertTrue(f.number == 21); threadAssertTrue(f.isDone()); threadAssertTrue(getQueuedTaskCount() == 0); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } @@ -379,7 +385,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -392,7 +398,7 @@ public class ForkJoinTaskTest extends JS f.quietlyInvoke(); threadAssertTrue(f.isDone()); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -403,13 +409,13 @@ public class ForkJoinTaskTest extends JS public void compute() { try { FailingAsyncFib f = new FailingAsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.join(); shouldThrow(); } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -420,7 +426,7 @@ public class ForkJoinTaskTest extends JS public void compute() { try { FailingAsyncFib f = new FailingAsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.get(); shouldThrow(); } catch (ExecutionException success) { @@ -428,7 +434,7 @@ public class ForkJoinTaskTest extends JS unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -439,7 +445,7 @@ public class ForkJoinTaskTest extends JS public void compute() { try { FailingAsyncFib f = new FailingAsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.get(LONG_DELAY_MS, TimeUnit.MILLISECONDS); shouldThrow(); } catch (ExecutionException success) { @@ -447,7 +453,7 @@ public class ForkJoinTaskTest extends JS unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -457,13 +463,13 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { FailingAsyncFib f = new FailingAsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); f.quietlyJoin(); threadAssertTrue(f.isDone()); threadAssertTrue(f.isCompletedAbnormally()); threadAssertTrue(f.getException() instanceof FJException); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -474,13 +480,13 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.cancel(true); + threadAssertTrue(f.cancel(true)); f.invoke(); shouldThrow(); } catch (CancellationException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -491,14 +497,14 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.cancel(true); - f.fork(); + threadAssertTrue(f.cancel(true)); + threadAssertSame(f, f.fork()); f.join(); shouldThrow(); } catch (CancellationException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -509,8 +515,8 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.cancel(true); - f.fork(); + threadAssertTrue(f.cancel(true)); + threadAssertSame(f, f.fork()); f.get(); shouldThrow(); } catch (CancellationException success) { @@ -518,7 +524,7 @@ public class ForkJoinTaskTest extends JS unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -529,8 +535,8 @@ public class ForkJoinTaskTest extends JS public void compute() { try { AsyncFib f = new AsyncFib(8); - f.cancel(true); - f.fork(); + threadAssertTrue(f.cancel(true)); + threadAssertSame(f, f.fork()); f.get(LONG_DELAY_MS, TimeUnit.MILLISECONDS); shouldThrow(); } catch (CancellationException success) { @@ -538,7 +544,7 @@ public class ForkJoinTaskTest extends JS unexpectedException(ex); } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -548,25 +554,26 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib f = new AsyncFib(8); - f.cancel(true); - f.fork(); + threadAssertTrue(f.cancel(true)); + threadAssertSame(f, f.fork()); f.quietlyJoin(); threadAssertTrue(f.isDone()); threadAssertTrue(f.isCompletedAbnormally()); threadAssertTrue(f.getException() instanceof CancellationException); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** * getPool of executing task returns its pool */ public void testGetPool() { + final ForkJoinPool mainPool = mainPool(); RecursiveAction a = new RecursiveAction() { public void compute() { threadAssertTrue(getPool() == mainPool); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool, a); } /** @@ -577,7 +584,7 @@ public class ForkJoinTaskTest extends JS public void compute() { threadAssertTrue(getPool() == null); }}; - a.invoke(); + assertNull(a.invoke()); } /** @@ -588,7 +595,7 @@ public class ForkJoinTaskTest extends JS public void compute() { threadAssertTrue(inForkJoinPool()); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -599,7 +606,7 @@ public class ForkJoinTaskTest extends JS public void compute() { threadAssertTrue(!inForkJoinPool()); }}; - a.invoke(); + assertNull(a.invoke()); } /** @@ -610,7 +617,7 @@ public class ForkJoinTaskTest extends JS public void compute() { setRawResult(null); }}; - a.invoke(); + assertNull(a.invoke()); } /** @@ -627,7 +634,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -644,7 +651,7 @@ public class ForkJoinTaskTest extends JS threadAssertTrue(g.isDone()); threadAssertTrue(g.number == 34); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -658,7 +665,7 @@ public class ForkJoinTaskTest extends JS threadAssertTrue(f.isDone()); threadAssertTrue(f.number == 21); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -678,7 +685,7 @@ public class ForkJoinTaskTest extends JS threadAssertTrue(h.isDone()); threadAssertTrue(h.number == 13); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -702,7 +709,7 @@ public class ForkJoinTaskTest extends JS threadAssertTrue(h.isDone()); threadAssertTrue(h.number == 13); }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } @@ -721,7 +728,7 @@ public class ForkJoinTaskTest extends JS } catch (NullPointerException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -738,7 +745,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -754,7 +761,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -772,7 +779,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -794,7 +801,7 @@ public class ForkJoinTaskTest extends JS } catch (FJException success) { } }}; - mainPool.invoke(a); + testInvokeOnPool(mainPool(), a); } /** @@ -805,15 +812,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(f.tryUnfork()); helpQuiesce(); threadAssertFalse(f.isDone()); threadAssertTrue(g.isDone()); }}; - singletonPool.invoke(a); + testInvokeOnPool(singletonPool(), a); } /** @@ -824,15 +831,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib h = new AsyncFib(7); - h.fork(); + threadAssertSame(h, h.fork()); AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(getSurplusQueuedTaskCount() > 0); helpQuiesce(); }}; - singletonPool.invoke(a); + testInvokeOnPool(singletonPool(), a); } /** @@ -842,15 +849,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(peekNextLocalTask() == f); - f.join(); + threadAssertNull(f.join()); threadAssertTrue(f.isDone()); helpQuiesce(); }}; - singletonPool.invoke(a); + testInvokeOnPool(singletonPool(), a); } /** @@ -861,14 +868,14 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(pollNextLocalTask() == f); helpQuiesce(); threadAssertFalse(f.isDone()); }}; - singletonPool.invoke(a); + testInvokeOnPool(singletonPool(), a); } /** @@ -879,15 +886,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(pollTask() == f); helpQuiesce(); threadAssertFalse(f.isDone()); threadAssertTrue(g.isDone()); }}; - singletonPool.invoke(a); + testInvokeOnPool(singletonPool(), a); } /** @@ -897,15 +904,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(peekNextLocalTask() == g); - f.join(); + threadAssertNull(f.join()); helpQuiesce(); threadAssertTrue(f.isDone()); }}; - asyncSingletonPool.invoke(a); + testInvokeOnPool(asyncSingletonPool(), a); } /** @@ -916,15 +923,15 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(pollNextLocalTask() == g); helpQuiesce(); threadAssertTrue(f.isDone()); threadAssertFalse(g.isDone()); }}; - asyncSingletonPool.invoke(a); + testInvokeOnPool(asyncSingletonPool(), a); } /** @@ -935,14 +942,14 @@ public class ForkJoinTaskTest extends JS RecursiveAction a = new RecursiveAction() { public void compute() { AsyncFib g = new AsyncFib(9); - g.fork(); + threadAssertSame(g, g.fork()); AsyncFib f = new AsyncFib(8); - f.fork(); + threadAssertSame(f, f.fork()); threadAssertTrue(pollTask() == g); helpQuiesce(); threadAssertTrue(f.isDone()); threadAssertFalse(g.isDone()); }}; - asyncSingletonPool.invoke(a); + testInvokeOnPool(asyncSingletonPool(), a); } }