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
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.HashSet;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CancellationException;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountedCompleter;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicReference;
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class CountedCompleterTest extends JSR166TestCase {
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
34b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(CountedCompleterTest.class);
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Runs with "mainPool" use > 1 thread. singletonPool tests use 1
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final int mainPoolSize =
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Math.max(2, Runtime.getRuntime().availableProcessors());
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool mainPool() {
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(mainPoolSize);
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool singletonPool() {
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1);
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool asyncSingletonPool() {
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1,
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                null, true);
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private void testInvokeOnPool(ForkJoinPool pool, ForkJoinTask a) {
56b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(pool)) {
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isDone());
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedNormally());
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedAbnormally());
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCancelled());
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getException());
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getRawResult());
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(pool.invoke(a));
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(a.isDone());
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(a.isCompletedNormally());
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCompletedAbnormally());
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(a.isCancelled());
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getException());
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.getRawResult());
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkNotDone(CountedCompleter a) {
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isDone());
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(0L, SECONDS);
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (TimeoutException success) {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedNormally(CountedCompleter<?> a) {
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedNormally());
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
100b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.join());
102b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.interrupted();
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
108b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
110b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.interrupted();
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.get());
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.get(5L, SECONDS));
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCancelled(CountedCompleter a) {
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCancelled());
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.getException() instanceof CancellationException);
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.cancel(false));
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.cancel(true));
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.interrupted();
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
143b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
145b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedAbnormally(CountedCompleter a, Throwable t) {
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(t.getClass(), a.getException().getClass());
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable expected) {
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), expected.getClass());
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.interrupted();
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        {
181b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            long startTime = System.nanoTime();
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.quietlyJoin();        // should be no-op
183b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.invoke();
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2038e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        } catch (Throwable success) {
2048e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertSame(t, success);
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public static final class FJException extends RuntimeException {
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FJException() { super(); }
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    abstract class CheckedCC extends CountedCompleter<Object> {
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicInteger computeN = new AtomicInteger(0);
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicInteger onCompletionN = new AtomicInteger(0);
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicInteger onExceptionalCompletionN = new AtomicInteger(0);
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicInteger setRawResultN = new AtomicInteger(0);
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicReference<Object> rawResult = new AtomicReference<Object>(null);
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int computeN() { return computeN.get(); }
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int onCompletionN() { return onCompletionN.get(); }
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int onExceptionalCompletionN() { return onExceptionalCompletionN.get(); }
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int setRawResultN() { return setRawResultN.get(); }
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CheckedCC() { super(); }
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CheckedCC(CountedCompleter p) { super(p); }
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CheckedCC(CountedCompleter p, int n) { super(p, n); }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        abstract void realCompute();
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void compute() {
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            computeN.incrementAndGet();
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            realCompute();
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void onCompletion(CountedCompleter caller) {
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            onCompletionN.incrementAndGet();
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.onCompletion(caller);
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public boolean onExceptionalCompletion(Throwable ex,
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                               CountedCompleter caller) {
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            onExceptionalCompletionN.incrementAndGet();
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNotNull(ex);
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(isCompletedAbnormally());
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(super.onExceptionalCompletion(ex, caller));
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return true;
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void setRawResult(Object t) {
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            setRawResultN.incrementAndGet();
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            rawResult.set(t);
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.setRawResult(t);
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void checkIncomplete() {
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, computeN());
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, onCompletionN());
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, onExceptionalCompletionN());
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, setRawResultN());
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkNotDone(this);
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void checkCompletes(Object rawResult) {
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkIncomplete();
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int pendingCount = getPendingCount();
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            complete(rawResult);
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(pendingCount, getPendingCount());
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, computeN());
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, onCompletionN());
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, onExceptionalCompletionN());
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, setRawResultN());
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(rawResult, this.rawResult.get());
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCompletedNormally(this);
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void checkCompletesExceptionally(Throwable ex) {
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkIncomplete();
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            completeExceptionally(ex);
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCompletedExceptionally(ex);
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void checkCompletedExceptionally(Throwable ex) {
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, computeN());
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, onCompletionN());
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, onExceptionalCompletionN());
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, setRawResultN());
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(this.rawResult.get());
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCompletedAbnormally(this, ex);
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class NoopCC extends CheckedCC {
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC() { super(); }
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC(CountedCompleter p) { super(p); }
285b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        NoopCC(CountedCompleter p, int initialPendingCount) {
286b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            super(p, initialPendingCount);
287b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void realCompute() {}
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A newly constructed CountedCompleter is not completed;
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * complete() causes completion. pendingCount is ignored.
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testComplete() {
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Object x : new Object[] { Boolean.TRUE, null }) {
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int pendingCount : new int[] { 0, 42 }) {
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                testComplete(new NoopCC(), x, pendingCount);
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                testComplete(new NoopCC(new NoopCC()), x, pendingCount);
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void testComplete(NoopCC cc, Object x, int pendingCount) {
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        cc.setPendingCount(pendingCount);
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        cc.checkCompletes(x);
306b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(pendingCount, cc.getPendingCount());
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completeExceptionally completes exceptionally
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally() {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        new NoopCC()
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            .checkCompletesExceptionally(new FJException());
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        new NoopCC(new NoopCC())
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            .checkCompletesExceptionally(new FJException());
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
320b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * completeExceptionally(null) surprisingly has the same effect as
321b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * completeExceptionally(new RuntimeException())
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally_null() {
324b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        NoopCC a = new NoopCC();
325b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        a.completeExceptionally(null);
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
327b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            a.invoke();
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
329b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        } catch (RuntimeException success) {
330b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertSame(success.getClass(), RuntimeException.class);
331b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertNull(success.getCause());
332b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            a.checkCompletedExceptionally(success);
333b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setPendingCount sets the reported pending count
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetPendingCount() {
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
342b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        int[] vals = {
343b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak             -1, 0, 1,
344b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak             Integer.MIN_VALUE,
345b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak             Integer.MAX_VALUE,
346b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        };
347b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        for (int val : vals) {
348b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            a.setPendingCount(val);
349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak            assertEquals(val, a.getPendingCount());
350b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        }
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addToPendingCount adds to the reported pending count
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddToPendingCount() {
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.addToPendingCount(1);
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, a.getPendingCount());
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.addToPendingCount(27);
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(28, a.getPendingCount());
363b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        a.addToPendingCount(-28);
364b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(0, a.getPendingCount());
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * decrementPendingCountUnlessZero decrements reported pending
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * count unless zero
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
371b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    public void testDecrementPendingCountUnlessZero() {
372b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        NoopCC a = new NoopCC(null, 2);
373b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(2, a.getPendingCount());
374b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(2, a.decrementPendingCountUnlessZero());
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, a.getPendingCount());
376b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(1, a.decrementPendingCountUnlessZero());
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
378b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(0, a.decrementPendingCountUnlessZero());
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
380b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        a.setPendingCount(-1);
381b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(-1, a.decrementPendingCountUnlessZero());
382b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        assertEquals(-2, a.getPendingCount());
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * compareAndSetPendingCount compares and sets the reported
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pending count
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompareAndSetPendingCount() {
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.compareAndSetPendingCount(0, 1));
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, a.getPendingCount());
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.compareAndSetPendingCount(1, 2));
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, a.getPendingCount());
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.compareAndSetPendingCount(1, 3));
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, a.getPendingCount());
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getCompleter returns parent or null if at root
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetCompleter() {
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getCompleter());
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountedCompleter b = new NoopCC(a);
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, b.getCompleter());
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CountedCompleter c = new NoopCC(b);
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(b, c.getCompleter());
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getRoot returns self if no parent, else parent's root
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetRoot() {
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC b = new NoopCC(a);
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC c = new NoopCC(b);
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, a.getRoot());
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, b.getRoot());
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, c.getRoot());
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tryComplete decrements pending count unless zero, in which case
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * causes completion
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTryComplete() {
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int n = 3;
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.setPendingCount(n);
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (; n > 0; n--) {
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(n, a.getPendingCount());
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.tryComplete();
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.checkIncomplete();
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(n - 1, a.getPendingCount());
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.tryComplete();
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.computeN());
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, a.onCompletionN());
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.onExceptionalCompletionN());
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.setRawResultN());
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * propagateCompletion decrements pending count unless zero, in
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * which case causes completion, without invoking onCompletion
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPropagateCompletion() {
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.getPendingCount());
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int n = 3;
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.setPendingCount(n);
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (; n > 0; n--) {
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(n, a.getPendingCount());
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.propagateCompletion();
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.checkIncomplete();
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(n - 1, a.getPendingCount());
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.propagateCompletion();
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.computeN());
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.onCompletionN());
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.onExceptionalCompletionN());
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, a.setRawResultN());
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a);
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * firstComplete returns this if pending count is zero else null
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testFirstComplete() {
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.setPendingCount(1);
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.firstComplete());
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.checkIncomplete();
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, a.firstComplete());
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.checkIncomplete();
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * firstComplete.nextComplete returns parent if pending count is
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * zero else null
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testNextComplete() {
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC b = new NoopCC(a);
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.setPendingCount(1);
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.setPendingCount(1);
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(b.firstComplete());
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(b, b.firstComplete());
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(b.nextComplete());
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.checkIncomplete();
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.checkIncomplete();
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, b.nextComplete());
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(a, b.nextComplete());
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.checkIncomplete();
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.checkIncomplete();
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.nextComplete());
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.checkIncomplete();
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkCompletedNormally(a);
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
506b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak     * quietlyCompleteRoot completes root task and only root task
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyCompleteRoot() {
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC a = new NoopCC();
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC b = new NoopCC(a);
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        NoopCC c = new NoopCC(b);
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.setPendingCount(1);
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.setPendingCount(1);
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        c.setPendingCount(1);
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        c.quietlyCompleteRoot();
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(b.isDone());
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(c.isDone());
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Invocation tests use some interdependent task classes
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // to better test propagation etc
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
5258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * Version of Fibonacci with different classes for left vs right forks
5268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    abstract class CCF extends CheckedCC {
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int number;
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int rnumber;
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public CCF(CountedCompleter parent, int n) {
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, 1);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            this.number = n;
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void realCompute() {
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            CCF f = this;
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (n >= 2) {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                new RCCF(f, n - 2).fork();
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new LCCF(f, --n);
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.complete(null);
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class LCCF extends CCF {
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public LCCF(int n) { this(null, n); }
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public LCCF(CountedCompleter parent, int n) {
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, n);
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void onCompletion(CountedCompleter caller) {
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.onCompletion(caller);
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            CCF p = (CCF)getCompleter();
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number + rnumber;
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (p != null)
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.number = n;
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                number = n;
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class RCCF extends CCF {
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public RCCF(CountedCompleter parent, int n) {
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, n);
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void onCompletion(CountedCompleter caller) {
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.onCompletion(caller);
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            CCF p = (CCF)getCompleter();
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number + rnumber;
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (p != null)
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.rnumber = n;
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                number = n;
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // Version of CCF with forced failure in left completions
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    abstract class FailingCCF extends CheckedCC {
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int number;
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int rnumber;
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public FailingCCF(CountedCompleter parent, int n) {
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, 1);
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            this.number = n;
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected final void realCompute() {
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FailingCCF f = this;
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            while (n >= 2) {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                new RFCCF(f, n - 2).fork();
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new LFCCF(f, --n);
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            f.complete(null);
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class LFCCF extends FailingCCF {
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public LFCCF(int n) { this(null, n); }
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public LFCCF(CountedCompleter parent, int n) {
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, n);
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void onCompletion(CountedCompleter caller) {
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.onCompletion(caller);
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            FailingCCF p = (FailingCCF)getCompleter();
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number + rnumber;
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (p != null)
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                p.number = n;
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                number = n;
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class RFCCF extends FailingCCF {
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public RFCCF(CountedCompleter parent, int n) {
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super(parent, n);
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public final void onCompletion(CountedCompleter caller) {
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            super.onCompletion(caller);
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            completeExceptionally(new FJException());
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns when task completes normally.
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks; getRawResult returns null.
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvoke() {
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvoke() {
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoin() {
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGet() {
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get());
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGet() {
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get with null time unit throws NPE
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetNPE() {
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, null);
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoin() {
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesce() {
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvoke() {
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvoke() {
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoin() {
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGet() {
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGet() {
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoin() {
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvoke() {
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoin() {
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGet() {
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGet() throws Exception {
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoin() {
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of executing task returns its pool
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool() {
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(mainPool, getPool());
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool, a);
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of non-FJ task returns null
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool2() {
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getPool());
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of executing task returns true
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool() {
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(inForkJoinPool());
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of non-FJ task returns false
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool2() {
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(inForkJoinPool());
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setRawResult(null) succeeds
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRawResult() {
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                setRawResult(null);
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getRawResult());
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally2() {
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF n = new LCCF(8);
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(n, 8);
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FJException ex = new FJException();
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(ex);
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.checkCompletedExceptionally(ex);
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                n.checkCompletedExceptionally(ex);
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() {
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() {
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() {
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollection() {
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPE() {
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = null;
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2() {
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g);
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1() {
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3() {
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11628e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * invokeAll(collection) throws exception if any task does
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollection() {
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(set);
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tryUnfork returns true for most recent unexecuted task,
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * and suppresses execution
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTryUnfork() {
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.tryUnfork());
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getSurplusQueuedTaskCount returns > 0 when
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * there are more tasks than threads
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSurplusQueuedTaskCount() {
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(h, h.fork());
12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(getSurplusQueuedTaskCount() > 0);
12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getSurplusQueuedTaskCount());
12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns most recent unexecuted task.
12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTask() {
12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, peekNextLocalTask());
12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns most recent unexecuted task without
12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it
12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTask() {
12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollNextLocalTask());
12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it
12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTask() {
12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollTask());
12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns least recent unexecuted task in async mode
12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTaskAsync() {
12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, peekNextLocalTask());
12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns least recent unexecuted task without
13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it, in async mode
13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTaskAsync() {
13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollNextLocalTask());
13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it, in
13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * async mode
13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTaskAsync() {
13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollTask());
13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // versions for singleton pools
13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns when task completes normally.
13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks; getRawResult returns null.
13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeSingleton() {
13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvokeSingleton() {
13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoinSingleton() {
13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGetSingleton() {
13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get());
14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetSingleton() {
14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get with null time unit throws NPE
14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetNPESingleton() {
14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, null);
14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoinSingleton() {
14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesceSingleton() {
14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeSingleton() {
14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
14818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
14828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvokeSingleton() {
14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoinSingleton() {
15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGetSingleton() {
15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
15268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
15278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
15298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
15318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
15328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
15338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
15418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGetSingleton() {
15438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
15458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoinSingleton() {
15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
15768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvokeSingleton() {
15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoinSingleton() {
15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGetSingleton() {
16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
16248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
16328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGetSingleton() throws Exception {
16348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
16368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(LONG_DELAY_MS, MILLISECONDS);
16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
16458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
16518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoinSingleton() {
16538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
16548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
16558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
16568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
16578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
16588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
16598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
16608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
16668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionallySingleton() {
16688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
16698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
16708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF n = new LCCF(8);
16718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(n, 8);
16728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FJException ex = new FJException();
16738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(ex);
16748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.checkCompletedExceptionally(ex);
16758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                n.checkCompletedExceptionally(ex);
16768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
16828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
16838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2Singleton() {
16848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
16858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
16868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
16878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
16888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
16898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
16908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
16918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
16928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
16938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
16948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
16958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
16968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
16978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
16988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
16998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1Singleton() {
17018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
17048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
17058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
17068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
17078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
17088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
17098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
17138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3Singleton() {
17158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
17188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
17198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
17208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
17218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
17228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
17238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
17248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
17258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
17268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
17278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
17288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
17298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
17338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollectionSingleton() {
17358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
17388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
17398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
17408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
17418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
17428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
17438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
17448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
17458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.number);
17468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.number);
17478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.number);
17488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
17498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
17508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
17518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
17528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
17538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
17578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPESingleton() {
17598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
17628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
17638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = null;
17648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
17658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
17668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
17678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
17688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
17698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
17708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
17748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2Singleton() {
17768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
17798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
17808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
17818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g);
17828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
17838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
17848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
17858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
17868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
17878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
17888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
17898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
17908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
17918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
17928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
17938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1Singleton() {
17948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
17958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
17968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
17978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
17988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
17998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
18008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
18018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
18028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
18038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
18048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
18058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
18098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3Singleton() {
18118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
18128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
18138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF f = new LCCF(8);
18148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF g = new LFCCF(9);
18158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
18168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
18178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
18188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
18198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
18208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
18218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
18228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
18238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
18248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
18278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * invokeAll(collection) throws exception if any task does
18288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
18298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollectionSingleton() {
18308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ForkJoinTask a = new CheckedRecursiveAction() {
18318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
18328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingCCF f = new LFCCF(8);
18338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF g = new LCCF(9);
18348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                CCF h = new LCCF(7);
18358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
18368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
18378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
18388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
18398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
18408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(set);
18418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
18428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
18438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
18448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
18458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
18468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
18478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
18488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
18498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1850