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