18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS; 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.NANOSECONDS; 118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.PrivilegedAction; 138e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.security.PrivilegedExceptionAction; 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList; 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.List; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Callable; 188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountDownLatch; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutionException; 208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Executors; 218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutorService; 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool; 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask; 248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinWorkerThread; 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Future; 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.RecursiveTask; 278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.RejectedExecutionException; 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicBoolean; 298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.locks.ReentrantLock; 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.AssertionFailedError; 328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ForkJoinPoolTest extends JSR166TestCase { 368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Removed because the CTS runner does a bad job of 378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // retrying tests that have suite() declarations. 388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 43b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // return new TestSuite(ForkJoinPoolTest.class); 448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /* 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Testing coverage notes: 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 1. shutdown and related methods are tested via super.joinPool. 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 2. newTaskFor and adapters are tested in submit/invoke tests 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 3. We cannot portably test monitoring methods such as 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getStealCount() since they rely ultimately on random task 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * stealing that may cause tasks not to be stolen/propagated 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * across threads, especially on uniprocessors. 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 4. There are no independently testable ForkJoinWorkerThread 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * methods, but they are covered here and in task tests. 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Some classes to test extension and factory methods 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class MyHandler implements Thread.UncaughtExceptionHandler { 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle volatile int catches = 0; 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void uncaughtException(Thread t, Throwable e) { 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ++catches; 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 71b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak static class MyError extends Error {} 72b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // to test handlers 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class FailingFJWSubclass extends ForkJoinWorkerThread { 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public FailingFJWSubclass(ForkJoinPool p) { super(p) ; } 76b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak protected void onStart() { super.onStart(); throw new MyError(); } 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class FailingThreadFactory 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle implements ForkJoinPool.ForkJoinWorkerThreadFactory { 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle volatile int calls = 0; 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public ForkJoinWorkerThread newThread(ForkJoinPool p) { 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (++calls > 1) return null; 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return new FailingFJWSubclass(p); 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class SubFJP extends ForkJoinPool { // to expose protected 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle SubFJP() { super(1); } 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public int drainTasksTo(Collection<? super ForkJoinTask<?>> c) { 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return super.drainTasksTo(c); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public ForkJoinTask<?> pollSubmission() { 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return super.pollSubmission(); 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class ManagedLocker implements ForkJoinPool.ManagedBlocker { 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ReentrantLock lock; 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle boolean hasLock = false; 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ManagedLocker(ReentrantLock lock) { this.lock = lock; } 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public boolean block() { 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (!hasLock) 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle lock.lock(); 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return true; 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public boolean isReleasable() { 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return hasLock || (hasLock = lock.tryLock()); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // A simple recursive task for testing 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final class FibTask extends RecursiveTask<Integer> { 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int number; 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FibTask(int n) { number = n; } 1168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath protected Integer compute() { 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int n = number; 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (n <= 1) 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return n; 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FibTask f1 = new FibTask(n - 1); 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f1.fork(); 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return (new FibTask(n - 2)).compute() + f1.join(); 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // A failing task for testing 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final class FailingTask extends ForkJoinTask<Void> { 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final Void getRawResult() { return null; } 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final void setRawResult(Void mustBeNull) { } 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final boolean exec() { throw new Error(); } 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingTask() {} 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Fib needlessly using locking to test ManagedBlockers 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final class LockingFibTask extends RecursiveTask<Integer> { 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int number; 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ManagedLocker locker; 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ReentrantLock lock; 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LockingFibTask(int n, ManagedLocker locker, ReentrantLock lock) { 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle number = n; 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle this.locker = locker; 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle this.lock = lock; 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath protected Integer compute() { 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int n; 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LockingFibTask f1 = null; 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LockingFibTask f2 = null; 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle locker.block(); 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle n = number; 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (n > 1) { 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f1 = new LockingFibTask(n - 1, locker, lock); 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f2 = new LockingFibTask(n - 2, locker, lock); 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle lock.unlock(); 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (n <= 1) 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return n; 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle else { 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f1.fork(); 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return f2.compute() + f1.join(); 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Successfully constructed pool reports default factory, 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * parallelism and async mode policies, no active threads or 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tasks, and quiescent running state. 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDefaultInitialState() { 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory, 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.getFactory()); 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.getAsyncMode()); 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getActiveThreadCount()); 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getStealCount()); 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getQueuedTaskCount()); 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getQueuedSubmissionCount()); 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.hasQueuedSubmissions()); 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isShutdown()); 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminated()); 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructor throws if size argument is less than zero 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor1() { 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new ForkJoinPool(-1); 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Constructor throws if factory argument is null 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2() { 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new ForkJoinPool(1, null, null, false); 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getParallelism returns size set in constructor 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetParallelism() { 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 211b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getParallelism()); 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getPoolSize returns number of started workers. 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetPoolSize() { 220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch taskStarted = new CountDownLatch(1); 221b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ForkJoinPool p = new ForkJoinPool(1); 223b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getActiveThreadCount()); 225b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable task = new CheckedRunnable() { 226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void realRun() throws InterruptedException { 227b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak taskStarted.countDown(); 228b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, p.getPoolSize()); 229b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, p.getActiveThreadCount()); 230b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak done.await(); 231b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 232b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Future<?> future = p.submit(task); 233b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(taskStarted); 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getPoolSize()); 235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, p.getActiveThreadCount()); 236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak done.countDown(); 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getPoolSize()); 239b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getActiveThreadCount()); 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * awaitTermination on a non-shutdown pool times out 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwaitTermination_timesOut() throws InterruptedException { 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminated()); 249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(Long.MIN_VALUE, NANOSECONDS)); 250b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(Long.MIN_VALUE, MILLISECONDS)); 251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(-1L, NANOSECONDS)); 252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(-1L, MILLISECONDS)); 253b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(0L, NANOSECONDS)); 254b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(0L, MILLISECONDS)); 255b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long timeoutNanos = 999999L; 256b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 257b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(timeoutNanos, NANOSECONDS)); 258b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(System.nanoTime() - startTime >= timeoutNanos); 259b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminated()); 260b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak startTime = System.nanoTime(); 261b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long timeoutMillis = timeoutMillis(); 262b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.awaitTermination(timeoutMillis, MILLISECONDS)); 263b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) >= timeoutMillis); 264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminated()); 265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 268b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * setUncaughtExceptionHandler changes handler for uncaught exceptions. 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Additionally tests: Overriding ForkJoinWorkerThread.onStart 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * performs its defined action 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSetUncaughtExceptionHandler() throws InterruptedException { 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch uehInvoked = new CountDownLatch(1); 279b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Thread.UncaughtExceptionHandler ueh = 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new Thread.UncaughtExceptionHandler() { 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void uncaughtException(Thread t, Throwable e) { 282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak threadAssertTrue(e instanceof MyError); 283b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak threadAssertTrue(t instanceof FailingFJWSubclass); 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle uehInvoked.countDown(); 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1, new FailingThreadFactory(), 287b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ueh, false); 288b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 289b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertSame(ueh, p.getUncaughtExceptionHandler()); 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new FibTask(8)); 292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(uehInvoked); 293b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } finally { 294b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdownNow(); // failure might have prevented processing task 2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * After invoking a single task, isQuiescent eventually becomes 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * true, at which time queues are empty, threads are not active, 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * the task has completed successfully, and construction 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * parameters continue to hold 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIsQuiescent() throws Exception { 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(2); 307b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.isQuiescent()); 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FibTask f = new FibTask(20); 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.invoke(f); 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory, 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.getFactory()); 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (! p.isQuiescent()) { 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (millisElapsedSince(startTime) > LONG_DELAY_MS) 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle throw new AssertionFailedError("timed out"); 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.getAsyncMode()); 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isShutdown()); 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminated()); 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.isQuiescent()); 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.getAsyncMode()); 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getQueuedTaskCount()); 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getQueuedSubmissionCount()); 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.hasQueuedSubmissions()); 329b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak while (p.getActiveThreadCount() != 0 330b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak && millisElapsedSince(startTime) < LONG_DELAY_MS) 331b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Thread.yield(); 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isShutdown()); 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminated()); 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.isDone()); 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(6765, (int) f.get()); 337b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Completed submit(ForkJoinTask) returns result 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitForkJoinTask() throws Throwable { 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 346b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask<Integer> f = p.submit(new FibTask(8)); 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, (int) f.get()); 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A task submitted after shutdown is rejected 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitAfterShutdown() { 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 357b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.shutdown(); 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.isShutdown()); 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask<Integer> f = p.submit(new FibTask(8)); 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (RejectedExecutionException success) {} 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pool maintains parallelism when using ManagedBlocker 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBlockingForkJoinTask() throws Throwable { 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(4); 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ReentrantLock lock = new ReentrantLock(); 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ManagedLocker locker = new ManagedLocker(lock); 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask<Integer> f = new LockingFibTask(20, locker, lock); 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(f); 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(6765, (int) f.get()); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } finally { 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.shutdownNow(); // don't wait out shutdown 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollSubmission returns unexecuted submitted task, if present 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollSubmission() { 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle SubFJP p = new SubFJP(); 389b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask a = p.submit(awaiter(done)); 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask b = p.submit(awaiter(done)); 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask c = p.submit(awaiter(done)); 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask r = p.pollSubmission(); 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r == a || r == b || r == c); 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(r.isDone()); 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * drainTasksTo transfers unexecuted submitted tasks, if present 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testDrainTasksTo() { 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle SubFJP p = new SubFJP(); 406b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask a = p.submit(awaiter(done)); 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask b = p.submit(awaiter(done)); 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinTask c = p.submit(awaiter(done)); 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ArrayList<ForkJoinTask> al = new ArrayList(); 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.drainTasksTo(al); 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(al.size() > 0); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (ForkJoinTask r : al) { 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r == a || r == b || r == c); 4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(r.isDone()); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // FJ Versions of AbstractExecutorService tests 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * execute(runnable) runs it to completion 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testExecuteRunnable() throws Throwable { 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 428b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final AtomicBoolean done = new AtomicBoolean(false); 4308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath Future<?> future = e.submit(new CheckedRunnable() { 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.set(true); 4338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath }}); 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(future.get()); 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(future.get(0, MILLISECONDS)); 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(done.get()); 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(future.isDone()); 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(future.isCancelled()); 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Completed submit(callable) returns result 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitCallable() throws Throwable { 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 447b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<String> future = e.submit(new StringTask()); 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(future.isDone()); 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(future.isCancelled()); 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Completed submit(runnable) returns successfully 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitRunnable() throws Throwable { 4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 460b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<?> future = e.submit(new NoOpRunnable()); 4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(future.get()); 4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(future.isDone()); 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(future.isCancelled()); 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Completed submit(runnable, result) returns result 4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitRunnable2() throws Throwable { 4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 473b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING); 4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(future.isDone()); 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(future.isCancelled()); 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A submitted privileged action runs to completion 4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitPrivilegedAction() throws Exception { 4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Callable callable = Executors.callable(new PrivilegedAction() { 4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public Object run() { return TEST_STRING; }}); 4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 490b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future future = e.submit(callable); 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle runWithPermissions(r, new RuntimePermission("modifyThread")); 4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A submitted privileged exception action runs to completion 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitPrivilegedExceptionAction() throws Exception { 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Callable callable = 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Executors.callable(new PrivilegedExceptionAction() { 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public Object run() { return TEST_STRING; }}); 5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 509b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future future = e.submit(callable); 5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle runWithPermissions(r, new RuntimePermission("modifyThread")); 5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A submitted failed privileged exception action reports exception 5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitFailedPrivilegedExceptionAction() throws Exception { 5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Callable callable = 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Executors.callable(new PrivilegedExceptionAction() { 5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public Object run() { throw new IndexOutOfBoundsException(); }}); 5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 528b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future future = e.submit(callable); 5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle future.get(); 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(success.getCause() instanceof IndexOutOfBoundsException); 5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle runWithPermissions(r, new RuntimePermission("modifyThread")); 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * execute(null runnable) throws NullPointerException 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testExecuteNullRunnable() { 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 547b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 548b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 549b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Future<?> future = e.submit((Runnable) null); 550b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 551b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * submit(null callable) throws NullPointerException 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitNullCallable() { 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 560b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 561b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 562b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Future<String> future = e.submit((Callable) null); 563b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 564b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * submit(callable).get() throws InterruptedException if interrupted 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInterruptedSubmit() throws InterruptedException { 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch submitted = new CountDownLatch(1); 5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch quittingTime = new CountDownLatch(1); 5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final Callable<Void> awaiter = new CheckedCallable<Void>() { 5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public Void realCall() throws InterruptedException { 576b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(quittingTime.await(2*LONG_DELAY_MS, MILLISECONDS)); 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return null; 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 579b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService p = new ForkJoinPool(1); 580b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, quittingTime)) { 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = new Thread(new CheckedInterruptedRunnable() { 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<Void> future = p.submit(awaiter); 5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle submitted.countDown(); 5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle future.get(); 5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.start(); 588b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(submitted); 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 590b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak awaitTermination(t); 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of submit(callable) throws ExecutionException if callable 5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throws exception 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitEE() throws Throwable { 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool p = new ForkJoinPool(1); 600b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 601b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 602b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.submit(new Callable() { 603b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public Object call() { throw new ArithmeticException(); }}) 604b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak .get(); 605b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 606b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 607b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof ArithmeticException); 608b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(null) throws NullPointerException 6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny1() throws Throwable { 6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 617b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 618b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 619b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(null); 620b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 621b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(empty collection) throws IllegalArgumentException 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny2() throws Throwable { 6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 630b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 631b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 632b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(new ArrayList<Callable<String>>()); 633b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 634b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (IllegalArgumentException success) {} 6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) throws NullPointerException if c has a single null element 6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny3() throws Throwable { 6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 643b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 644b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 645b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 646b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 647b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l); 648b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 649b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) throws NullPointerException if c has null elements 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny4() throws Throwable { 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CountDownLatch latch = new CountDownLatch(1); 6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 659b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 660b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 661b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(latchAwaitingStringTask(latch)); 662b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 663b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 664b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l); 665b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 666b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) throws ExecutionException if no task in c completes 6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny5() throws Throwable { 6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 676b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 677b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 678b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 679b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 680b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l); 681b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 682b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 683b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 684b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) returns result of some task in c if at least one completes 6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny6() throws Throwable { 6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 693b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String result = e.invokeAny(l); 6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(null) throws NullPointerException 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll1() throws Throwable { 7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 707b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 708b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 709b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(null); 710b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 711b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(empty collection) returns empty collection 7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll2() throws InterruptedException { 7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 720b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> r 7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = e.invokeAll(new ArrayList<Callable<String>>()); 7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r.isEmpty()); 7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(c) throws NullPointerException if c has null elements 7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll3() throws InterruptedException { 7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 732b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 733b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 734b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 735b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 736b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 737b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l); 738b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 739b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of returned element of invokeAll(c) throws 7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * ExecutionException on failed task 7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll4() throws Throwable { 7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 749b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 750b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 751b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 752b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> futures = e.invokeAll(l); 753b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, futures.size()); 754b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 755b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak futures.get(0).get(); 756b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 757b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 758b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 759b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(c) returns results of all completed tasks in c 7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll5() throws Throwable { 7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 768b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> futures = e.invokeAll(l); 7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, futures.size()); 7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Future<String> future : futures) 7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(null) throws NullPointerException 7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny1() throws Throwable { 7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 784b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 785b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 786b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS); 787b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 788b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(null time unit) throws NullPointerException 7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAnyNullTimeUnit() throws Throwable { 7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 797b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 798b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 799b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 800b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 801b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, MEDIUM_DELAY_MS, null); 802b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 803b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(empty collection) throws IllegalArgumentException 8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny2() throws Throwable { 8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 812b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 813b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 814b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(new ArrayList<Callable<String>>(), 815b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MILLISECONDS); 816b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 817b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (IllegalArgumentException success) {} 8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) throws NullPointerException if c has null elements 8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny3() throws Throwable { 8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CountDownLatch latch = new CountDownLatch(1); 8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 827b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 828b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 829b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(latchAwaitingStringTask(latch)); 830b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 831b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 832b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS); 833b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 834b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) throws ExecutionException if no task completes 8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny4() throws Throwable { 8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 844b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 845b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 846b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 847b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 848b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 849b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS); 850b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 851b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 852b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 853b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 854b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) returns result of some task in c 8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny5() throws Throwable { 8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 863b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 864b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 868b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS); 8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 870b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(null) throws NullPointerException 8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll1() throws Throwable { 8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 879b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 880b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 881b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS); 882b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 883b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(null time unit) throws NullPointerException 8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAllNullTimeUnit() throws Throwable { 8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 892b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 893b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 894b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 895b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 896b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, MEDIUM_DELAY_MS, null); 897b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 898b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(empty collection) returns empty collection 9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll2() throws InterruptedException { 9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 907b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> r 9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle = e.invokeAll(new ArrayList<Callable<String>>(), 9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle MEDIUM_DELAY_MS, MILLISECONDS); 9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r.isEmpty()); 9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(c) throws NullPointerException if c has null elements 9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll3() throws InterruptedException { 9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 920b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 921b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 922b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 923b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 924b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 925b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS); 926b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 927b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of returned element of invokeAll(c) throws exception on failed task 9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll4() throws Throwable { 9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ExecutorService e = new ForkJoinPool(1); 936b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 937b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 938b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 939b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> futures 940b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak = e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS); 941b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, futures.size()); 942b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 943b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak futures.get(0).get(); 944b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 945b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 946b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 947b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(c) returns results of all completed tasks in c 9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll5() throws Throwable { 955b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinPool e = new ForkJoinPool(1); 956b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> futures 961b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak = e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS); 9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, futures.size()); 9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Future<String> future : futures) 9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 969