--- jsr166/src/test/tck/ForkJoinPoolTest.java 2010/09/11 19:04:12 1.23 +++ jsr166/src/test/tck/ForkJoinPoolTest.java 2010/10/11 04:39:12 1.32 @@ -5,8 +5,9 @@ */ import junit.framework.*; -import java.util.*; -import java.util.concurrent.Executor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.AbstractExecutorService; @@ -19,11 +20,14 @@ import java.util.concurrent.RejectedExec 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.locks.*; -import java.security.*; +import java.util.concurrent.locks.ReentrantLock; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.security.AccessControlException; +import java.security.Policy; +import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; public class ForkJoinPoolTest extends JSR166TestCase { public static void main(String[] args) { @@ -158,14 +162,14 @@ public class ForkJoinPoolTest extends JS public void testDefaultInitialState() { ForkJoinPool p = new ForkJoinPool(1); try { - assertTrue(p.getFactory() == - ForkJoinPool.defaultForkJoinWorkerThreadFactory); + assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory, + p.getFactory()); assertTrue(p.isQuiescent()); assertFalse(p.getAsyncMode()); - assertTrue(p.getActiveThreadCount() == 0); - assertTrue(p.getStealCount() == 0); - assertTrue(p.getQueuedTaskCount() == 0); - assertTrue(p.getQueuedSubmissionCount() == 0); + assertEquals(0, p.getActiveThreadCount()); + assertEquals(0, p.getStealCount()); + assertEquals(0, p.getQueuedTaskCount()); + assertEquals(0, p.getQueuedSubmissionCount()); assertFalse(p.hasQueuedSubmissions()); assertFalse(p.isShutdown()); assertFalse(p.isTerminating()); @@ -202,7 +206,7 @@ public class ForkJoinPoolTest extends JS public void testGetParallelism() { ForkJoinPool p = new ForkJoinPool(1); try { - assertTrue(p.getParallelism() == 1); + assertEquals(1, p.getParallelism()); } finally { joinPool(p); } @@ -214,9 +218,9 @@ public class ForkJoinPoolTest extends JS public void testGetPoolSize() { ForkJoinPool p = new ForkJoinPool(1); try { - assertTrue(p.getActiveThreadCount() == 0); + assertEquals(0, p.getActiveThreadCount()); Future future = p.submit(new StringTask()); - assertTrue(p.getPoolSize() == 1); + assertEquals(1, p.getPoolSize()); } finally { joinPool(p); } @@ -229,15 +233,20 @@ public class ForkJoinPoolTest extends JS * performs its defined action */ public void testSetUncaughtExceptionHandler() throws InterruptedException { - MyHandler eh = new MyHandler(); - ForkJoinPool p = new ForkJoinPool(1, new FailingThreadFactory(), eh, false); - try { - assert(eh == p.getUncaughtExceptionHandler()); - p.execute(new FailingTask()); - Thread.sleep(MEDIUM_DELAY_MS); - assertTrue(eh.catches > 0); + final CountDownLatch uehInvoked = new CountDownLatch(1); + final Thread.UncaughtExceptionHandler eh = + new Thread.UncaughtExceptionHandler() { + public void uncaughtException(Thread t, Throwable e) { + uehInvoked.countDown(); + }}; + ForkJoinPool p = new ForkJoinPool(1, new FailingThreadFactory(), + eh, false); + try { + assertSame(eh, p.getUncaughtExceptionHandler()); + p.execute(new FibTask(8)); + assertTrue(uehInvoked.await(MEDIUM_DELAY_MS, MILLISECONDS)); } finally { - p.shutdownNow(); + p.shutdownNow(); // failure might have prevented processing task joinPool(p); } } @@ -250,15 +259,16 @@ public class ForkJoinPoolTest extends JS public void testisQuiescent() throws InterruptedException { ForkJoinPool p = new ForkJoinPool(2); try { + assertTrue(p.isQuiescent()); p.invoke(new FibTask(20)); - assertTrue(p.getFactory() == - ForkJoinPool.defaultForkJoinWorkerThreadFactory); - Thread.sleep(MEDIUM_DELAY_MS); + assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory, + p.getFactory()); + Thread.sleep(SMALL_DELAY_MS); assertTrue(p.isQuiescent()); assertFalse(p.getAsyncMode()); - assertTrue(p.getActiveThreadCount() == 0); - assertTrue(p.getQueuedTaskCount() == 0); - assertTrue(p.getQueuedSubmissionCount() == 0); + assertEquals(0, p.getActiveThreadCount()); + assertEquals(0, p.getQueuedTaskCount()); + assertEquals(0, p.getQueuedSubmissionCount()); assertFalse(p.hasQueuedSubmissions()); assertFalse(p.isShutdown()); assertFalse(p.isTerminating()); @@ -275,8 +285,7 @@ public class ForkJoinPoolTest extends JS ForkJoinPool p = new ForkJoinPool(1); try { ForkJoinTask f = p.submit(new FibTask(8)); - int r = f.get(); - assertTrue(r == 21); + assertEquals(21, (int) f.get()); } finally { joinPool(p); } @@ -290,9 +299,10 @@ public class ForkJoinPoolTest extends JS try { p.shutdown(); assertTrue(p.isShutdown()); - ForkJoinTask f = p.submit(new FibTask(8)); - shouldThrow(); - } catch (RejectedExecutionException success) { + try { + ForkJoinTask f = p.submit(new FibTask(8)); + shouldThrow(); + } catch (RejectedExecutionException success) {} } finally { joinPool(p); } @@ -306,10 +316,9 @@ public class ForkJoinPoolTest extends JS try { ReentrantLock lock = new ReentrantLock(); ManagedLocker locker = new ManagedLocker(lock); - ForkJoinTask f = new LockingFibTask(30, locker, lock); + ForkJoinTask f = new LockingFibTask(20, locker, lock); p.execute(f); - int r = f.get(); - assertTrue(r == 832040); + assertEquals(6765, (int) f.get()); } finally { p.shutdownNow(); // don't wait out shutdown } @@ -321,9 +330,9 @@ public class ForkJoinPoolTest extends JS public void testPollSubmission() { SubFJP p = new SubFJP(); try { - ForkJoinTask a = p.submit(new MediumRunnable()); - ForkJoinTask b = p.submit(new MediumRunnable()); - ForkJoinTask c = p.submit(new MediumRunnable()); + ForkJoinTask a = p.submit(new ShortRunnable()); + ForkJoinTask b = p.submit(new ShortRunnable()); + ForkJoinTask c = p.submit(new ShortRunnable()); ForkJoinTask r = p.pollSubmission(); assertTrue(r == a || r == b || r == c); assertFalse(r.isDone()); @@ -338,9 +347,9 @@ public class ForkJoinPoolTest extends JS public void testDrainTasksTo() { SubFJP p = new SubFJP(); try { - ForkJoinTask a = p.submit(new MediumRunnable()); - ForkJoinTask b = p.submit(new MediumRunnable()); - ForkJoinTask c = p.submit(new MediumRunnable()); + ForkJoinTask a = p.submit(new ShortRunnable()); + ForkJoinTask b = p.submit(new ShortRunnable()); + ForkJoinTask c = p.submit(new ShortRunnable()); ArrayList al = new ArrayList(); p.drainTasksTo(al); assertTrue(al.size() > 0); @@ -362,11 +371,11 @@ public class ForkJoinPoolTest extends JS public void testExecuteRunnable() throws Throwable { ExecutorService e = new ForkJoinPool(1); try { - TrackedShortRunnable task = new TrackedShortRunnable(); - assertFalse(task.done); + TrackedRunnable task = trackedRunnable(SHORT_DELAY_MS); + assertFalse(task.isDone()); Future future = e.submit(task); future.get(); - assertTrue(task.done); + assertTrue(task.isDone()); } finally { joinPool(e); } @@ -523,8 +532,7 @@ public class ForkJoinPoolTest extends JS public void testExecuteNullRunnable() { ExecutorService e = new ForkJoinPool(1); try { - TrackedShortRunnable task = null; - Future future = e.submit(task); + Future future = e.submit((Runnable) null); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -539,8 +547,7 @@ public class ForkJoinPoolTest extends JS public void testSubmitNullCallable() { ExecutorService e = new ForkJoinPool(1); try { - StringTask t = null; - Future future = e.submit(t); + Future future = e.submit((Callable) null); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -550,30 +557,32 @@ public class ForkJoinPoolTest extends JS /** - * Blocking on submit(callable) throws InterruptedException if - * caller interrupted. + * submit(callable).get() throws InterruptedException if interrupted */ public void testInterruptedSubmit() throws InterruptedException { - final ForkJoinPool p = new ForkJoinPool(1); - - Thread t = new Thread(new CheckedInterruptedRunnable() { - public void realRun() throws Throwable { - p.submit(new CheckedCallable() { - public Object realCall() throws Throwable { - try { - Thread.sleep(MEDIUM_DELAY_MS); - } catch (InterruptedException ok) { - } - return null; - }}).get(); - }}); - - t.start(); - Thread.sleep(SHORT_DELAY_MS); - t.interrupt(); - t.join(); - p.shutdownNow(); - joinPool(p); + final CountDownLatch submitted = new CountDownLatch(1); + final CountDownLatch quittingTime = new CountDownLatch(1); + final ExecutorService p = new ForkJoinPool(1); + final Callable awaiter = new CheckedCallable() { + public Void realCall() throws InterruptedException { + assertTrue(quittingTime.await(MEDIUM_DELAY_MS, MILLISECONDS)); + return null; + }}; + try { + Thread t = new Thread(new CheckedInterruptedRunnable() { + public void realRun() throws Exception { + Future future = p.submit(awaiter); + submitted.countDown(); + future.get(); + }}); + t.start(); + assertTrue(submitted.await(MEDIUM_DELAY_MS, MILLISECONDS)); + t.interrupt(); + t.join(); + } finally { + quittingTime.countDown(); + joinPool(p); + } } /** @@ -782,7 +791,7 @@ public class ForkJoinPoolTest extends JS public void testTimedInvokeAny1() throws Throwable { ExecutorService e = new ForkJoinPool(1); try { - e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -813,7 +822,7 @@ public class ForkJoinPoolTest extends JS ExecutorService e = new ForkJoinPool(1); try { e.invokeAny(new ArrayList>(), - MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (IllegalArgumentException success) { } finally { @@ -831,7 +840,7 @@ public class ForkJoinPoolTest extends JS l.add(latchAwaitingStringTask(latch)); l.add(null); try { - e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -848,7 +857,7 @@ public class ForkJoinPoolTest extends JS List> l = new ArrayList>(); l.add(new NPETask()); try { - e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (ExecutionException success) { assertTrue(success.getCause() instanceof NullPointerException); @@ -866,7 +875,7 @@ public class ForkJoinPoolTest extends JS List> l = new ArrayList>(); l.add(new StringTask()); l.add(new StringTask()); - String result = e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS); assertSame(TEST_STRING, result); } finally { joinPool(e); @@ -879,7 +888,7 @@ public class ForkJoinPoolTest extends JS public void testTimedInvokeAll1() throws Throwable { ExecutorService e = new ForkJoinPool(1); try { - e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -911,7 +920,7 @@ public class ForkJoinPoolTest extends JS try { List> r = e.invokeAll(new ArrayList>(), - MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + MEDIUM_DELAY_MS, MILLISECONDS); assertTrue(r.isEmpty()); } finally { joinPool(e); @@ -927,7 +936,7 @@ public class ForkJoinPoolTest extends JS l.add(new StringTask()); l.add(null); try { - e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (NullPointerException success) { } finally { @@ -943,7 +952,7 @@ public class ForkJoinPoolTest extends JS List> l = new ArrayList>(); l.add(new NPETask()); List> futures - = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS); assertEquals(1, futures.size()); try { futures.get(0).get(); @@ -965,7 +974,7 @@ public class ForkJoinPoolTest extends JS l.add(new StringTask()); l.add(new StringTask()); List> futures - = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); + = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS); assertEquals(2, futures.size()); for (Future future : futures) assertSame(TEST_STRING, future.get());