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