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