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

Comparing jsr166/src/test/tck/RecursiveActionTest.java (file contents):
Revision 1.13 by jsr166, Sat Sep 11 07:31:52 2010 UTC vs.
Revision 1.18 by jsr166, Thu Sep 16 00:52:49 2010 UTC

# Line 3 | Line 3
3   * Expert Group and released to the public domain, as explained at
4   * http://creativecommons.org/licenses/publicdomain
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.ForkJoinWorkerThread;
12 + import java.util.concurrent.RecursiveAction;
13 + import java.util.concurrent.TimeUnit;
14 + import java.util.HashSet;
15  
16   public class RecursiveActionTest extends JSR166TestCase {
17  
# Line 18 | Line 23 | public class RecursiveActionTest extends
23          return new TestSuite(RecursiveActionTest.class);
24      }
25  
26 <    static final ForkJoinPool mainPool = new ForkJoinPool();
27 <    static final ForkJoinPool singletonPool = new ForkJoinPool(1);
28 <    static final ForkJoinPool asyncSingletonPool =
29 <        new ForkJoinPool(1, ForkJoinPool.defaultForkJoinWorkerThreadFactory,
30 <                         null, true);
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 void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) {
41 >        try {
42 >            assertFalse(a.isDone());
43 >            assertFalse(a.isCompletedNormally());
44 >            assertFalse(a.isCompletedAbnormally());
45 >            assertFalse(a.isCancelled());
46 >            assertNull(a.getException());
47 >
48 >            assertNull(pool.invoke(a));
49 >
50 >            assertTrue(a.isDone());
51 >            assertTrue(a.isCompletedNormally());
52 >            assertFalse(a.isCompletedAbnormally());
53 >            assertFalse(a.isCancelled());
54 >            assertNull(a.getException());
55 >        } finally {
56 >            joinPool(pool);
57 >        }
58 >    }
59  
60      static final class FJException extends RuntimeException {
61          FJException() { super(); }
62      }
63  
64      // A simple recursive action for testing
65 <    static final class FibAction extends RecursiveAction {
65 >    final class FibAction extends CheckedRecursiveAction {
66          final int number;
67          int result;
68          FibAction(int n) { number = n; }
69 <        public void compute() {
69 >        public void realCompute() {
70              int n = number;
71              if (n <= 1)
72                  result = n;
# Line 70 | Line 103 | public class RecursiveActionTest extends
103       * completed tasks. getRawResult of a RecursiveAction returns null;
104       */
105      public void testInvoke() {
106 <        RecursiveAction a = new RecursiveAction() {
107 <            public void compute() {
106 >        RecursiveAction a = new CheckedRecursiveAction() {
107 >            public void realCompute() {
108                  FibAction f = new FibAction(8);
109 <                f.invoke();
110 <                threadAssertTrue(f.result == 21);
111 <                threadAssertTrue(f.isDone());
112 <                threadAssertFalse(f.isCancelled());
113 <                threadAssertFalse(f.isCompletedAbnormally());
114 <                threadAssertTrue(f.getRawResult() == null);
109 >                assertNull(f.invoke());
110 >                assertEquals(21, f.result);
111 >                assertTrue(f.isDone());
112 >                assertFalse(f.isCancelled());
113 >                assertFalse(f.isCompletedAbnormally());
114 >                assertNull(f.getRawResult());
115              }};
116 <        mainPool.invoke(a);
116 >        testInvokeOnPool(mainPool(), a);
117      }
118  
119      /**
# Line 89 | Line 122 | public class RecursiveActionTest extends
122       * completed tasks
123       */
124      public void testQuietlyInvoke() {
125 <        RecursiveAction a = new RecursiveAction() {
126 <            public void compute() {
125 >        RecursiveAction a = new CheckedRecursiveAction() {
126 >            public void realCompute() {
127                  FibAction f = new FibAction(8);
128                  f.quietlyInvoke();
129 <                threadAssertTrue(f.result == 21);
130 <                threadAssertTrue(f.isDone());
131 <                threadAssertFalse(f.isCancelled());
132 <                threadAssertFalse(f.isCompletedAbnormally());
133 <                threadAssertTrue(f.getRawResult() == null);
129 >                assertEquals(21, f.result);
130 >                assertTrue(f.isDone());
131 >                assertFalse(f.isCancelled());
132 >                assertFalse(f.isCompletedAbnormally());
133 >                assertNull(f.getRawResult());
134              }};
135 <        mainPool.invoke(a);
135 >        testInvokeOnPool(mainPool(), a);
136      }
137  
138      /**
139       * join of a forked task returns when task completes
140       */
141      public void testForkJoin() {
142 <        RecursiveAction a = new RecursiveAction() {
143 <            public void compute() {
142 >        RecursiveAction a = new CheckedRecursiveAction() {
143 >            public void realCompute() {
144                  FibAction f = new FibAction(8);
145 <                f.fork();
146 <                f.join();
147 <                threadAssertTrue(f.result == 21);
148 <                threadAssertTrue(f.isDone());
149 <                threadAssertTrue(f.getRawResult() == null);
145 >                assertSame(f, f.fork());
146 >                assertNull(f.join());
147 >                assertEquals(21, f.result);
148 >                assertTrue(f.isDone());
149 >                assertNull(f.getRawResult());
150              }};
151 <        mainPool.invoke(a);
151 >        testInvokeOnPool(mainPool(), a);
152      }
153  
154      /**
155       * get of a forked task returns when task completes
156       */
157      public void testForkGet() {
158 <        RecursiveAction a = new RecursiveAction() {
159 <            public void compute() {
160 <                try {
161 <                    FibAction f = new FibAction(8);
162 <                    f.fork();
163 <                    f.get();
164 <                    threadAssertTrue(f.result == 21);
132 <                    threadAssertTrue(f.isDone());
133 <                } catch (Exception ex) {
134 <                    unexpectedException(ex);
135 <                }
158 >        RecursiveAction a = new CheckedRecursiveAction() {
159 >            public void realCompute() throws Exception {
160 >                FibAction f = new FibAction(8);
161 >                assertSame(f, f.fork());
162 >                assertNull(f.get());
163 >                assertEquals(21, f.result);
164 >                assertTrue(f.isDone());
165              }};
166 <        mainPool.invoke(a);
166 >        testInvokeOnPool(mainPool(), a);
167      }
168  
169      /**
170       * timed get of a forked task returns when task completes
171       */
172      public void testForkTimedGet() {
173 <        RecursiveAction a = new RecursiveAction() {
174 <            public void compute() {
175 <                try {
176 <                    FibAction f = new FibAction(8);
177 <                    f.fork();
178 <                    f.get(5L, TimeUnit.SECONDS);
179 <                    threadAssertTrue(f.result == 21);
151 <                    threadAssertTrue(f.isDone());
152 <                } catch (Exception ex) {
153 <                    unexpectedException(ex);
154 <                }
173 >        RecursiveAction a = new CheckedRecursiveAction() {
174 >            public void realCompute() throws Exception {
175 >                FibAction f = new FibAction(8);
176 >                assertSame(f, f.fork());
177 >                assertNull(f.get(5L, TimeUnit.SECONDS));
178 >                assertEquals(21, f.result);
179 >                assertTrue(f.isDone());
180              }};
181 <        mainPool.invoke(a);
181 >        testInvokeOnPool(mainPool(), a);
182      }
183  
184      /**
185       * timed get with null time unit throws NPE
186       */
187      public void testForkTimedGetNPE() {
188 <        RecursiveAction a = new RecursiveAction() {
189 <            public void compute() {
188 >        RecursiveAction a = new CheckedRecursiveAction() {
189 >            public void realCompute() throws Exception {
190 >                FibAction f = new FibAction(8);
191 >                assertSame(f, f.fork());
192                  try {
166                    FibAction f = new FibAction(8);
167                    f.fork();
193                      f.get(5L, null);
194                      shouldThrow();
195 <                } catch (NullPointerException success) {
171 <                } catch (Exception ex) {
172 <                    unexpectedException(ex);
173 <                }
195 >                } catch (NullPointerException success) {}
196              }};
197 <        mainPool.invoke(a);
197 >        testInvokeOnPool(mainPool(), a);
198      }
199  
200      /**
201       * quietlyJoin of a forked task returns when task completes
202       */
203      public void testForkQuietlyJoin() {
204 <        RecursiveAction a = new RecursiveAction() {
205 <            public void compute() {
204 >        RecursiveAction a = new CheckedRecursiveAction() {
205 >            public void realCompute() {
206                  FibAction f = new FibAction(8);
207 <                f.fork();
207 >                assertSame(f, f.fork());
208                  f.quietlyJoin();
209 <                threadAssertTrue(f.result == 21);
210 <                threadAssertTrue(f.isDone());
209 >                assertEquals(21, f.result);
210 >                assertTrue(f.isDone());
211              }};
212 <        mainPool.invoke(a);
212 >        testInvokeOnPool(mainPool(), a);
213      }
214  
215  
# Line 196 | Line 218 | public class RecursiveActionTest extends
218       * getQueuedTaskCount returns 0 when quiescent
219       */
220      public void testForkHelpQuiesce() {
221 <        RecursiveAction a = new RecursiveAction() {
222 <            public void compute() {
221 >        RecursiveAction a = new CheckedRecursiveAction() {
222 >            public void realCompute() {
223                  FibAction f = new FibAction(8);
224 <                f.fork();
224 >                assertSame(f, f.fork());
225                  f.helpQuiesce();
226 <                threadAssertTrue(f.result == 21);
227 <                threadAssertTrue(f.isDone());
228 <                threadAssertTrue(getQueuedTaskCount() == 0);
226 >                assertEquals(21, f.result);
227 >                assertTrue(f.isDone());
228 >                assertEquals(0, getQueuedTaskCount());
229              }};
230 <        mainPool.invoke(a);
230 >        testInvokeOnPool(mainPool(), a);
231      }
232  
233  
# Line 213 | Line 235 | public class RecursiveActionTest extends
235       * invoke task throws exception when task completes abnormally
236       */
237      public void testAbnormalInvoke() {
238 <        RecursiveAction a = new RecursiveAction() {
239 <            public void compute() {
238 >        RecursiveAction a = new CheckedRecursiveAction() {
239 >            public void realCompute() {
240 >                FailingFibAction f = new FailingFibAction(8);
241                  try {
219                    FailingFibAction f = new FailingFibAction(8);
242                      f.invoke();
243                      shouldThrow();
244 <                } catch (FJException success) {
223 <                }
244 >                } catch (FJException success) {}
245              }};
246 <        mainPool.invoke(a);
246 >        testInvokeOnPool(mainPool(), a);
247      }
248  
249      /**
250       * quietlyInvoke task returns when task completes abnormally
251       */
252      public void testAbnormalQuietlyInvoke() {
253 <        RecursiveAction a = new RecursiveAction() {
254 <            public void compute() {
253 >        RecursiveAction a = new CheckedRecursiveAction() {
254 >            public void realCompute() {
255                  FailingFibAction f = new FailingFibAction(8);
256                  f.quietlyInvoke();
257 <                threadAssertTrue(f.isDone());
257 >                assertTrue(f.isDone());
258              }};
259 <        mainPool.invoke(a);
259 >        testInvokeOnPool(mainPool(), a);
260      }
261  
262      /**
263       * join of a forked task throws exception when task completes abnormally
264       */
265      public void testAbnormalForkJoin() {
266 <        RecursiveAction a = new RecursiveAction() {
267 <            public void compute() {
266 >        RecursiveAction a = new CheckedRecursiveAction() {
267 >            public void realCompute() {
268 >                FailingFibAction f = new FailingFibAction(8);
269 >                assertSame(f, f.fork());
270                  try {
248                    FailingFibAction f = new FailingFibAction(8);
249                    f.fork();
271                      f.join();
272                      shouldThrow();
273 <                } catch (FJException success) {
253 <                }
273 >                } catch (FJException success) {}
274              }};
275 <        mainPool.invoke(a);
275 >        testInvokeOnPool(mainPool(), a);
276      }
277  
278      /**
279       * get of a forked task throws exception when task completes abnormally
280       */
281      public void testAbnormalForkGet() {
282 <        RecursiveAction a = new RecursiveAction() {
283 <            public void compute() {
282 >        RecursiveAction a = new CheckedRecursiveAction() {
283 >            public void realCompute() throws Exception {
284 >                FailingFibAction f = new FailingFibAction(8);
285 >                assertSame(f, f.fork());
286                  try {
265                    FailingFibAction f = new FailingFibAction(8);
266                    f.fork();
287                      f.get();
288                      shouldThrow();
289 <                } catch (ExecutionException success) {
270 <                } catch (Exception ex) {
271 <                    unexpectedException(ex);
272 <                }
289 >                } catch (ExecutionException success) {}
290              }};
291 <        mainPool.invoke(a);
291 >        testInvokeOnPool(mainPool(), a);
292      }
293  
294      /**
295       * timed get of a forked task throws exception when task completes abnormally
296       */
297      public void testAbnormalForkTimedGet() {
298 <        RecursiveAction a = new RecursiveAction() {
299 <            public void compute() {
298 >        RecursiveAction a = new CheckedRecursiveAction() {
299 >            public void realCompute() throws Exception {
300 >                FailingFibAction f = new FailingFibAction(8);
301 >                assertSame(f, f.fork());
302                  try {
284                    FailingFibAction f = new FailingFibAction(8);
285                    f.fork();
303                      f.get(5L, TimeUnit.SECONDS);
304                      shouldThrow();
305 <                } catch (ExecutionException success) {
289 <                } catch (Exception ex) {
290 <                    unexpectedException(ex);
291 <                }
305 >                } catch (ExecutionException success) {}
306              }};
307 <        mainPool.invoke(a);
307 >        testInvokeOnPool(mainPool(), a);
308      }
309  
310      /**
311       * quietlyJoin of a forked task returns when task completes abnormally
312       */
313      public void testAbnormalForkQuietlyJoin() {
314 <        RecursiveAction a = new RecursiveAction() {
315 <            public void compute() {
314 >        RecursiveAction a = new CheckedRecursiveAction() {
315 >            public void realCompute() {
316                  FailingFibAction f = new FailingFibAction(8);
317 <                f.fork();
317 >                assertSame(f, f.fork());
318                  f.quietlyJoin();
319 <                threadAssertTrue(f.isDone());
320 <                threadAssertTrue(f.isCompletedAbnormally());
321 <                threadAssertTrue(f.getException() instanceof FJException);
319 >                assertTrue(f.isDone());
320 >                assertTrue(f.isCompletedAbnormally());
321 >                assertTrue(f.getException() instanceof FJException);
322              }};
323 <        mainPool.invoke(a);
323 >        testInvokeOnPool(mainPool(), a);
324      }
325  
326      /**
327       * invoke task throws exception when task cancelled
328       */
329      public void testCancelledInvoke() {
330 <        RecursiveAction a = new RecursiveAction() {
331 <            public void compute() {
330 >        RecursiveAction a = new CheckedRecursiveAction() {
331 >            public void realCompute() {
332 >                FibAction f = new FibAction(8);
333 >                assertTrue(f.cancel(true));
334                  try {
319                    FibAction f = new FibAction(8);
320                    f.cancel(true);
335                      f.invoke();
336                      shouldThrow();
337 <                } catch (CancellationException success) {
324 <                }
337 >                } catch (CancellationException success) {}
338              }};
339 <        mainPool.invoke(a);
339 >        testInvokeOnPool(mainPool(), a);
340      }
341  
342      /**
343       * join of a forked task throws exception when task cancelled
344       */
345      public void testCancelledForkJoin() {
346 <        RecursiveAction a = new RecursiveAction() {
347 <            public void compute() {
346 >        RecursiveAction a = new CheckedRecursiveAction() {
347 >            public void realCompute() {
348 >                FibAction f = new FibAction(8);
349 >                assertTrue(f.cancel(true));
350 >                assertSame(f, f.fork());
351                  try {
336                    FibAction f = new FibAction(8);
337                    f.cancel(true);
338                    f.fork();
352                      f.join();
353                      shouldThrow();
354 <                } catch (CancellationException success) {
342 <                }
354 >                } catch (CancellationException success) {}
355              }};
356 <        mainPool.invoke(a);
356 >        testInvokeOnPool(mainPool(), a);
357      }
358  
359      /**
360       * get of a forked task throws exception when task cancelled
361       */
362      public void testCancelledForkGet() {
363 <        RecursiveAction a = new RecursiveAction() {
364 <            public void compute() {
363 >        RecursiveAction a = new CheckedRecursiveAction() {
364 >            public void realCompute() throws Exception {
365 >                FibAction f = new FibAction(8);
366 >                assertTrue(f.cancel(true));
367 >                assertSame(f, f.fork());
368                  try {
354                    FibAction f = new FibAction(8);
355                    f.cancel(true);
356                    f.fork();
369                      f.get();
370                      shouldThrow();
371 <                } catch (CancellationException success) {
360 <                } catch (Exception ex) {
361 <                    unexpectedException(ex);
362 <                }
371 >                } catch (CancellationException success) {}
372              }};
373 <        mainPool.invoke(a);
373 >        testInvokeOnPool(mainPool(), a);
374      }
375  
376      /**
377       * timed get of a forked task throws exception when task cancelled
378       */
379      public void testCancelledForkTimedGet() {
380 <        RecursiveAction a = new RecursiveAction() {
381 <            public void compute() {
380 >        RecursiveAction a = new CheckedRecursiveAction() {
381 >            public void realCompute() throws Exception {
382 >                FibAction f = new FibAction(8);
383 >                assertTrue(f.cancel(true));
384 >                assertSame(f, f.fork());
385                  try {
374                    FibAction f = new FibAction(8);
375                    f.cancel(true);
376                    f.fork();
386                      f.get(5L, TimeUnit.SECONDS);
387                      shouldThrow();
388 <                } catch (CancellationException success) {
380 <                } catch (Exception ex) {
381 <                    unexpectedException(ex);
382 <                }
388 >                } catch (CancellationException success) {}
389              }};
390 <        mainPool.invoke(a);
390 >        testInvokeOnPool(mainPool(), a);
391      }
392  
393      /**
394       * quietlyJoin of a forked task returns when task cancelled
395       */
396      public void testCancelledForkQuietlyJoin() {
397 <        RecursiveAction a = new RecursiveAction() {
398 <            public void compute() {
397 >        RecursiveAction a = new CheckedRecursiveAction() {
398 >            public void realCompute() {
399                  FibAction f = new FibAction(8);
400 <                f.cancel(true);
401 <                f.fork();
400 >                assertTrue(f.cancel(true));
401 >                assertSame(f, f.fork());
402                  f.quietlyJoin();
403 <                threadAssertTrue(f.isDone());
404 <                threadAssertTrue(f.isCompletedAbnormally());
405 <                threadAssertTrue(f.getException() instanceof CancellationException);
403 >                assertTrue(f.isDone());
404 >                assertTrue(f.isCompletedAbnormally());
405 >                assertTrue(f.isCancelled());
406 >                assertTrue(f.getException() instanceof CancellationException);
407              }};
408 <        mainPool.invoke(a);
408 >        testInvokeOnPool(mainPool(), a);
409      }
410  
411      /**
412       * getPool of executing task returns its pool
413       */
414      public void testGetPool() {
415 <        RecursiveAction a = new RecursiveAction() {
416 <            public void compute() {
417 <                threadAssertTrue(getPool() == mainPool);
415 >        final ForkJoinPool mainPool = mainPool();
416 >        RecursiveAction a = new CheckedRecursiveAction() {
417 >            public void realCompute() {
418 >                assertSame(mainPool, getPool());
419              }};
420 <        mainPool.invoke(a);
420 >        testInvokeOnPool(mainPool, a);
421      }
422  
423      /**
424       * getPool of non-FJ task returns null
425       */
426      public void testGetPool2() {
427 <        RecursiveAction a = new RecursiveAction() {
428 <            public void compute() {
429 <                threadAssertTrue(getPool() == null);
427 >        RecursiveAction a = new CheckedRecursiveAction() {
428 >            public void realCompute() {
429 >                assertNull(getPool());
430              }};
431 <        a.invoke();
431 >        assertNull(a.invoke());
432      }
433  
434      /**
435       * inForkJoinPool of executing task returns true
436       */
437      public void testInForkJoinPool() {
438 <        RecursiveAction a = new RecursiveAction() {
439 <            public void compute() {
440 <                threadAssertTrue(inForkJoinPool());
438 >        RecursiveAction a = new CheckedRecursiveAction() {
439 >            public void realCompute() {
440 >                assertTrue(inForkJoinPool());
441              }};
442 <        mainPool.invoke(a);
442 >        testInvokeOnPool(mainPool(), a);
443      }
444  
445      /**
446       * inForkJoinPool of non-FJ task returns false
447       */
448      public void testInForkJoinPool2() {
449 <        RecursiveAction a = new RecursiveAction() {
450 <            public void compute() {
451 <                threadAssertTrue(!inForkJoinPool());
449 >        RecursiveAction a = new CheckedRecursiveAction() {
450 >            public void realCompute() {
451 >                assertFalse(inForkJoinPool());
452              }};
453 <        a.invoke();
453 >        assertNull(a.invoke());
454      }
455  
456      /**
457       * getPool of current thread in pool returns its pool
458       */
459      public void testWorkerGetPool() {
460 <        RecursiveAction a = new RecursiveAction() {
461 <            public void compute() {
460 >        final ForkJoinPool mainPool = mainPool();
461 >        RecursiveAction a = new CheckedRecursiveAction() {
462 >            public void realCompute() {
463                  ForkJoinWorkerThread w =
464 <                    (ForkJoinWorkerThread)(Thread.currentThread());
465 <                threadAssertTrue(w.getPool() == mainPool);
464 >                    (ForkJoinWorkerThread) Thread.currentThread();
465 >                assertSame(mainPool, w.getPool());
466              }};
467 <        mainPool.invoke(a);
467 >        testInvokeOnPool(mainPool, a);
468      }
469  
470      /**
471       * getPoolIndex of current thread in pool returns 0 <= value < poolSize
472       */
473      public void testWorkerGetPoolIndex() {
474 <        RecursiveAction a = new RecursiveAction() {
475 <            public void compute() {
474 >        final ForkJoinPool mainPool = mainPool();
475 >        RecursiveAction a = new CheckedRecursiveAction() {
476 >            public void realCompute() {
477                  ForkJoinWorkerThread w =
478                      (ForkJoinWorkerThread)(Thread.currentThread());
479                  int idx = w.getPoolIndex();
480 <                threadAssertTrue(idx >= 0);
481 <                threadAssertTrue(idx < mainPool.getPoolSize());
480 >                assertTrue(idx >= 0);
481 >                assertTrue(idx < mainPool.getPoolSize());
482              }};
483 <        mainPool.invoke(a);
483 >        testInvokeOnPool(mainPool, a);
484      }
485  
486  
# Line 478 | Line 488 | public class RecursiveActionTest extends
488       * setRawResult(null) succeeds
489       */
490      public void testSetRawResult() {
491 <        RecursiveAction a = new RecursiveAction() {
492 <            public void compute() {
491 >        RecursiveAction a = new CheckedRecursiveAction() {
492 >            public void realCompute() {
493                  setRawResult(null);
494              }};
495 <        a.invoke();
495 >        assertNull(a.invoke());
496      }
497  
498      /**
499       * A reinitialized task may be re-invoked
500       */
501      public void testReinitialize() {
502 <        RecursiveAction a = new RecursiveAction() {
503 <            public void compute() {
502 >        RecursiveAction a = new CheckedRecursiveAction() {
503 >            public void realCompute() {
504                  FibAction f = new FibAction(8);
505 <                f.invoke();
506 <                threadAssertTrue(f.result == 21);
507 <                threadAssertTrue(f.isDone());
508 <                threadAssertFalse(f.isCancelled());
509 <                threadAssertFalse(f.isCompletedAbnormally());
505 >                assertNull(f.invoke());
506 >                assertEquals(21, f.result);
507 >                assertTrue(f.isDone());
508 >                assertFalse(f.isCancelled());
509 >                assertFalse(f.isCompletedAbnormally());
510                  f.reinitialize();
511 <                f.invoke();
512 <                threadAssertTrue(f.result == 21);
511 >                assertNull(f.invoke());
512 >                assertEquals(21, f.result);
513              }};
514 <        mainPool.invoke(a);
514 >        testInvokeOnPool(mainPool(), a);
515      }
516  
517      /**
518       * invoke task throws exception after invoking completeExceptionally
519       */
520      public void testCompleteExceptionally() {
521 <        RecursiveAction a = new RecursiveAction() {
522 <            public void compute() {
521 >        RecursiveAction a = new CheckedRecursiveAction() {
522 >            public void realCompute() {
523 >                FibAction f = new FibAction(8);
524 >                f.completeExceptionally(new FJException());
525                  try {
514                    FibAction f = new FibAction(8);
515                    f.completeExceptionally(new FJException());
526                      f.invoke();
527                      shouldThrow();
528 <                } catch (FJException success) {
519 <                }
528 >                } catch (FJException success) {}
529              }};
530 <        mainPool.invoke(a);
530 >        testInvokeOnPool(mainPool(), a);
531      }
532  
533      /**
534       * invoke task suppresses execution invoking complete
535       */
536      public void testComplete() {
537 <        RecursiveAction a = new RecursiveAction() {
538 <            public void compute() {
537 >        RecursiveAction a = new CheckedRecursiveAction() {
538 >            public void realCompute() {
539                  FibAction f = new FibAction(8);
540                  f.complete(null);
541 <                f.invoke();
542 <                threadAssertTrue(f.isDone());
543 <                threadAssertTrue(f.result == 0);
541 >                assertNull(f.invoke());
542 >                assertTrue(f.isDone());
543 >                assertEquals(0, f.result);
544              }};
545 <        mainPool.invoke(a);
545 >        testInvokeOnPool(mainPool(), a);
546      }
547  
548      /**
549       * invokeAll(t1, t2) invokes all task arguments
550       */
551      public void testInvokeAll2() {
552 <        RecursiveAction a = new RecursiveAction() {
553 <            public void compute() {
552 >        RecursiveAction a = new CheckedRecursiveAction() {
553 >            public void realCompute() {
554                  FibAction f = new FibAction(8);
555                  FibAction g = new FibAction(9);
556                  invokeAll(f, g);
557 <                threadAssertTrue(f.isDone());
558 <                threadAssertTrue(f.result == 21);
559 <                threadAssertTrue(g.isDone());
560 <                threadAssertTrue(g.result == 34);
557 >                assertTrue(f.isDone());
558 >                assertEquals(21, f.result);
559 >                assertTrue(g.isDone());
560 >                assertEquals(34, g.result);
561              }};
562 <        mainPool.invoke(a);
562 >        testInvokeOnPool(mainPool(), a);
563      }
564  
565      /**
566       * invokeAll(tasks) with 1 argument invokes task
567       */
568      public void testInvokeAll1() {
569 <        RecursiveAction a = new RecursiveAction() {
570 <            public void compute() {
569 >        RecursiveAction a = new CheckedRecursiveAction() {
570 >            public void realCompute() {
571                  FibAction f = new FibAction(8);
572                  invokeAll(f);
573 <                threadAssertTrue(f.isDone());
574 <                threadAssertTrue(f.result == 21);
573 >                assertTrue(f.isDone());
574 >                assertEquals(21, f.result);
575              }};
576 <        mainPool.invoke(a);
576 >        testInvokeOnPool(mainPool(), a);
577      }
578  
579      /**
580       * invokeAll(tasks) with > 2 argument invokes tasks
581       */
582      public void testInvokeAll3() {
583 <        RecursiveAction a = new RecursiveAction() {
584 <            public void compute() {
583 >        RecursiveAction a = new CheckedRecursiveAction() {
584 >            public void realCompute() {
585                  FibAction f = new FibAction(8);
586                  FibAction g = new FibAction(9);
587                  FibAction h = new FibAction(7);
588                  invokeAll(f, g, h);
589 <                threadAssertTrue(f.isDone());
590 <                threadAssertTrue(f.result == 21);
591 <                threadAssertTrue(g.isDone());
592 <                threadAssertTrue(g.result == 34);
593 <                threadAssertTrue(h.isDone());
594 <                threadAssertTrue(h.result == 13);
589 >                assertTrue(f.isDone());
590 >                assertEquals(21, f.result);
591 >                assertTrue(g.isDone());
592 >                assertEquals(34, g.result);
593 >                assertTrue(h.isDone());
594 >                assertEquals(13, h.result);
595              }};
596 <        mainPool.invoke(a);
596 >        testInvokeOnPool(mainPool(), a);
597      }
598  
599      /**
600       * invokeAll(collection) invokes all tasks in the collection
601       */
602      public void testInvokeAllCollection() {
603 <        RecursiveAction a = new RecursiveAction() {
604 <            public void compute() {
603 >        RecursiveAction a = new CheckedRecursiveAction() {
604 >            public void realCompute() {
605                  FibAction f = new FibAction(8);
606                  FibAction g = new FibAction(9);
607                  FibAction h = new FibAction(7);
# Line 601 | Line 610 | public class RecursiveActionTest extends
610                  set.add(g);
611                  set.add(h);
612                  invokeAll(set);
613 <                threadAssertTrue(f.isDone());
614 <                threadAssertTrue(f.result == 21);
615 <                threadAssertTrue(g.isDone());
616 <                threadAssertTrue(g.result == 34);
617 <                threadAssertTrue(h.isDone());
618 <                threadAssertTrue(h.result == 13);
613 >                assertTrue(f.isDone());
614 >                assertEquals(21, f.result);
615 >                assertTrue(g.isDone());
616 >                assertEquals(34, g.result);
617 >                assertTrue(h.isDone());
618 >                assertEquals(13, h.result);
619              }};
620 <        mainPool.invoke(a);
620 >        testInvokeOnPool(mainPool(), a);
621      }
622  
623  
# Line 616 | Line 625 | public class RecursiveActionTest extends
625       * invokeAll(tasks) with any null task throws NPE
626       */
627      public void testInvokeAllNPE() {
628 <        RecursiveAction a = new RecursiveAction() {
629 <            public void compute() {
628 >        RecursiveAction a = new CheckedRecursiveAction() {
629 >            public void realCompute() {
630 >                FibAction f = new FibAction(8);
631 >                FibAction g = new FibAction(9);
632 >                FibAction h = null;
633                  try {
622                    FibAction f = new FibAction(8);
623                    FibAction g = new FibAction(9);
624                    FibAction h = null;
634                      invokeAll(f, g, h);
635                      shouldThrow();
636 <                } catch (NullPointerException success) {
628 <                }
636 >                } catch (NullPointerException success) {}
637              }};
638 <        mainPool.invoke(a);
638 >        testInvokeOnPool(mainPool(), a);
639      }
640  
641      /**
642       * invokeAll(t1, t2) throw exception if any task does
643       */
644      public void testAbnormalInvokeAll2() {
645 <        RecursiveAction a = new RecursiveAction() {
646 <            public void compute() {
645 >        RecursiveAction a = new CheckedRecursiveAction() {
646 >            public void realCompute() {
647 >                FibAction f = new FibAction(8);
648 >                FailingFibAction g = new FailingFibAction(9);
649                  try {
640                    FibAction f = new FibAction(8);
641                    FailingFibAction g = new FailingFibAction(9);
650                      invokeAll(f, g);
651                      shouldThrow();
652 <                } catch (FJException success) {
645 <                }
652 >                } catch (FJException success) {}
653              }};
654 <        mainPool.invoke(a);
654 >        testInvokeOnPool(mainPool(), a);
655      }
656  
657      /**
658       * invokeAll(tasks) with 1 argument throws exception if task does
659       */
660      public void testAbnormalInvokeAll1() {
661 <        RecursiveAction a = new RecursiveAction() {
662 <            public void compute() {
661 >        RecursiveAction a = new CheckedRecursiveAction() {
662 >            public void realCompute() {
663 >                FailingFibAction g = new FailingFibAction(9);
664                  try {
657                    FailingFibAction g = new FailingFibAction(9);
665                      invokeAll(g);
666                      shouldThrow();
667 <                } catch (FJException success) {
661 <                }
667 >                } catch (FJException success) {}
668              }};
669 <        mainPool.invoke(a);
669 >        testInvokeOnPool(mainPool(), a);
670      }
671  
672      /**
673       * invokeAll(tasks) with > 2 argument throws exception if any task does
674       */
675      public void testAbnormalInvokeAll3() {
676 <        RecursiveAction a = new RecursiveAction() {
677 <            public void compute() {
676 >        RecursiveAction a = new CheckedRecursiveAction() {
677 >            public void realCompute() {
678 >                FibAction f = new FibAction(8);
679 >                FailingFibAction g = new FailingFibAction(9);
680 >                FibAction h = new FibAction(7);
681                  try {
673                    FibAction f = new FibAction(8);
674                    FailingFibAction g = new FailingFibAction(9);
675                    FibAction h = new FibAction(7);
682                      invokeAll(f, g, h);
683                      shouldThrow();
684 <                } catch (FJException success) {
679 <                }
684 >                } catch (FJException success) {}
685              }};
686 <        mainPool.invoke(a);
686 >        testInvokeOnPool(mainPool(), a);
687      }
688  
689      /**
690       * invokeAll(collection) throws exception if any task does
691       */
692      public void testAbnormalInvokeAllCollection() {
693 <        RecursiveAction a = new RecursiveAction() {
694 <            public void compute() {
693 >        RecursiveAction a = new CheckedRecursiveAction() {
694 >            public void realCompute() {
695 >                FailingFibAction f = new FailingFibAction(8);
696 >                FibAction g = new FibAction(9);
697 >                FibAction h = new FibAction(7);
698 >                HashSet set = new HashSet();
699 >                set.add(f);
700 >                set.add(g);
701 >                set.add(h);
702                  try {
691                    FailingFibAction f = new FailingFibAction(8);
692                    FibAction g = new FibAction(9);
693                    FibAction h = new FibAction(7);
694                    HashSet set = new HashSet();
695                    set.add(f);
696                    set.add(g);
697                    set.add(h);
703                      invokeAll(set);
704                      shouldThrow();
705 <                } catch (FJException success) {
701 <                }
705 >                } catch (FJException success) {}
706              }};
707 <        mainPool.invoke(a);
707 >        testInvokeOnPool(mainPool(), a);
708      }
709  
710      /**
# Line 708 | Line 712 | public class RecursiveActionTest extends
712       * and suppresses execution
713       */
714      public void testTryUnfork() {
715 <        RecursiveAction a = new RecursiveAction() {
716 <            public void compute() {
715 >        RecursiveAction a = new CheckedRecursiveAction() {
716 >            public void realCompute() {
717                  FibAction g = new FibAction(9);
718 <                g.fork();
718 >                assertSame(g, g.fork());
719                  FibAction f = new FibAction(8);
720 <                f.fork();
721 <                threadAssertTrue(f.tryUnfork());
720 >                assertSame(f, f.fork());
721 >                assertTrue(f.tryUnfork());
722                  helpQuiesce();
723 <                threadAssertFalse(f.isDone());
724 <                threadAssertTrue(g.isDone());
723 >                assertFalse(f.isDone());
724 >                assertTrue(g.isDone());
725              }};
726 <        singletonPool.invoke(a);
726 >        testInvokeOnPool(singletonPool(), a);
727      }
728  
729      /**
# Line 727 | Line 731 | public class RecursiveActionTest extends
731       * there are more tasks than threads
732       */
733      public void testGetSurplusQueuedTaskCount() {
734 <        RecursiveAction a = new RecursiveAction() {
735 <            public void compute() {
734 >        RecursiveAction a = new CheckedRecursiveAction() {
735 >            public void realCompute() {
736                  FibAction h = new FibAction(7);
737 <                h.fork();
737 >                assertSame(h, h.fork());
738                  FibAction g = new FibAction(9);
739 <                g.fork();
739 >                assertSame(g, g.fork());
740                  FibAction f = new FibAction(8);
741 <                f.fork();
742 <                threadAssertTrue(getSurplusQueuedTaskCount() > 0);
741 >                assertSame(f, f.fork());
742 >                assertTrue(getSurplusQueuedTaskCount() > 0);
743                  helpQuiesce();
744              }};
745 <        singletonPool.invoke(a);
745 >        testInvokeOnPool(singletonPool(), a);
746      }
747  
748      /**
749       * peekNextLocalTask returns most recent unexecuted task.
750       */
751      public void testPeekNextLocalTask() {
752 <        RecursiveAction a = new RecursiveAction() {
753 <            public void compute() {
752 >        RecursiveAction a = new CheckedRecursiveAction() {
753 >            public void realCompute() {
754                  FibAction g = new FibAction(9);
755 <                g.fork();
755 >                assertSame(g, g.fork());
756                  FibAction f = new FibAction(8);
757 <                f.fork();
758 <                threadAssertTrue(peekNextLocalTask() == f);
759 <                f.join();
760 <                threadAssertTrue(f.isDone());
757 >                assertSame(f, f.fork());
758 >                assertSame(f, peekNextLocalTask());
759 >                assertNull(f.join());
760 >                assertTrue(f.isDone());
761                  helpQuiesce();
762              }};
763 <        singletonPool.invoke(a);
763 >        testInvokeOnPool(singletonPool(), a);
764      }
765  
766      /**
# Line 764 | Line 768 | public class RecursiveActionTest extends
768       * without executing it
769       */
770      public void testPollNextLocalTask() {
771 <        RecursiveAction a = new RecursiveAction() {
772 <            public void compute() {
771 >        RecursiveAction a = new CheckedRecursiveAction() {
772 >            public void realCompute() {
773                  FibAction g = new FibAction(9);
774 <                g.fork();
774 >                assertSame(g, g.fork());
775                  FibAction f = new FibAction(8);
776 <                f.fork();
777 <                threadAssertTrue(pollNextLocalTask() == f);
776 >                assertSame(f, f.fork());
777 >                assertSame(f, pollNextLocalTask());
778                  helpQuiesce();
779 <                threadAssertFalse(f.isDone());
779 >                assertFalse(f.isDone());
780              }};
781 <        singletonPool.invoke(a);
781 >        testInvokeOnPool(singletonPool(), a);
782      }
783  
784      /**
# Line 782 | Line 786 | public class RecursiveActionTest extends
786       * without executing it
787       */
788      public void testPollTask() {
789 <        RecursiveAction a = new RecursiveAction() {
790 <            public void compute() {
789 >        RecursiveAction a = new CheckedRecursiveAction() {
790 >            public void realCompute() {
791                  FibAction g = new FibAction(9);
792 <                g.fork();
792 >                assertSame(g, g.fork());
793                  FibAction f = new FibAction(8);
794 <                f.fork();
795 <                threadAssertTrue(pollTask() == f);
794 >                assertSame(f, f.fork());
795 >                assertSame(f, pollTask());
796                  helpQuiesce();
797 <                threadAssertFalse(f.isDone());
798 <                threadAssertTrue(g.isDone());
797 >                assertFalse(f.isDone());
798 >                assertTrue(g.isDone());
799              }};
800 <        singletonPool.invoke(a);
800 >        testInvokeOnPool(singletonPool(), a);
801      }
802  
803      /**
804       * peekNextLocalTask returns least recent unexecuted task in async mode
805       */
806      public void testPeekNextLocalTaskAsync() {
807 <        RecursiveAction a = new RecursiveAction() {
808 <            public void compute() {
807 >        RecursiveAction a = new CheckedRecursiveAction() {
808 >            public void realCompute() {
809                  FibAction g = new FibAction(9);
810 <                g.fork();
810 >                assertSame(g, g.fork());
811                  FibAction f = new FibAction(8);
812 <                f.fork();
813 <                threadAssertTrue(peekNextLocalTask() == g);
814 <                f.join();
812 >                assertSame(f, f.fork());
813 >                assertSame(g, peekNextLocalTask());
814 >                assertNull(f.join());
815                  helpQuiesce();
816 <                threadAssertTrue(f.isDone());
816 >                assertTrue(f.isDone());
817              }};
818 <        asyncSingletonPool.invoke(a);
818 >        testInvokeOnPool(asyncSingletonPool(), a);
819      }
820  
821      /**
# Line 819 | Line 823 | public class RecursiveActionTest extends
823       * without executing it, in async mode
824       */
825      public void testPollNextLocalTaskAsync() {
826 <        RecursiveAction a = new RecursiveAction() {
827 <            public void compute() {
826 >        RecursiveAction a = new CheckedRecursiveAction() {
827 >            public void realCompute() {
828                  FibAction g = new FibAction(9);
829 <                g.fork();
829 >                assertSame(g, g.fork());
830                  FibAction f = new FibAction(8);
831 <                f.fork();
832 <                threadAssertTrue(pollNextLocalTask() == g);
831 >                assertSame(f, f.fork());
832 >                assertSame(g, pollNextLocalTask());
833                  helpQuiesce();
834 <                threadAssertTrue(f.isDone());
835 <                threadAssertFalse(g.isDone());
834 >                assertTrue(f.isDone());
835 >                assertFalse(g.isDone());
836              }};
837 <        asyncSingletonPool.invoke(a);
837 >        testInvokeOnPool(asyncSingletonPool(), a);
838      }
839  
840      /**
# Line 838 | Line 842 | public class RecursiveActionTest extends
842       * without executing it, in async mode
843       */
844      public void testPollTaskAsync() {
845 <        RecursiveAction a = new RecursiveAction() {
846 <            public void compute() {
845 >        RecursiveAction a = new CheckedRecursiveAction() {
846 >            public void realCompute() {
847                  FibAction g = new FibAction(9);
848 <                g.fork();
848 >                assertSame(g, g.fork());
849                  FibAction f = new FibAction(8);
850 <                f.fork();
851 <                threadAssertTrue(pollTask() == g);
850 >                assertSame(f, f.fork());
851 >                assertSame(g, pollTask());
852                  helpQuiesce();
853 <                threadAssertTrue(f.isDone());
854 <                threadAssertFalse(g.isDone());
853 >                assertTrue(f.isDone());
854 >                assertFalse(g.isDone());
855              }};
856 <        asyncSingletonPool.invoke(a);
856 >        testInvokeOnPool(asyncSingletonPool(), a);
857      }
858  
859   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines