ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveTaskTest.java
(Generate patch)

Comparing jsr166/src/test/tck/RecursiveTaskTest.java (file contents):
Revision 1.5 by jsr166, Tue Aug 4 10:00:15 2009 UTC vs.
Revision 1.30 by jsr166, Wed Dec 31 16:44:02 2014 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   */
6 import junit.framework.*;
7 import java.util.concurrent.*;
8 import java.util.*;
6  
7 + import junit.framework.*;
8 + import java.util.concurrent.CancellationException;
9 + import java.util.concurrent.ExecutionException;
10 + import java.util.concurrent.ForkJoinPool;
11 + import java.util.concurrent.ForkJoinTask;
12 + import java.util.concurrent.RecursiveTask;
13 + import java.util.concurrent.TimeoutException;
14 + import static java.util.concurrent.TimeUnit.SECONDS;
15 + import java.util.HashSet;
16  
17   public class RecursiveTaskTest extends JSR166TestCase {
18  
19      public static void main(String[] args) {
20 <        junit.textui.TestRunner.run (suite());
20 >        junit.textui.TestRunner.run(suite());
21      }
22      public static Test suite() {
23 <        return new TestSuite(RecursiveTaskTest.class);
23 >        return new TestSuite(RecursiveTaskTest.class);
24 >    }
25 >
26 >    private static ForkJoinPool mainPool() {
27 >        return new ForkJoinPool();
28 >    }
29 >
30 >    private static ForkJoinPool singletonPool() {
31 >        return new ForkJoinPool(1);
32 >    }
33 >
34 >    private static ForkJoinPool asyncSingletonPool() {
35 >        return new ForkJoinPool(1,
36 >                                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
37 >                                null, true);
38 >    }
39 >
40 >    private <T> T testInvokeOnPool(ForkJoinPool pool, RecursiveTask<T> a) {
41 >        try {
42 >            checkNotDone(a);
43 >
44 >            T result = pool.invoke(a);
45 >
46 >            checkCompletedNormally(a, result);
47 >            return result;
48 >        } finally {
49 >            joinPool(pool);
50 >        }
51      }
52  
53 <    static final ForkJoinPool mainPool = new ForkJoinPool();
54 <    static final ForkJoinPool singletonPool = new ForkJoinPool(1);
55 <    static final ForkJoinPool asyncSingletonPool = new ForkJoinPool(1);
56 <    static {
57 <        asyncSingletonPool.setAsyncMode(true);
53 >    void checkNotDone(RecursiveTask a) {
54 >        assertFalse(a.isDone());
55 >        assertFalse(a.isCompletedNormally());
56 >        assertFalse(a.isCompletedAbnormally());
57 >        assertFalse(a.isCancelled());
58 >        assertNull(a.getException());
59 >        assertNull(a.getRawResult());
60 >
61 >        if (! ForkJoinTask.inForkJoinPool()) {
62 >            Thread.currentThread().interrupt();
63 >            try {
64 >                a.get();
65 >                shouldThrow();
66 >            } catch (InterruptedException success) {
67 >            } catch (Throwable fail) { threadUnexpectedException(fail); }
68 >
69 >            Thread.currentThread().interrupt();
70 >            try {
71 >                a.get(5L, SECONDS);
72 >                shouldThrow();
73 >            } catch (InterruptedException success) {
74 >            } catch (Throwable fail) { threadUnexpectedException(fail); }
75 >        }
76 >
77 >        try {
78 >            a.get(0L, SECONDS);
79 >            shouldThrow();
80 >        } catch (TimeoutException success) {
81 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
82 >    }
83 >
84 >    <T> void checkCompletedNormally(RecursiveTask<T> a, T expected) {
85 >        assertTrue(a.isDone());
86 >        assertFalse(a.isCancelled());
87 >        assertTrue(a.isCompletedNormally());
88 >        assertFalse(a.isCompletedAbnormally());
89 >        assertNull(a.getException());
90 >        assertSame(expected, a.getRawResult());
91 >        assertSame(expected, a.join());
92 >        assertFalse(a.cancel(false));
93 >        assertFalse(a.cancel(true));
94 >        try {
95 >            assertSame(expected, a.get());
96 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
97 >        try {
98 >            assertSame(expected, a.get(5L, SECONDS));
99 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
100 >    }
101 >
102 >    /**
103 >     * Waits for the task to complete, and checks that when it does,
104 >     * it will have an Integer result equals to the given int.
105 >     */
106 >    void checkCompletesNormally(RecursiveTask<Integer> a, int expected) {
107 >        Integer r = a.join();
108 >        assertEquals(expected, (int) r);
109 >        checkCompletedNormally(a, r);
110 >    }
111 >
112 >    /**
113 >     * Like checkCompletesNormally, but verifies that the task has
114 >     * already completed.
115 >     */
116 >    void checkCompletedNormally(RecursiveTask<Integer> a, int expected) {
117 >        Integer r = a.getRawResult();
118 >        assertEquals(expected, (int) r);
119 >        checkCompletedNormally(a, r);
120 >    }
121 >
122 >    void checkCancelled(RecursiveTask a) {
123 >        assertTrue(a.isDone());
124 >        assertTrue(a.isCancelled());
125 >        assertFalse(a.isCompletedNormally());
126 >        assertTrue(a.isCompletedAbnormally());
127 >        assertTrue(a.getException() instanceof CancellationException);
128 >        assertNull(a.getRawResult());
129 >
130 >        try {
131 >            a.join();
132 >            shouldThrow();
133 >        } catch (CancellationException success) {
134 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
135 >
136 >        try {
137 >            a.get();
138 >            shouldThrow();
139 >        } catch (CancellationException success) {
140 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
141 >
142 >        try {
143 >            a.get(5L, SECONDS);
144 >            shouldThrow();
145 >        } catch (CancellationException success) {
146 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
147 >    }
148 >
149 >    void checkCompletedAbnormally(RecursiveTask a, Throwable t) {
150 >        assertTrue(a.isDone());
151 >        assertFalse(a.isCancelled());
152 >        assertFalse(a.isCompletedNormally());
153 >        assertTrue(a.isCompletedAbnormally());
154 >        assertSame(t.getClass(), a.getException().getClass());
155 >        assertNull(a.getRawResult());
156 >        assertFalse(a.cancel(false));
157 >        assertFalse(a.cancel(true));
158 >
159 >        try {
160 >            a.join();
161 >            shouldThrow();
162 >        } catch (Throwable expected) {
163 >            assertSame(t.getClass(), expected.getClass());
164 >        }
165 >
166 >        try {
167 >            a.get();
168 >            shouldThrow();
169 >        } catch (ExecutionException success) {
170 >            assertSame(t.getClass(), success.getCause().getClass());
171 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
172 >
173 >        try {
174 >            a.get(5L, SECONDS);
175 >            shouldThrow();
176 >        } catch (ExecutionException success) {
177 >            assertSame(t.getClass(), success.getCause().getClass());
178 >        } catch (Throwable fail) { threadUnexpectedException(fail); }
179      }
180  
181 <    static final class FJException extends RuntimeException {
182 <        FJException() { super(); }
181 >    public static final class FJException extends RuntimeException {
182 >        public FJException() { super(); }
183      }
184  
185      // An invalid return value for Fib
186      static final Integer NoResult = Integer.valueOf(-17);
187  
188      // A simple recursive task for testing
189 <    static final class FibTask extends RecursiveTask<Integer> {
189 >    final class FibTask extends CheckedRecursiveTask<Integer> {
190          final int number;
191          FibTask(int n) { number = n; }
192 <        public Integer compute() {
192 >        public Integer realCompute() {
193              int n = number;
194              if (n <= 1)
195                  return n;
# Line 43 | Line 197 | public class RecursiveTaskTest extends J
197              f1.fork();
198              return (new FibTask(n - 2)).compute() + f1.join();
199          }
200 +
201 +        public void publicSetRawResult(Integer result) {
202 +            setRawResult(result);
203 +        }
204      }
205  
206      // A recursive action failing in base case
207 <    static final class FailingFibTask extends RecursiveTask<Integer> {
207 >    final class FailingFibTask extends RecursiveTask<Integer> {
208          final int number;
209          int result;
210          FailingFibTask(int n) { number = n; }
# Line 65 | Line 223 | public class RecursiveTaskTest extends J
223       * isCompletedAbnormally and isCancelled return false for normally
224       * completed tasks. getRawResult of a completed non-null task
225       * returns value;
68     *
226       */
227      public void testInvoke() {
228 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
229 <                public Integer compute() {
230 <                    FibTask f = new FibTask(8);
231 <                    Integer r = f.invoke();
232 <                    threadAssertTrue(r == 21);
233 <                    threadAssertTrue(f.isDone());
234 <                    threadAssertFalse(f.isCancelled());
235 <                    threadAssertFalse(f.isCompletedAbnormally());
236 <                    threadAssertTrue(f.getRawResult() == 21);
80 <                    return r;
81 <                }
82 <            };
83 <        assertTrue(mainPool.invoke(a) == 21);
228 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
229 >            public Integer realCompute() {
230 >                FibTask f = new FibTask(8);
231 >                Integer r = f.invoke();
232 >                assertEquals(21, (int) r);
233 >                checkCompletedNormally(f, r);
234 >                return r;
235 >            }};
236 >        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
237      }
238  
239      /**
# Line 89 | Line 242 | public class RecursiveTaskTest extends J
242       * completed tasks
243       */
244      public void testQuietlyInvoke() {
245 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
246 <                public Integer compute() {
247 <                    FibTask f = new FibTask(8);
248 <                    f.quietlyInvoke();
249 <                    Integer r = f.getRawResult();
250 <                    threadAssertTrue(r == 21);
251 <                    threadAssertTrue(f.isDone());
252 <                    threadAssertFalse(f.isCancelled());
100 <                    threadAssertFalse(f.isCompletedAbnormally());
101 <                    return r;
102 <                }
103 <            };
104 <        assertTrue(mainPool.invoke(a) == 21);
245 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
246 >            public Integer realCompute() {
247 >                FibTask f = new FibTask(8);
248 >                f.quietlyInvoke();
249 >                checkCompletedNormally(f, 21);
250 >                return NoResult;
251 >            }};
252 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
253      }
254  
255      /**
256       * join of a forked task returns when task completes
257       */
258      public void testForkJoin() {
259 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
260 <                public Integer compute() {
261 <                    FibTask f = new FibTask(8);
262 <                    f.fork();
263 <                    Integer r = f.join();
264 <                    threadAssertTrue(r == 21);
265 <                    threadAssertTrue(f.isDone());
266 <                    return r;
267 <                }
268 <            };
121 <        assertTrue(mainPool.invoke(a) == 21);
259 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
260 >            public Integer realCompute() {
261 >                FibTask f = new FibTask(8);
262 >                assertSame(f, f.fork());
263 >                Integer r = f.join();
264 >                assertEquals(21, (int) r);
265 >                checkCompletedNormally(f, r);
266 >                return r;
267 >            }};
268 >        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
269      }
270  
271      /**
272       * get of a forked task returns when task completes
273       */
274      public void testForkGet() {
275 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
276 <                public Integer compute() {
277 <                    try {
278 <                        FibTask f = new FibTask(8);
279 <                        f.fork();
280 <                        Integer r = f.get();
281 <                        threadAssertTrue(r == 21);
282 <                        threadAssertTrue(f.isDone());
283 <                        return r;
284 <                    } catch (Exception ex) {
138 <                        unexpectedException();
139 <                    }
140 <                    return NoResult;
141 <                }
142 <            };
143 <        assertTrue(mainPool.invoke(a) == 21);
275 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
276 >            public Integer realCompute() throws Exception {
277 >                FibTask f = new FibTask(8);
278 >                assertSame(f, f.fork());
279 >                Integer r = f.get();
280 >                assertEquals(21, (int) r);
281 >                checkCompletedNormally(f, r);
282 >                return r;
283 >            }};
284 >        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
285      }
286  
287      /**
288       * timed get of a forked task returns when task completes
289       */
290      public void testForkTimedGet() {
291 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
292 <                public Integer compute() {
293 <                    try {
294 <                        FibTask f = new FibTask(8);
295 <                        f.fork();
296 <                        Integer r = f.get(5L, TimeUnit.SECONDS);
297 <                        threadAssertTrue(r == 21);
298 <                        threadAssertTrue(f.isDone());
299 <                        return r;
300 <                    } catch (Exception ex) {
160 <                        unexpectedException();
161 <                    }
162 <                    return NoResult;
163 <                }
164 <            };
165 <        assertTrue(mainPool.invoke(a) == 21);
166 <    }
167 <
168 <    /**
169 <     * helpJoin of a forked task returns when task completes
170 <     */
171 <    public void testForkHelpJoin() {
172 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
173 <                public Integer compute() {
174 <                    FibTask f = new FibTask(8);
175 <                    f.fork();
176 <                    Integer r = f.helpJoin();
177 <                    threadAssertTrue(r == 21);
178 <                    threadAssertTrue(f.isDone());
179 <                    return r;
180 <                }
181 <            };
182 <        assertTrue(mainPool.invoke(a) == 21);
291 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
292 >            public Integer realCompute() throws Exception {
293 >                FibTask f = new FibTask(8);
294 >                assertSame(f, f.fork());
295 >                Integer r = f.get(5L, SECONDS);
296 >                assertEquals(21, (int) r);
297 >                checkCompletedNormally(f, r);
298 >                return r;
299 >            }};
300 >        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
301      }
302  
303      /**
304       * quietlyJoin of a forked task returns when task completes
305       */
306      public void testForkQuietlyJoin() {
307 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
308 <                public Integer compute() {
309 <                    FibTask f = new FibTask(8);
310 <                    f.fork();
311 <                    f.quietlyJoin();
312 <                    Integer r = f.getRawResult();
313 <                    threadAssertTrue(r == 21);
314 <                    threadAssertTrue(f.isDone());
315 <                    return r;
316 <                }
317 <            };
200 <        assertTrue(mainPool.invoke(a) == 21);
307 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
308 >            public Integer realCompute() {
309 >                FibTask f = new FibTask(8);
310 >                assertSame(f, f.fork());
311 >                f.quietlyJoin();
312 >                Integer r = f.getRawResult();
313 >                assertEquals(21, (int) r);
314 >                checkCompletedNormally(f, r);
315 >                return r;
316 >            }};
317 >        assertEquals(21, (int) testInvokeOnPool(mainPool(), a));
318      }
319  
203
204    /**
205     * quietlyHelpJoin of a forked task returns when task completes
206     */
207    public void testForkQuietlyHelpJoin() {
208        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
209                public Integer compute() {
210                    FibTask f = new FibTask(8);
211                    f.fork();
212                    f.quietlyHelpJoin();
213                    Integer r = f.getRawResult();
214                    threadAssertTrue(r == 21);
215                    threadAssertTrue(f.isDone());
216                    return r;
217                }
218            };
219        assertTrue(mainPool.invoke(a) == 21);
220    }
221
222
320      /**
321       * helpQuiesce returns when tasks are complete.
322       * getQueuedTaskCount returns 0 when quiescent
323       */
324      public void testForkHelpQuiesce() {
325 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
326 <                public Integer compute() {
327 <                    FibTask f = new FibTask(8);
328 <                    f.fork();
329 <                    f.helpQuiesce();
330 <                    Integer r = f.getRawResult();
331 <                    threadAssertTrue(r == 21);
332 <                    threadAssertTrue(f.isDone());
333 <                    threadAssertTrue(getQueuedTaskCount() == 0);
334 <                    return r;
238 <                }
239 <            };
240 <        assertTrue(mainPool.invoke(a) == 21);
325 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
326 >            public Integer realCompute() {
327 >                FibTask f = new FibTask(8);
328 >                assertSame(f, f.fork());
329 >                helpQuiesce();
330 >                assertEquals(0, getQueuedTaskCount());
331 >                checkCompletedNormally(f, 21);
332 >                return NoResult;
333 >            }};
334 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
335      }
336  
243
337      /**
338       * invoke task throws exception when task completes abnormally
339       */
340      public void testAbnormalInvoke() {
341 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
342 <                public Integer compute() {
343 <                    try {
344 <                        FailingFibTask f = new FailingFibTask(8);
345 <                        f.invoke();
346 <                        shouldThrow();
347 <                        return NoResult;
348 <                    } catch (FJException success) {
256 <                    }
257 <                    return NoResult;
341 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
342 >            public Integer realCompute() {
343 >                FailingFibTask f = new FailingFibTask(8);
344 >                try {
345 >                    f.invoke();
346 >                    shouldThrow();
347 >                } catch (FJException success) {
348 >                    checkCompletedAbnormally(f, success);
349                  }
350 <            };
351 <        mainPool.invoke(a);
350 >                return NoResult;
351 >            }};
352 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
353      }
354  
355      /**
356       * quietlyInvoke task returns when task completes abnormally
357       */
358      public void testAbnormalQuietlyInvoke() {
359 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
360 <                public Integer compute() {
361 <                    FailingFibTask f = new FailingFibTask(8);
362 <                    f.quietlyInvoke();
363 <                    threadAssertTrue(f.isDone());
364 <                    return NoResult;
365 <                }
366 <            };
367 <        mainPool.invoke(a);
359 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
360 >            public Integer realCompute() {
361 >                FailingFibTask f = new FailingFibTask(8);
362 >                f.quietlyInvoke();
363 >                assertTrue(f.getException() instanceof FJException);
364 >                checkCompletedAbnormally(f, f.getException());
365 >                return NoResult;
366 >            }};
367 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
368      }
369  
370      /**
371       * join of a forked task throws exception when task completes abnormally
372       */
373      public void testAbnormalForkJoin() {
374 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
375 <                public Integer compute() {
376 <                    try {
377 <                        FailingFibTask f = new FailingFibTask(8);
378 <                        f.fork();
379 <                        Integer r = f.join();
380 <                        shouldThrow();
381 <                        return r;
382 <                    } catch (FJException success) {
291 <                    }
292 <                    return NoResult;
374 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
375 >            public Integer realCompute() {
376 >                FailingFibTask f = new FailingFibTask(8);
377 >                assertSame(f, f.fork());
378 >                try {
379 >                    Integer r = f.join();
380 >                    shouldThrow();
381 >                } catch (FJException success) {
382 >                    checkCompletedAbnormally(f, success);
383                  }
384 <            };
385 <        mainPool.invoke(a);
384 >                return NoResult;
385 >            }};
386 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
387      }
388  
389      /**
390       * get of a forked task throws exception when task completes abnormally
391       */
392      public void testAbnormalForkGet() {
393 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
394 <                public Integer compute() {
395 <                    try {
396 <                        FailingFibTask f = new FailingFibTask(8);
397 <                        f.fork();
398 <                        Integer r = f.get();
399 <                        shouldThrow();
400 <                        return r;
401 <                    } catch (ExecutionException success) {
402 <                    } catch (Exception ex) {
403 <                        unexpectedException(ex);
313 <                    }
314 <                    return NoResult;
393 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
394 >            public Integer realCompute() throws Exception {
395 >                FailingFibTask f = new FailingFibTask(8);
396 >                assertSame(f, f.fork());
397 >                try {
398 >                    Integer r = f.get();
399 >                    shouldThrow();
400 >                } catch (ExecutionException success) {
401 >                    Throwable cause = success.getCause();
402 >                    assertTrue(cause instanceof FJException);
403 >                    checkCompletedAbnormally(f, cause);
404                  }
405 <            };
406 <        mainPool.invoke(a);
405 >                return NoResult;
406 >            }};
407 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
408      }
409  
410      /**
411       * timed get of a forked task throws exception when task completes abnormally
412       */
413      public void testAbnormalForkTimedGet() {
414 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
415 <                public Integer compute() {
416 <                    try {
417 <                        FailingFibTask f = new FailingFibTask(8);
418 <                        f.fork();
419 <                        Integer r = f.get(5L, TimeUnit.SECONDS);
420 <                        shouldThrow();
421 <                        return r;
422 <                    } catch (ExecutionException success) {
423 <                    } catch (Exception ex) {
424 <                        unexpectedException(ex);
335 <                    }
336 <                    return NoResult;
337 <                }
338 <            };
339 <        mainPool.invoke(a);
340 <    }
341 <
342 <    /**
343 <     * join of a forked task throws exception when task completes abnormally
344 <     */
345 <    public void testAbnormalForkHelpJoin() {
346 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
347 <                public Integer compute() {
348 <                    try {
349 <                        FailingFibTask f = new FailingFibTask(8);
350 <                        f.fork();
351 <                        Integer r = f.helpJoin();
352 <                        shouldThrow();
353 <                        return r;
354 <                    } catch (FJException success) {
355 <                    }
356 <                    return NoResult;
414 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
415 >            public Integer realCompute() throws Exception {
416 >                FailingFibTask f = new FailingFibTask(8);
417 >                assertSame(f, f.fork());
418 >                try {
419 >                    Integer r = f.get(5L, SECONDS);
420 >                    shouldThrow();
421 >                } catch (ExecutionException success) {
422 >                    Throwable cause = success.getCause();
423 >                    assertTrue(cause instanceof FJException);
424 >                    checkCompletedAbnormally(f, cause);
425                  }
426 <            };
427 <        mainPool.invoke(a);
428 <    }
361 <
362 <    /**
363 <     * quietlyHelpJoin of a forked task returns when task completes abnormally.
364 <     * getException of failed task returns its exception.
365 <     * isCompletedAbnormally of a failed task returns true.
366 <     * isCancelled of a failed uncancelled task returns false
367 <     */
368 <    public void testAbnormalForkQuietlyHelpJoin() {
369 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
370 <                public Integer compute() {
371 <                    FailingFibTask f = new FailingFibTask(8);
372 <                    f.fork();
373 <                    f.quietlyHelpJoin();
374 <                    threadAssertTrue(f.isDone());
375 <                    threadAssertTrue(f.isCompletedAbnormally());
376 <                    threadAssertFalse(f.isCancelled());
377 <                    threadAssertTrue(f.getException() instanceof FJException);
378 <                    return NoResult;
379 <                }
380 <            };
381 <        mainPool.invoke(a);
426 >                return NoResult;
427 >            }};
428 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
429      }
430  
431      /**
432       * quietlyJoin of a forked task returns when task completes abnormally
433       */
434      public void testAbnormalForkQuietlyJoin() {
435 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
436 <                public Integer compute() {
437 <                    FailingFibTask f = new FailingFibTask(8);
438 <                    f.fork();
439 <                    f.quietlyJoin();
440 <                    threadAssertTrue(f.isDone());
441 <                    threadAssertTrue(f.isCompletedAbnormally());
442 <                    threadAssertTrue(f.getException() instanceof FJException);
443 <                    return NoResult;
444 <                }
398 <            };
399 <        mainPool.invoke(a);
435 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
436 >            public Integer realCompute() {
437 >                FailingFibTask f = new FailingFibTask(8);
438 >                assertSame(f, f.fork());
439 >                f.quietlyJoin();
440 >                assertTrue(f.getException() instanceof FJException);
441 >                checkCompletedAbnormally(f, f.getException());
442 >                return NoResult;
443 >            }};
444 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
445      }
446  
447      /**
448       * invoke task throws exception when task cancelled
449       */
450      public void testCancelledInvoke() {
451 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
452 <                public Integer compute() {
453 <                    try {
454 <                        FibTask f = new FibTask(8);
455 <                        f.cancel(true);
456 <                        Integer r = f.invoke();
457 <                        shouldThrow();
458 <                        return r;
459 <                    } catch (CancellationException success) {
415 <                    }
416 <                    return NoResult;
451 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
452 >            public Integer realCompute() {
453 >                FibTask f = new FibTask(8);
454 >                assertTrue(f.cancel(true));
455 >                try {
456 >                    Integer r = f.invoke();
457 >                    shouldThrow();
458 >                } catch (CancellationException success) {
459 >                    checkCancelled(f);
460                  }
461 <            };
462 <        mainPool.invoke(a);
461 >                return NoResult;
462 >            }};
463 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
464      }
465  
466      /**
467       * join of a forked task throws exception when task cancelled
468       */
469      public void testCancelledForkJoin() {
470 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
471 <                public Integer compute() {
472 <                    try {
473 <                        FibTask f = new FibTask(8);
474 <                        f.cancel(true);
475 <                        f.fork();
476 <                        Integer r = f.join();
477 <                        shouldThrow();
478 <                        return r;
479 <                    } catch (CancellationException success) {
436 <                    }
437 <                    return NoResult;
470 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
471 >            public Integer realCompute() {
472 >                FibTask f = new FibTask(8);
473 >                assertTrue(f.cancel(true));
474 >                assertSame(f, f.fork());
475 >                try {
476 >                    Integer r = f.join();
477 >                    shouldThrow();
478 >                } catch (CancellationException success) {
479 >                    checkCancelled(f);
480                  }
481 <            };
482 <        mainPool.invoke(a);
481 >                return NoResult;
482 >            }};
483 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
484      }
485  
486      /**
487       * get of a forked task throws exception when task cancelled
488       */
489      public void testCancelledForkGet() {
490 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
491 <                public Integer compute() {
492 <                    try {
493 <                        FibTask f = new FibTask(8);
494 <                        f.cancel(true);
495 <                        f.fork();
496 <                        Integer r = f.get();
497 <                        shouldThrow();
498 <                        return r;
499 <                    } catch (CancellationException success) {
457 <                    } catch (Exception ex) {
458 <                        unexpectedException(ex);
459 <                    }
460 <                    return NoResult;
490 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
491 >            public Integer realCompute() throws Exception {
492 >                FibTask f = new FibTask(8);
493 >                assertTrue(f.cancel(true));
494 >                assertSame(f, f.fork());
495 >                try {
496 >                    Integer r = f.get();
497 >                    shouldThrow();
498 >                } catch (CancellationException success) {
499 >                    checkCancelled(f);
500                  }
501 <            };
502 <        mainPool.invoke(a);
501 >                return NoResult;
502 >            }};
503 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
504      }
505  
506      /**
507       * timed get of a forked task throws exception when task cancelled
508       */
509      public void testCancelledForkTimedGet() {
510 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
511 <                public Integer compute() {
512 <                    try {
513 <                        FibTask f = new FibTask(8);
514 <                        f.cancel(true);
515 <                        f.fork();
516 <                        Integer r = f.get(5L, TimeUnit.SECONDS);
517 <                        shouldThrow();
518 <                        return r;
519 <                    } catch (CancellationException success) {
480 <                    } catch (Exception ex) {
481 <                        unexpectedException(ex);
482 <                    }
483 <                    return NoResult;
484 <                }
485 <            };
486 <        mainPool.invoke(a);
487 <    }
488 <
489 <    /**
490 <     * join of a forked task throws exception when task cancelled
491 <     */
492 <    public void testCancelledForkHelpJoin() {
493 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
494 <                public Integer compute() {
495 <                    try {
496 <                        FibTask f = new FibTask(8);
497 <                        f.cancel(true);
498 <                        f.fork();
499 <                        Integer r = f.helpJoin();
500 <                        shouldThrow();
501 <                        return r;
502 <                    } catch (CancellationException success) {
503 <                    }
504 <                    return NoResult;
505 <                }
506 <            };
507 <        mainPool.invoke(a);
508 <    }
509 <
510 <    /**
511 <     * quietlyHelpJoin of a forked task returns when task cancelled.
512 <     * getException of cancelled task returns its exception
513 <     * isCompletedAbnormally of a cancelled task returns true.
514 <     * isCancelled of a cancelled task returns true
515 <     */
516 <    public void testCancelledForkQuietlyHelpJoin() {
517 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
518 <                public Integer compute() {
519 <                    FibTask f = new FibTask(8);
520 <                    f.cancel(true);
521 <                    f.fork();
522 <                    f.quietlyHelpJoin();
523 <                    threadAssertTrue(f.isDone());
524 <                    threadAssertTrue(f.isCompletedAbnormally());
525 <                    threadAssertTrue(f.isCancelled());
526 <                    threadAssertTrue(f.getException() instanceof CancellationException);
527 <                    return NoResult;
510 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
511 >            public Integer realCompute() throws Exception {
512 >                FibTask f = new FibTask(8);
513 >                assertTrue(f.cancel(true));
514 >                assertSame(f, f.fork());
515 >                try {
516 >                    Integer r = f.get(5L, SECONDS);
517 >                    shouldThrow();
518 >                } catch (CancellationException success) {
519 >                    checkCancelled(f);
520                  }
521 <            };
522 <        mainPool.invoke(a);
521 >                return NoResult;
522 >            }};
523 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
524      }
525  
526      /**
527       * quietlyJoin of a forked task returns when task cancelled
528       */
529      public void testCancelledForkQuietlyJoin() {
530 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
531 <                public Integer compute() {
532 <                    FibTask f = new FibTask(8);
533 <                    f.cancel(true);
534 <                    f.fork();
535 <                    f.quietlyJoin();
536 <                    threadAssertTrue(f.isDone());
537 <                    threadAssertTrue(f.isCompletedAbnormally());
538 <                    threadAssertTrue(f.getException() instanceof CancellationException);
539 <                    return NoResult;
547 <                }
548 <            };
549 <        mainPool.invoke(a);
530 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
531 >            public Integer realCompute() {
532 >                FibTask f = new FibTask(8);
533 >                assertTrue(f.cancel(true));
534 >                assertSame(f, f.fork());
535 >                f.quietlyJoin();
536 >                checkCancelled(f);
537 >                return NoResult;
538 >            }};
539 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
540      }
541  
542      /**
543       * getPool of executing task returns its pool
544       */
545      public void testGetPool() {
546 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
547 <                public Integer compute() {
548 <                    threadAssertTrue(getPool() == mainPool);
549 <                    return NoResult;
550 <                }
551 <            };
552 <        mainPool.invoke(a);
546 >        final ForkJoinPool mainPool = mainPool();
547 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
548 >            public Integer realCompute() {
549 >                assertSame(mainPool, getPool());
550 >                return NoResult;
551 >            }};
552 >        assertSame(NoResult, testInvokeOnPool(mainPool, a));
553      }
554  
555      /**
556       * getPool of non-FJ task returns null
557       */
558      public void testGetPool2() {
559 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
560 <            public Integer compute() {
561 <                threadAssertTrue(getPool() == null);
559 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
560 >            public Integer realCompute() {
561 >                assertNull(getPool());
562                  return NoResult;
563 <            }
564 <        };
575 <        a.invoke();
563 >            }};
564 >        assertSame(NoResult, a.invoke());
565      }
566  
567      /**
568       * inForkJoinPool of executing task returns true
569       */
570      public void testInForkJoinPool() {
571 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
572 <                public Integer compute() {
573 <                    threadAssertTrue(inForkJoinPool());
574 <                    return NoResult;
575 <                }
576 <            };
588 <        mainPool.invoke(a);
571 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
572 >            public Integer realCompute() {
573 >                assertTrue(inForkJoinPool());
574 >                return NoResult;
575 >            }};
576 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
577      }
578  
579      /**
580       * inForkJoinPool of non-FJ task returns false
581       */
582      public void testInForkJoinPool2() {
583 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
584 <                public Integer compute() {
585 <                    threadAssertTrue(!inForkJoinPool());
586 <                    return NoResult;
587 <                }
588 <            };
601 <        a.invoke();
583 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
584 >            public Integer realCompute() {
585 >                assertFalse(inForkJoinPool());
586 >                return NoResult;
587 >            }};
588 >        assertSame(NoResult, a.invoke());
589      }
590  
591      /**
592 <     * setRawResult(null) succeeds
592 >     * The value set by setRawResult is returned by getRawResult
593       */
594      public void testSetRawResult() {
595 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
596 <                public Integer compute() {
597 <                    setRawResult(NoResult);
598 <                    return NoResult;
599 <                }
600 <            };
601 <        assertEquals(a.invoke(), NoResult);
595 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
596 >            public Integer realCompute() {
597 >                setRawResult(NoResult);
598 >                assertSame(NoResult, getRawResult());
599 >                return NoResult;
600 >            }
601 >        };
602 >        assertSame(NoResult, a.invoke());
603      }
604  
605      /**
606 <     * A reinitialized task may be re-invoked
606 >     * A reinitialized normally completed task may be re-invoked
607       */
608      public void testReinitialize() {
609 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
610 <                public Integer compute() {
611 <                    FibTask f = new FibTask(8);
609 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
610 >            public Integer realCompute() {
611 >                FibTask f = new FibTask(8);
612 >                checkNotDone(f);
613 >
614 >                for (int i = 0; i < 3; i++) {
615                      Integer r = f.invoke();
616 <                    threadAssertTrue(r == 21);
617 <                    threadAssertTrue(f.isDone());
627 <                    threadAssertFalse(f.isCancelled());
628 <                    threadAssertFalse(f.isCompletedAbnormally());
616 >                    assertEquals(21, (int) r);
617 >                    checkCompletedNormally(f, r);
618                      f.reinitialize();
619 <                    r = f.invoke();
620 <                    threadAssertTrue(r == 21);
632 <                    return NoResult;
619 >                    f.publicSetRawResult(null);
620 >                    checkNotDone(f);
621                  }
622 <            };
623 <        mainPool.invoke(a);
622 >                return NoResult;
623 >            }};
624 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
625      }
626  
627      /**
628 <     * invoke task throws exception after invoking completeExceptionally
628 >     * A reinitialized abnormally completed task may be re-invoked
629       */
630 <    public void testCompleteExceptionally() {
631 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
632 <                public Integer compute() {
630 >    public void testReinitializeAbnormal() {
631 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
632 >            public Integer realCompute() {
633 >                FailingFibTask f = new FailingFibTask(8);
634 >                checkNotDone(f);
635 >
636 >                for (int i = 0; i < 3; i++) {
637                      try {
638 <                        FibTask f = new FibTask(8);
646 <                        f.completeExceptionally(new FJException());
647 <                        Integer r = f.invoke();
638 >                        f.invoke();
639                          shouldThrow();
649                        return r;
640                      } catch (FJException success) {
641 +                        checkCompletedAbnormally(f, success);
642                      }
643 <                    return NoResult;
643 >                    f.reinitialize();
644 >                    checkNotDone(f);
645                  }
646 <            };
647 <        mainPool.invoke(a);
646 >                return NoResult;
647 >            }};
648 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
649      }
650  
651      /**
652 <     * invoke task suppresses execution invoking complete
652 >     * invoke task throws exception after invoking completeExceptionally
653       */
654 <    public void testComplete() {
655 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
656 <                public Integer compute() {
657 <                    FibTask f = new FibTask(8);
658 <                    f.complete(NoResult);
654 >    public void testCompleteExceptionally() {
655 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
656 >            public Integer realCompute() {
657 >                FibTask f = new FibTask(8);
658 >                f.completeExceptionally(new FJException());
659 >                try {
660                      Integer r = f.invoke();
661 <                    threadAssertTrue(f.isDone());
662 <                    threadAssertTrue(r == NoResult);
663 <                    return r;
661 >                    shouldThrow();
662 >                } catch (FJException success) {
663 >                    checkCompletedAbnormally(f, success);
664                  }
665 <            };
666 <        mainPool.invoke(a);
665 >                return NoResult;
666 >            }};
667 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
668 >    }
669 >
670 >    /**
671 >     * invoke task suppresses execution invoking complete
672 >     */
673 >    public void testComplete() {
674 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
675 >            public Integer realCompute() {
676 >                FibTask f = new FibTask(8);
677 >                f.complete(NoResult);
678 >                Integer r = f.invoke();
679 >                assertSame(NoResult, r);
680 >                checkCompletedNormally(f, NoResult);
681 >                return r;
682 >            }};
683 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
684      }
685  
686      /**
687       * invokeAll(t1, t2) invokes all task arguments
688       */
689      public void testInvokeAll2() {
690 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
691 <                public Integer compute() {
692 <                    FibTask f = new FibTask(8);
693 <                    FibTask g = new FibTask(9);
694 <                    invokeAll(f, g);
695 <                    threadAssertTrue(f.isDone());
696 <                    threadAssertTrue(f.join() == 21);
697 <                    threadAssertTrue(g.isDone());
698 <                    threadAssertTrue(g.join() == 34);
699 <                    return NoResult;
689 <                }
690 <            };
691 <        mainPool.invoke(a);
690 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
691 >            public Integer realCompute() {
692 >                FibTask f = new FibTask(8);
693 >                FibTask g = new FibTask(9);
694 >                invokeAll(f, g);
695 >                checkCompletedNormally(f, 21);
696 >                checkCompletedNormally(g, 34);
697 >                return NoResult;
698 >            }};
699 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
700      }
701  
702      /**
703       * invokeAll(tasks) with 1 argument invokes task
704       */
705      public void testInvokeAll1() {
706 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
707 <                public Integer compute() {
708 <                    FibTask f = new FibTask(8);
709 <                    invokeAll(f);
710 <                    threadAssertTrue(f.isDone());
711 <                    threadAssertTrue(f.join() == 21);
712 <                    return NoResult;
713 <                }
706 <            };
707 <        mainPool.invoke(a);
706 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
707 >            public Integer realCompute() {
708 >                FibTask f = new FibTask(8);
709 >                invokeAll(f);
710 >                checkCompletedNormally(f, 21);
711 >                return NoResult;
712 >            }};
713 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
714      }
715  
716      /**
717       * invokeAll(tasks) with > 2 argument invokes tasks
718       */
719      public void testInvokeAll3() {
720 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
721 <                public Integer compute() {
722 <                    FibTask f = new FibTask(8);
723 <                    FibTask g = new FibTask(9);
724 <                    FibTask h = new FibTask(7);
725 <                    invokeAll(f, g, h);
726 <                    threadAssertTrue(f.isDone());
727 <                    threadAssertTrue(f.join() == 21);
728 <                    threadAssertTrue(g.isDone());
729 <                    threadAssertTrue(g.join() == 34);
730 <                    threadAssertTrue(h.isDone());
731 <                    threadAssertTrue(h.join() == 13);
732 <                    return NoResult;
733 <                }
734 <            };
729 <        mainPool.invoke(a);
720 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
721 >            public Integer realCompute() {
722 >                FibTask f = new FibTask(8);
723 >                FibTask g = new FibTask(9);
724 >                FibTask h = new FibTask(7);
725 >                invokeAll(f, g, h);
726 >                assertTrue(f.isDone());
727 >                assertTrue(g.isDone());
728 >                assertTrue(h.isDone());
729 >                checkCompletedNormally(f, 21);
730 >                checkCompletedNormally(g, 34);
731 >                checkCompletedNormally(h, 13);
732 >                return NoResult;
733 >            }};
734 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
735      }
736  
737      /**
738       * invokeAll(collection) invokes all tasks in the collection
739       */
740      public void testInvokeAllCollection() {
741 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
742 <                public Integer compute() {
743 <                    FibTask f = new FibTask(8);
744 <                    FibTask g = new FibTask(9);
745 <                    FibTask h = new FibTask(7);
746 <                    HashSet set = new HashSet();
747 <                    set.add(f);
748 <                    set.add(g);
749 <                    set.add(h);
750 <                    invokeAll(set);
751 <                    threadAssertTrue(f.isDone());
752 <                    threadAssertTrue(f.join() == 21);
753 <                    threadAssertTrue(g.isDone());
754 <                    threadAssertTrue(g.join() == 34);
755 <                    threadAssertTrue(h.isDone());
756 <                    threadAssertTrue(h.join() == 13);
757 <                    return NoResult;
758 <                }
759 <            };
755 <        mainPool.invoke(a);
741 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
742 >            public Integer realCompute() {
743 >                FibTask f = new FibTask(8);
744 >                FibTask g = new FibTask(9);
745 >                FibTask h = new FibTask(7);
746 >                HashSet set = new HashSet();
747 >                set.add(f);
748 >                set.add(g);
749 >                set.add(h);
750 >                invokeAll(set);
751 >                assertTrue(f.isDone());
752 >                assertTrue(g.isDone());
753 >                assertTrue(h.isDone());
754 >                checkCompletedNormally(f, 21);
755 >                checkCompletedNormally(g, 34);
756 >                checkCompletedNormally(h, 13);
757 >                return NoResult;
758 >            }};
759 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
760      }
761  
762 +    /**
763 +     * invokeAll(tasks) with any null task throws NPE
764 +     */
765 +    public void testInvokeAllNPE() {
766 +        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
767 +            public Integer realCompute() {
768 +                FibTask f = new FibTask(8);
769 +                FibTask g = new FibTask(9);
770 +                FibTask h = null;
771 +                try {
772 +                    invokeAll(f, g, h);
773 +                    shouldThrow();
774 +                } catch (NullPointerException success) {}
775 +                return NoResult;
776 +            }};
777 +        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
778 +    }
779  
780      /**
781       * invokeAll(t1, t2) throw exception if any task does
782       */
783      public void testAbnormalInvokeAll2() {
784 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
785 <                public Integer compute() {
786 <                    try {
787 <                        FibTask f = new FibTask(8);
788 <                        FailingFibTask g = new FailingFibTask(9);
789 <                        invokeAll(f, g);
790 <                        shouldThrow();
791 <                        return NoResult;
792 <                    } catch (FJException success) {
772 <                    }
773 <                    return NoResult;
784 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
785 >            public Integer realCompute() {
786 >                FibTask f = new FibTask(8);
787 >                FailingFibTask g = new FailingFibTask(9);
788 >                try {
789 >                    invokeAll(f, g);
790 >                    shouldThrow();
791 >                } catch (FJException success) {
792 >                    checkCompletedAbnormally(g, success);
793                  }
794 <            };
795 <        mainPool.invoke(a);
794 >                return NoResult;
795 >            }};
796 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
797      }
798  
799      /**
800       * invokeAll(tasks) with 1 argument throws exception if task does
801       */
802      public void testAbnormalInvokeAll1() {
803 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
804 <                public Integer compute() {
805 <                    try {
806 <                        FailingFibTask g = new FailingFibTask(9);
807 <                        invokeAll(g);
808 <                        shouldThrow();
809 <                        return NoResult;
810 <                    } catch (FJException success) {
791 <                    }
792 <                    return NoResult;
803 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
804 >            public Integer realCompute() {
805 >                FailingFibTask g = new FailingFibTask(9);
806 >                try {
807 >                    invokeAll(g);
808 >                    shouldThrow();
809 >                } catch (FJException success) {
810 >                    checkCompletedAbnormally(g, success);
811                  }
812 <            };
813 <        mainPool.invoke(a);
812 >                return NoResult;
813 >            }};
814 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
815      }
816  
817      /**
818       * invokeAll(tasks) with > 2 argument throws exception if any task does
819       */
820      public void testAbnormalInvokeAll3() {
821 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
822 <                public Integer compute() {
823 <                    try {
824 <                        FibTask f = new FibTask(8);
825 <                        FailingFibTask g = new FailingFibTask(9);
826 <                        FibTask h = new FibTask(7);
827 <                        invokeAll(f, g, h);
828 <                        shouldThrow();
829 <                        return NoResult;
830 <                    } catch (FJException success) {
812 <                    }
813 <                    return NoResult;
821 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
822 >            public Integer realCompute() {
823 >                FibTask f = new FibTask(8);
824 >                FailingFibTask g = new FailingFibTask(9);
825 >                FibTask h = new FibTask(7);
826 >                try {
827 >                    invokeAll(f, g, h);
828 >                    shouldThrow();
829 >                } catch (FJException success) {
830 >                    checkCompletedAbnormally(g, success);
831                  }
832 <            };
833 <        mainPool.invoke(a);
832 >                return NoResult;
833 >            }};
834 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
835      }
836  
837      /**
838       * invokeAll(collection) throws exception if any task does
839       */
840      public void testAbnormalInvokeAllCollection() {
841 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
842 <                public Integer compute() {
843 <                    try {
844 <                        FailingFibTask f = new FailingFibTask(8);
845 <                        FibTask g = new FibTask(9);
846 <                        FibTask h = new FibTask(7);
847 <                        HashSet set = new HashSet();
848 <                        set.add(f);
849 <                        set.add(g);
850 <                        set.add(h);
851 <                        invokeAll(set);
852 <                        shouldThrow();
853 <                        return NoResult;
854 <                    } catch (FJException success) {
837 <                    }
838 <                    return NoResult;
841 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
842 >            public Integer realCompute() {
843 >                FailingFibTask f = new FailingFibTask(8);
844 >                FibTask g = new FibTask(9);
845 >                FibTask h = new FibTask(7);
846 >                HashSet set = new HashSet();
847 >                set.add(f);
848 >                set.add(g);
849 >                set.add(h);
850 >                try {
851 >                    invokeAll(set);
852 >                    shouldThrow();
853 >                } catch (FJException success) {
854 >                    checkCompletedAbnormally(f, success);
855                  }
856 <            };
857 <        mainPool.invoke(a);
856 >                return NoResult;
857 >            }};
858 >        assertSame(NoResult, testInvokeOnPool(mainPool(), a));
859      }
860  
861      /**
# Line 846 | Line 863 | public class RecursiveTaskTest extends J
863       * and suppresses execution
864       */
865      public void testTryUnfork() {
866 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
867 <                public Integer compute() {
868 <                    FibTask g = new FibTask(9);
869 <                    g.fork();
870 <                    FibTask f = new FibTask(8);
871 <                    f.fork();
872 <                    threadAssertTrue(f.tryUnfork());
873 <                    helpQuiesce();
874 <                    threadAssertFalse(f.isDone());
875 <                    threadAssertTrue(g.isDone());
876 <                    return NoResult;
877 <                }
878 <            };
862 <        singletonPool.invoke(a);
866 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
867 >            public Integer realCompute() {
868 >                FibTask g = new FibTask(9);
869 >                assertSame(g, g.fork());
870 >                FibTask f = new FibTask(8);
871 >                assertSame(f, f.fork());
872 >                assertTrue(f.tryUnfork());
873 >                helpQuiesce();
874 >                checkNotDone(f);
875 >                checkCompletedNormally(g, 34);
876 >                return NoResult;
877 >            }};
878 >        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
879      }
880  
881      /**
# Line 867 | Line 883 | public class RecursiveTaskTest extends J
883       * there are more tasks than threads
884       */
885      public void testGetSurplusQueuedTaskCount() {
886 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
887 <                public Integer compute() {
888 <                    FibTask h = new FibTask(7);
889 <                    h.fork();
890 <                    FibTask g = new FibTask(9);
891 <                    g.fork();
892 <                    FibTask f = new FibTask(8);
893 <                    f.fork();
894 <                    threadAssertTrue(getSurplusQueuedTaskCount() > 0);
895 <                    helpQuiesce();
896 <                    return NoResult;
897 <                }
898 <            };
899 <        singletonPool.invoke(a);
886 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
887 >            public Integer realCompute() {
888 >                FibTask h = new FibTask(7);
889 >                assertSame(h, h.fork());
890 >                FibTask g = new FibTask(9);
891 >                assertSame(g, g.fork());
892 >                FibTask f = new FibTask(8);
893 >                assertSame(f, f.fork());
894 >                assertTrue(getSurplusQueuedTaskCount() > 0);
895 >                helpQuiesce();
896 >                assertEquals(0, getSurplusQueuedTaskCount());
897 >                checkCompletedNormally(f, 21);
898 >                checkCompletedNormally(g, 34);
899 >                checkCompletedNormally(h, 13);
900 >                return NoResult;
901 >            }};
902 >        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
903      }
904  
905      /**
906       * peekNextLocalTask returns most recent unexecuted task.
907       */
908      public void testPeekNextLocalTask() {
909 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
910 <                public Integer compute() {
911 <                    FibTask g = new FibTask(9);
912 <                    g.fork();
913 <                    FibTask f = new FibTask(8);
914 <                    f.fork();
915 <                    threadAssertTrue(peekNextLocalTask() == f);
916 <                    f.join();
917 <                    threadAssertTrue(f.isDone());
918 <                    helpQuiesce();
919 <                    return NoResult;
920 <                }
921 <            };
903 <        singletonPool.invoke(a);
909 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
910 >            public Integer realCompute() {
911 >                FibTask g = new FibTask(9);
912 >                assertSame(g, g.fork());
913 >                FibTask f = new FibTask(8);
914 >                assertSame(f, f.fork());
915 >                assertSame(f, peekNextLocalTask());
916 >                checkCompletesNormally(f, 21);
917 >                helpQuiesce();
918 >                checkCompletedNormally(g, 34);
919 >                return NoResult;
920 >            }};
921 >        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
922      }
923  
924      /**
# Line 908 | Line 926 | public class RecursiveTaskTest extends J
926       * without executing it
927       */
928      public void testPollNextLocalTask() {
929 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
930 <                public Integer compute() {
931 <                    FibTask g = new FibTask(9);
932 <                    g.fork();
933 <                    FibTask f = new FibTask(8);
934 <                    f.fork();
935 <                    threadAssertTrue(pollNextLocalTask() == f);
936 <                    helpQuiesce();
937 <                    threadAssertFalse(f.isDone());
938 <                    return NoResult;
939 <                }
940 <            };
941 <        singletonPool.invoke(a);
929 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
930 >            public Integer realCompute() {
931 >                FibTask g = new FibTask(9);
932 >                assertSame(g, g.fork());
933 >                FibTask f = new FibTask(8);
934 >                assertSame(f, f.fork());
935 >                assertSame(f, pollNextLocalTask());
936 >                helpQuiesce();
937 >                checkNotDone(f);
938 >                checkCompletedNormally(g, 34);
939 >                return NoResult;
940 >            }};
941 >        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
942      }
943  
944      /**
945 <     * pollTask returns an unexecuted task
928 <     * without executing it
945 >     * pollTask returns an unexecuted task without executing it
946       */
947      public void testPollTask() {
948 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
949 <                public Integer compute() {
950 <                    FibTask g = new FibTask(9);
951 <                    g.fork();
952 <                    FibTask f = new FibTask(8);
953 <                    f.fork();
954 <                    threadAssertTrue(pollTask() == f);
955 <                    helpQuiesce();
956 <                    threadAssertFalse(f.isDone());
957 <                    threadAssertTrue(g.isDone());
958 <                    return NoResult;
959 <                }
960 <            };
944 <        singletonPool.invoke(a);
948 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
949 >            public Integer realCompute() {
950 >                FibTask g = new FibTask(9);
951 >                assertSame(g, g.fork());
952 >                FibTask f = new FibTask(8);
953 >                assertSame(f, f.fork());
954 >                assertSame(f, pollTask());
955 >                helpQuiesce();
956 >                checkNotDone(f);
957 >                checkCompletedNormally(g, 34);
958 >                return NoResult;
959 >            }};
960 >        assertSame(NoResult, testInvokeOnPool(singletonPool(), a));
961      }
962  
963      /**
964       * peekNextLocalTask returns least recent unexecuted task in async mode
965       */
966      public void testPeekNextLocalTaskAsync() {
967 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
968 <                public Integer compute() {
969 <                    FibTask g = new FibTask(9);
970 <                    g.fork();
971 <                    FibTask f = new FibTask(8);
972 <                    f.fork();
973 <                    threadAssertTrue(peekNextLocalTask() == g);
974 <                    f.join();
975 <                    helpQuiesce();
976 <                    threadAssertTrue(f.isDone());
977 <                    return NoResult;
978 <                }
979 <            };
980 <        asyncSingletonPool.invoke(a);
967 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
968 >            public Integer realCompute() {
969 >                FibTask g = new FibTask(9);
970 >                assertSame(g, g.fork());
971 >                FibTask f = new FibTask(8);
972 >                assertSame(f, f.fork());
973 >                assertSame(g, peekNextLocalTask());
974 >                assertEquals(21, (int) f.join());
975 >                helpQuiesce();
976 >                checkCompletedNormally(f, 21);
977 >                checkCompletedNormally(g, 34);
978 >                return NoResult;
979 >            }};
980 >        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
981      }
982  
983      /**
984 <     * pollNextLocalTask returns least recent unexecuted task
985 <     * without executing it, in async mode
984 >     * pollNextLocalTask returns least recent unexecuted task without
985 >     * executing it, in async mode
986       */
987      public void testPollNextLocalTaskAsync() {
988 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
989 <                public Integer compute() {
990 <                    FibTask g = new FibTask(9);
991 <                    g.fork();
992 <                    FibTask f = new FibTask(8);
993 <                    f.fork();
994 <                    threadAssertTrue(pollNextLocalTask() == g);
995 <                    helpQuiesce();
996 <                    threadAssertTrue(f.isDone());
997 <                    threadAssertFalse(g.isDone());
998 <                    return NoResult;
999 <                }
1000 <            };
985 <        asyncSingletonPool.invoke(a);
988 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
989 >            public Integer realCompute() {
990 >                FibTask g = new FibTask(9);
991 >                assertSame(g, g.fork());
992 >                FibTask f = new FibTask(8);
993 >                assertSame(f, f.fork());
994 >                assertSame(g, pollNextLocalTask());
995 >                helpQuiesce();
996 >                checkCompletedNormally(f, 21);
997 >                checkNotDone(g);
998 >                return NoResult;
999 >            }};
1000 >        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
1001      }
1002  
1003      /**
1004 <     * pollTask returns an unexecuted task
1005 <     * without executing it, in async mode
1004 >     * pollTask returns an unexecuted task without executing it, in
1005 >     * async mode
1006       */
1007      public void testPollTaskAsync() {
1008 <        RecursiveTask<Integer> a = new RecursiveTask<Integer>() {
1009 <                public Integer compute() {
1010 <                    FibTask g = new FibTask(9);
1011 <                    g.fork();
1012 <                    FibTask f = new FibTask(8);
1013 <                    f.fork();
1014 <                    threadAssertTrue(pollTask() == g);
1015 <                    helpQuiesce();
1016 <                    threadAssertTrue(f.isDone());
1017 <                    threadAssertFalse(g.isDone());
1018 <                    return NoResult;
1019 <                }
1020 <            };
1006 <        asyncSingletonPool.invoke(a);
1008 >        RecursiveTask<Integer> a = new CheckedRecursiveTask<Integer>() {
1009 >            public Integer realCompute() {
1010 >                FibTask g = new FibTask(9);
1011 >                assertSame(g, g.fork());
1012 >                FibTask f = new FibTask(8);
1013 >                assertSame(f, f.fork());
1014 >                assertSame(g, pollTask());
1015 >                helpQuiesce();
1016 >                checkCompletedNormally(f, 21);
1017 >                checkNotDone(g);
1018 >                return NoResult;
1019 >            }};
1020 >        assertSame(NoResult, testInvokeOnPool(asyncSingletonPool(), a));
1021      }
1022  
1023   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines