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.SECONDS;
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.HashSet;
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CancellationException;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutionException;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.RecursiveTask;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class RecursiveTaskTest extends JSR166TestCase {
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
31b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(RecursiveTaskTest.class);
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool mainPool() {
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool();
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool singletonPool() {
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1);
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool asyncSingletonPool() {
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1,
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                null, true);
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private <T> T testInvokeOnPool(ForkJoinPool pool, RecursiveTask<T> a) {
49b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(pool)) {
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkNotDone(a);
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            T result = pool.invoke(a);
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCompletedNormally(a, result);
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return result;
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkNotDone(RecursiveTask a) {
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isDone());
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (! ForkJoinTask.inForkJoinPool()) {
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.get();
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (InterruptedException success) {
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (Throwable fail) { threadUnexpectedException(fail); }
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.get(5L, SECONDS);
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (InterruptedException success) {
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (Throwable fail) { threadUnexpectedException(fail); }
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(0L, SECONDS);
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (TimeoutException success) {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    <T> void checkCompletedNormally(RecursiveTask<T> a, T expected) {
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedNormally());
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(expected, a.getRawResult());
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(expected, a.join());
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected, a.get());
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected, a.get(5L, SECONDS));
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Waits for the task to complete, and checks that when it does,
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * it will have an Integer result equals to the given int.
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletesNormally(RecursiveTask<Integer> a, int expected) {
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer r = a.join();
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expected, (int) r);
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a, r);
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Like checkCompletesNormally, but verifies that the task has
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * already completed.
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedNormally(RecursiveTask<Integer> a, int expected) {
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer r = a.getRawResult();
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expected, (int) r);
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a, r);
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCancelled(RecursiveTask a) {
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCancelled());
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.getException() instanceof CancellationException);
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedAbnormally(RecursiveTask a, Throwable t) {
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(t.getClass(), a.getException().getClass());
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable expected) {
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), expected.getClass());
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public static final class FJException extends RuntimeException {
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public FJException() { super(); }
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // An invalid return value for Fib
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final Integer NoResult = Integer.valueOf(-17);
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // A simple recursive task for testing
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class FibTask extends CheckedRecursiveTask<Integer> {
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int number;
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FibTask(int n) { number = n; }
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public Integer realCompute() {
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (n <= 1)
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return n;
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FibTask f1 = new FibTask(n - 1);
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f1.fork();
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return (new FibTask(n - 2)).compute() + f1.join();
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void publicSetRawResult(Integer result) {
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            setRawResult(result);
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // A recursive action failing in base case
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class FailingFibTask extends RecursiveTask<Integer> {
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int number;
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int result;
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FailingFibTask(int n) { number = n; }
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public Integer compute() {
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (n <= 1)
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                throw new FJException();
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FailingFibTask f1 = new FailingFibTask(n - 1);
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f1.fork();
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return (new FibTask(n - 2)).compute() + f1.join();
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns value when task completes normally.
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks. getRawResult of a completed non-null task
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returns value;
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvoke() {
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.invoke();
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) r);
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, r);
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvoke() {
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoin() {
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.join();
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) r);
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, r);
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGet() {
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.get();
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) r);
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, r);
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGet() {
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.get(5L, SECONDS);
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) r);
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, r);
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoin() {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.getRawResult();
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) r);
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, r);
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesce() {
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
336b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                while (!f.isDone()) // wait out race
337b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    ;
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvoke() {
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvoke() {
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoin() {
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.join();
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGet() {
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.get();
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGet() {
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.get(5L, SECONDS);
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoin() {
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvoke() {
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.invoke();
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoin() {
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.join();
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGet() {
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.get();
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGet() {
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() throws Exception {
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.get(5L, SECONDS);
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoin() {
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of executing task returns its pool
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool() {
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(mainPool, getPool());
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool, a));
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of non-FJ task returns null
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool2() {
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getPool());
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, a.invoke());
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of executing task returns true
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool() {
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(inForkJoinPool());
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of non-FJ task returns false
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool2() {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(inForkJoinPool());
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, a.invoke());
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * The value set by setRawResult is returned by getRawResult
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRawResult() {
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                setRawResult(NoResult);
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(NoResult, getRawResult());
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        };
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, a.invoke());
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reinitialized normally completed task may be re-invoked
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReinitialize() {
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < 3; i++) {
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.invoke();
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(21, (int) r);
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedNormally(f, r);
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.reinitialize();
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.publicSetRawResult(null);
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkNotDone(f);
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reinitialized abnormally completed task may be re-invoked
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReinitializeAbnormal() {
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < 3; i++) {
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        f.invoke();
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        shouldThrow();
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    } catch (FJException success) {
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        checkCompletedAbnormally(f, success);
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.reinitialize();
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkNotDone(f);
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally() {
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Integer r = f.invoke();
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task suppresses execution invoking complete
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testComplete() {
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.complete(NoResult);
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Integer r = f.invoke();
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(NoResult, r);
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, NoResult);
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return r;
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() {
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() {
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() {
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = new FibTask(7);
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.isDone());
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(g.isDone());
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(h.isDone());
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h, 13);
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollection() {
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = new FibTask(7);
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.isDone());
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(g.isDone());
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(h.isDone());
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h, 13);
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPE() {
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = null;
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2() {
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask g = new FailingFibTask(9);
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g);
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1() {
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask g = new FailingFibTask(9);
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3() {
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask g = new FailingFibTask(9);
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = new FibTask(7);
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) throws exception if any task does
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollection() {
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibTask f = new FailingFibTask(8);
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = new FibTask(7);
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(set);
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tryUnfork returns true for most recent unexecuted task,
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * and suppresses execution
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTryUnfork() {
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.tryUnfork());
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getSurplusQueuedTaskCount returns > 0 when
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * there are more tasks than threads
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSurplusQueuedTaskCount() {
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask h = new FibTask(7);
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(h, h.fork());
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(getSurplusQueuedTaskCount() > 0);
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getSurplusQueuedTaskCount());
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h, 13);
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns most recent unexecuted task.
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTask() {
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, peekNextLocalTask());
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletesNormally(f, 21);
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns most recent unexecuted task
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * without executing it
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTask() {
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollNextLocalTask());
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTask() {
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollTask());
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns least recent unexecuted task in async mode
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTaskAsync() {
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, peekNextLocalTask());
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, (int) f.join());
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g, 34);
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns least recent unexecuted task without
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it, in async mode
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTaskAsync() {
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollNextLocalTask());
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it, in
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * async mode
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTaskAsync() {
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public Integer realCompute() {
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask g = new FibTask(9);
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibTask f = new FibTask(8);
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollTask());
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f, 21);
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                return NoResult;
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1032