18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.SECONDS;
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
12b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Arrays;
13b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Collections;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.HashSet;
15b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.List;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CancellationException;
178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.RecursiveAction;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ForkJoinTaskTest extends JSR166TestCase {
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
36b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(ForkJoinTaskTest.class);
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Runs with "mainPool" use > 1 thread. singletonPool tests use 1
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final int mainPoolSize =
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Math.max(2, Runtime.getRuntime().availableProcessors());
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool mainPool() {
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(mainPoolSize);
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool singletonPool() {
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1);
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool asyncSingletonPool() {
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1,
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                null, true);
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) {
58b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(pool)) {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isDone());
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedNormally());
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedAbnormally());
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCancelled());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getException());
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getRawResult());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(pool.invoke(a));
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(a.isDone());
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(a.isCompletedNormally());
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedAbnormally());
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCancelled());
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getException());
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getRawResult());
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkNotDone(ForkJoinTask a) {
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isDone());
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(0L, SECONDS);
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (TimeoutException success) {
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    <T> void checkCompletedNormally(ForkJoinTask<T> a) {
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a, null);
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    <T> void checkCompletedNormally(ForkJoinTask<T> a, T expected) {
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedNormally());
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(expected, a.getRawResult());
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
106b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected, a.join());
108b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.interrupted();
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
114b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
116b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.interrupted();
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected, a.get());
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected, a.get(5L, SECONDS));
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCancelled(ForkJoinTask a) {
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCancelled());
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.getException() instanceof CancellationException);
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.cancel(false));
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.cancel(true));
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.interrupted();
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
149b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
151b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedAbnormally(ForkJoinTask a, Throwable t) {
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(t.getClass(), a.getException().getClass());
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable expected) {
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), expected.getClass());
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.interrupted();
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
187b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /*
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Testing coverage notes:
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     *
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * To test extension methods and overrides, most tests use
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * BinaryAsyncAction extension class that processes joins
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * differently than supplied Recursive forms.
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public static final class FJException extends RuntimeException {
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FJException() { super(); }
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    abstract static class BinaryAsyncAction extends ForkJoinTask<Void> {
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        private volatile int controlState;
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        static final AtomicIntegerFieldUpdater<BinaryAsyncAction> controlStateUpdater =
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            AtomicIntegerFieldUpdater.newUpdater(BinaryAsyncAction.class,
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                                 "controlState");
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private volatile BinaryAsyncAction parent;
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
228b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        private volatile BinaryAsyncAction sibling;
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected BinaryAsyncAction() {
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final Void getRawResult() { return null; }
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void setRawResult(Void mustBeNull) { }
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void linkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) {
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            x.parent = y.parent = this;
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            x.sibling = y;
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            y.sibling = x;
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected boolean onException() {
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return true;
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void linkAndForkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) {
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            linkSubtasks(x, y);
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            y.fork();
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            x.fork();
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        private void completeThis() {
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.complete(null);
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        private void completeThisExceptionally(Throwable ex) {
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.completeExceptionally(ex);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
263b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        public boolean cancel(boolean mayInterruptIfRunning) {
264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            if (super.cancel(mayInterruptIfRunning)) {
265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                completeExceptionally(new FJException());
266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                return true;
267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }
268b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            return false;
269b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
270b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void complete() {
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            BinaryAsyncAction a = this;
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (;;) {
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                BinaryAsyncAction s = a.sibling;
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                BinaryAsyncAction p = a.parent;
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.sibling = null;
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.parent = null;
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.completeThis();
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                if (p == null || p.compareAndSetControlState(0, 1))
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    break;
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.onComplete(a, s);
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (Throwable rex) {
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    p.completeExceptionally(rex);
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    return;
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a = p;
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void completeExceptionally(Throwable ex) {
292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            for (BinaryAsyncAction a = this;;) {
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.completeThisExceptionally(ex);
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                BinaryAsyncAction s = a.sibling;
295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if (s != null && !s.isDone())
296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    s.completeExceptionally(ex);
297b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                if ((a = a.parent) == null)
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    break;
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final BinaryAsyncAction getParent() {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return parent;
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public BinaryAsyncAction getSibling() {
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return sibling;
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void reinitialize() {
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            parent = sibling = null;
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.reinitialize();
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final int getControlState() {
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return controlState;
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final boolean compareAndSetControlState(int expect,
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                                          int update) {
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return controlStateUpdater.compareAndSet(this, expect, update);
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void setControlState(int value) {
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            controlState = value;
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void incrementControlState() {
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            controlStateUpdater.incrementAndGet(this);
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void decrementControlState() {
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            controlStateUpdater.decrementAndGet(this);
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final class AsyncFib extends BinaryAsyncAction {
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int number;
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public AsyncFib(int n) {
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            this.number = n;
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final boolean exec() {
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            AsyncFib f = this;
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = f.number;
347b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            while (n > 1) {
348b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                AsyncFib p = f;
349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                AsyncFib r = new AsyncFib(n - 2);
350b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                f = new AsyncFib(--n);
351b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.linkSubtasks(r, f);
352b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                r.fork();
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.complete();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return false;
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            number = ((AsyncFib)x).number + ((AsyncFib)y).number;
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final class FailingAsyncFib extends BinaryAsyncAction {
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int number;
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public FailingAsyncFib(int n) {
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            this.number = n;
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final boolean exec() {
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FailingAsyncFib f = this;
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = f.number;
372b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            while (n > 1) {
373b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                FailingAsyncFib p = f;
374b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                FailingAsyncFib r = new FailingAsyncFib(n - 2);
375b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                f = new FailingAsyncFib(--n);
376b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                p.linkSubtasks(r, f);
377b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                r.fork();
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.complete();
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return false;
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            completeExceptionally(new FJException());
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns when task completes normally.
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks; getRawResult returns null.
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvoke() {
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvoke() {
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoin() {
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGet() {
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get());
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGet() {
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get with null time unit throws NPE
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetNPE() {
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, null);
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoin() {
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesce() {
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvoke() {
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvoke() {
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoin() {
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGet() {
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGet() {
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoin() {
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvoke() {
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoin() {
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGet() {
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGet() throws Exception {
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoin() {
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of executing task returns its pool
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool() {
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(mainPool, getPool());
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool, a);
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of non-FJ task returns null
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool2() {
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getPool());
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of executing task returns true
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool() {
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(inForkJoinPool());
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of non-FJ task returns false
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool2() {
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(inForkJoinPool());
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setRawResult(null) succeeds
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRawResult() {
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                setRawResult(null);
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getRawResult());
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally() {
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
783b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * completeExceptionally(null) surprisingly has the same effect as
784b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * completeExceptionally(new RuntimeException())
785b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     */
786b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testCompleteExceptionally_null() {
787b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        RecursiveAction a = new CheckedRecursiveAction() {
788b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            protected void realCompute() {
789b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                AsyncFib f = new AsyncFib(8);
790b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                f.completeExceptionally(null);
791b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                try {
792b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    f.invoke();
793b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    shouldThrow();
794b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                } catch (RuntimeException success) {
795b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertSame(success.getClass(), RuntimeException.class);
796b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    assertNull(success.getCause());
797b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    checkCompletedAbnormally(f, success);
798b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                }
799b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            }};
800b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        testInvokeOnPool(mainPool(), a);
801b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    }
802b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak
803b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    /**
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() {
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() {
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() {
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollection() {
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPE() {
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = null;
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2() {
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
903b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g };
904b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(Arrays.asList(tasks));
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
906b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(tasks);
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1() {
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3() {
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
941b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g, h };
942b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(Arrays.asList(tasks));
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
944b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(tasks);
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * invokeAll(collection) throws exception if any task does
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollection() {
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
962b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g, h };
963b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                List taskList = Arrays.asList(tasks);
964b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(taskList);
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
966b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(taskList);
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tryUnfork returns true for most recent unexecuted task,
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * and suppresses execution
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTryUnfork() {
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.tryUnfork());
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getSurplusQueuedTaskCount returns > 0 when
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * there are more tasks than threads
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSurplusQueuedTaskCount() {
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(h, h.fork());
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(getSurplusQueuedTaskCount() > 0);
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getSurplusQueuedTaskCount());
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns most recent unexecuted task.
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTask() {
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, peekNextLocalTask());
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns most recent unexecuted task without
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTask() {
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollNextLocalTask());
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTask() {
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollTask());
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns least recent unexecuted task in async mode
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTaskAsync() {
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, peekNextLocalTask());
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns least recent unexecuted task without
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it, in async mode
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTaskAsync() {
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollNextLocalTask());
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it, in
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * async mode
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTaskAsync() {
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollTask());
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // versions for singleton pools
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns when task completes normally.
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks; getRawResult returns null.
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeSingleton() {
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvokeSingleton() {
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoinSingleton() {
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGetSingleton() {
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get());
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetSingleton() {
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get with null time unit throws NPE
12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetNPESingleton() {
12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, null);
12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoinSingleton() {
12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesceSingleton() {
12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeSingleton() {
12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvokeSingleton() {
12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoinSingleton() {
12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGetSingleton() {
13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGetSingleton() {
13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoinSingleton() {
13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvokeSingleton() {
13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoinSingleton() {
13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGetSingleton() {
14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGetSingleton() throws Exception {
14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoinSingleton() {
14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionallySingleton() {
14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2Singleton() {
14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
14818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
14828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1Singleton() {
14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3Singleton() {
15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
15268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollectionSingleton() {
15288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
15298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
15318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
15328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
15338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
15358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
15368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
15378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
15388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
15398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
15408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
15418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
15428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
15438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
15448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPESingleton() {
15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = null;
15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2Singleton() {
15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
1573b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g };
1574b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(Arrays.asList(tasks));
15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1576b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(tasks);
15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1Singleton() {
15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3Singleton() {
16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib f = new AsyncFib(8);
16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib g = new FailingAsyncFib(9);
16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
1611b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g, h };
1612b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(Arrays.asList(tasks));
16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1614b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(tasks);
16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * invokeAll(collection) throws exception if any task does
16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollectionSingleton() {
16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingAsyncFib f = new FailingAsyncFib(8);
16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib g = new AsyncFib(9);
16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                AsyncFib h = new AsyncFib(7);
1632b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                ForkJoinTask[] tasks = { f, g, h };
1633b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                List taskList = Arrays.asList(tasks);
1634b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                Collections.shuffle(taskList);
16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1636b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak                    invokeAll(taskList);
16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
16468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * ForkJoinTask.quietlyComplete returns when task completes
16478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * normally without setting a value. The most recent value
16488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * established by setRawResult(V) (or null by default) is returned
16498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * from invoke.
16508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
16518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testQuietlyComplete() {
16528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        RecursiveAction a = new CheckedRecursiveAction() {
16538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                protected void realCompute() {
16548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    AsyncFib f = new AsyncFib(8);
16558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    f.quietlyComplete();
16568e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    assertEquals(8, f.number);
16578e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    checkCompletedNormally(f);
16588e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                }};
16598e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        testInvokeOnPool(mainPool(), a);
16608e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
16618e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1663