ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinTaskTest.java
Revision: 1.49
Committed: Sun Oct 18 16:40:57 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.48: +21 -0 lines
Log Message:
add testCompleteExceptionally_null

File Contents

# User Rev Content
1 dl 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 jsr166 1.31 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.1 */
6 jsr166 1.40
7     import static java.util.concurrent.TimeUnit.MILLISECONDS;
8     import static java.util.concurrent.TimeUnit.SECONDS;
9    
10 jsr166 1.45 import java.util.Arrays;
11     import java.util.Collections;
12 jsr166 1.39 import java.util.HashSet;
13 jsr166 1.45 import java.util.List;
14 jsr166 1.39 import java.util.concurrent.CancellationException;
15 dl 1.8 import java.util.concurrent.ExecutionException;
16     import java.util.concurrent.ForkJoinPool;
17     import java.util.concurrent.ForkJoinTask;
18     import java.util.concurrent.RecursiveAction;
19 jsr166 1.24 import java.util.concurrent.TimeoutException;
20 jsr166 1.15 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
21 jsr166 1.40
22     import junit.framework.Test;
23     import junit.framework.TestSuite;
24 dl 1.1
25     public class ForkJoinTaskTest extends JSR166TestCase {
26    
27     public static void main(String[] args) {
28 jsr166 1.41 main(suite(), args);
29 dl 1.1 }
30 jsr166 1.12
31 dl 1.1 public static Test suite() {
32 jsr166 1.5 return new TestSuite(ForkJoinTaskTest.class);
33 dl 1.1 }
34    
35 dl 1.20 // Runs with "mainPool" use > 1 thread. singletonPool tests use 1
36 jsr166 1.21 static final int mainPoolSize =
37 dl 1.20 Math.max(2, Runtime.getRuntime().availableProcessors());
38    
39 jsr166 1.14 private static ForkJoinPool mainPool() {
40 dl 1.20 return new ForkJoinPool(mainPoolSize);
41 jsr166 1.14 }
42    
43     private static ForkJoinPool singletonPool() {
44     return new ForkJoinPool(1);
45     }
46    
47     private static ForkJoinPool asyncSingletonPool() {
48     return new ForkJoinPool(1,
49     ForkJoinPool.defaultForkJoinWorkerThreadFactory,
50     null, true);
51     }
52    
53     private void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) {
54 jsr166 1.42 try (PoolCleaner cleaner = cleaner(pool)) {
55 jsr166 1.17 assertFalse(a.isDone());
56     assertFalse(a.isCompletedNormally());
57     assertFalse(a.isCompletedAbnormally());
58     assertFalse(a.isCancelled());
59     assertNull(a.getException());
60 jsr166 1.24 assertNull(a.getRawResult());
61 jsr166 1.17
62     assertNull(pool.invoke(a));
63    
64     assertTrue(a.isDone());
65     assertTrue(a.isCompletedNormally());
66     assertFalse(a.isCompletedAbnormally());
67     assertFalse(a.isCancelled());
68     assertNull(a.getException());
69 jsr166 1.24 assertNull(a.getRawResult());
70 jsr166 1.14 }
71     }
72    
73 jsr166 1.24 void checkNotDone(ForkJoinTask a) {
74     assertFalse(a.isDone());
75     assertFalse(a.isCompletedNormally());
76     assertFalse(a.isCompletedAbnormally());
77     assertFalse(a.isCancelled());
78     assertNull(a.getException());
79     assertNull(a.getRawResult());
80    
81     try {
82     a.get(0L, SECONDS);
83     shouldThrow();
84     } catch (TimeoutException success) {
85     } catch (Throwable fail) { threadUnexpectedException(fail); }
86     }
87    
88     <T> void checkCompletedNormally(ForkJoinTask<T> a) {
89     checkCompletedNormally(a, null);
90     }
91    
92     <T> void checkCompletedNormally(ForkJoinTask<T> a, T expected) {
93     assertTrue(a.isDone());
94     assertFalse(a.isCancelled());
95     assertTrue(a.isCompletedNormally());
96     assertFalse(a.isCompletedAbnormally());
97     assertNull(a.getException());
98     assertSame(expected, a.getRawResult());
99 jsr166 1.28
100     {
101     Thread.currentThread().interrupt();
102 jsr166 1.44 long startTime = System.nanoTime();
103 jsr166 1.28 assertSame(expected, a.join());
104 jsr166 1.44 assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
105 jsr166 1.29 Thread.interrupted();
106 jsr166 1.28 }
107    
108     {
109     Thread.currentThread().interrupt();
110 jsr166 1.44 long startTime = System.nanoTime();
111 jsr166 1.28 a.quietlyJoin(); // should be no-op
112 jsr166 1.44 assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
113 jsr166 1.29 Thread.interrupted();
114 jsr166 1.28 }
115    
116 jsr166 1.25 assertFalse(a.cancel(false));
117     assertFalse(a.cancel(true));
118 jsr166 1.24 try {
119     assertSame(expected, a.get());
120     } catch (Throwable fail) { threadUnexpectedException(fail); }
121     try {
122     assertSame(expected, a.get(5L, SECONDS));
123     } catch (Throwable fail) { threadUnexpectedException(fail); }
124     }
125    
126     void checkCancelled(ForkJoinTask a) {
127     assertTrue(a.isDone());
128     assertTrue(a.isCancelled());
129     assertFalse(a.isCompletedNormally());
130     assertTrue(a.isCompletedAbnormally());
131     assertTrue(a.getException() instanceof CancellationException);
132     assertNull(a.getRawResult());
133 jsr166 1.25 assertTrue(a.cancel(false));
134     assertTrue(a.cancel(true));
135 jsr166 1.24
136     try {
137 jsr166 1.28 Thread.currentThread().interrupt();
138 jsr166 1.24 a.join();
139     shouldThrow();
140     } catch (CancellationException success) {
141     } catch (Throwable fail) { threadUnexpectedException(fail); }
142 jsr166 1.29 Thread.interrupted();
143 jsr166 1.24
144 jsr166 1.28 {
145 jsr166 1.44 long startTime = System.nanoTime();
146 jsr166 1.28 a.quietlyJoin(); // should be no-op
147 jsr166 1.44 assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
148 jsr166 1.28 }
149    
150 jsr166 1.24 try {
151     a.get();
152     shouldThrow();
153     } catch (CancellationException success) {
154     } catch (Throwable fail) { threadUnexpectedException(fail); }
155    
156     try {
157     a.get(5L, SECONDS);
158     shouldThrow();
159     } catch (CancellationException success) {
160     } catch (Throwable fail) { threadUnexpectedException(fail); }
161     }
162    
163     void checkCompletedAbnormally(ForkJoinTask a, Throwable t) {
164     assertTrue(a.isDone());
165     assertFalse(a.isCancelled());
166     assertFalse(a.isCompletedNormally());
167     assertTrue(a.isCompletedAbnormally());
168 dl 1.30 assertSame(t.getClass(), a.getException().getClass());
169 jsr166 1.24 assertNull(a.getRawResult());
170 jsr166 1.25 assertFalse(a.cancel(false));
171     assertFalse(a.cancel(true));
172 jsr166 1.24
173     try {
174 jsr166 1.28 Thread.currentThread().interrupt();
175 jsr166 1.24 a.join();
176     shouldThrow();
177     } catch (Throwable expected) {
178 dl 1.30 assertSame(t.getClass(), expected.getClass());
179 jsr166 1.24 }
180 jsr166 1.29 Thread.interrupted();
181 jsr166 1.24
182 jsr166 1.28 {
183 jsr166 1.44 long startTime = System.nanoTime();
184 jsr166 1.28 a.quietlyJoin(); // should be no-op
185 jsr166 1.44 assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS);
186 jsr166 1.28 }
187    
188 jsr166 1.24 try {
189     a.get();
190     shouldThrow();
191     } catch (ExecutionException success) {
192 dl 1.30 assertSame(t.getClass(), success.getCause().getClass());
193 jsr166 1.24 } catch (Throwable fail) { threadUnexpectedException(fail); }
194    
195     try {
196     a.get(5L, SECONDS);
197     shouldThrow();
198     } catch (ExecutionException success) {
199 dl 1.30 assertSame(t.getClass(), success.getCause().getClass());
200 jsr166 1.24 } catch (Throwable fail) { threadUnexpectedException(fail); }
201     }
202    
203 jsr166 1.14 /*
204 dl 1.1 * Testing coverage notes:
205 jsr166 1.2 *
206 dl 1.1 * To test extension methods and overrides, most tests use
207     * BinaryAsyncAction extension class that processes joins
208     * differently than supplied Recursive forms.
209 jsr166 1.2 */
210 dl 1.1
211 dl 1.30 public static final class FJException extends RuntimeException {
212 dl 1.1 FJException() { super(); }
213     }
214    
215 jsr166 1.19 abstract static class BinaryAsyncAction extends ForkJoinTask<Void> {
216 dl 1.1 private volatile int controlState;
217    
218     static final AtomicIntegerFieldUpdater<BinaryAsyncAction> controlStateUpdater =
219 jsr166 1.2 AtomicIntegerFieldUpdater.newUpdater(BinaryAsyncAction.class,
220 dl 1.1 "controlState");
221    
222 dl 1.43 private volatile BinaryAsyncAction parent;
223 dl 1.1
224 dl 1.43 private volatile BinaryAsyncAction sibling;
225 dl 1.1
226     protected BinaryAsyncAction() {
227     }
228    
229     public final Void getRawResult() { return null; }
230     protected final void setRawResult(Void mustBeNull) { }
231    
232     public final void linkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) {
233     x.parent = y.parent = this;
234     x.sibling = y;
235     y.sibling = x;
236     }
237    
238     protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
239     }
240    
241     protected boolean onException() {
242     return true;
243     }
244    
245     public void linkAndForkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) {
246     linkSubtasks(x, y);
247     y.fork();
248     x.fork();
249     }
250    
251     private void completeThis() {
252     super.complete(null);
253     }
254    
255     private void completeThisExceptionally(Throwable ex) {
256     super.completeExceptionally(ex);
257     }
258    
259 dl 1.46 public boolean cancel(boolean mayInterruptIfRunning) {
260     if (super.cancel(mayInterruptIfRunning)) {
261     completeExceptionally(new FJException());
262     return true;
263     }
264     return false;
265     }
266 jsr166 1.47
267 dl 1.1 public final void complete() {
268     BinaryAsyncAction a = this;
269     for (;;) {
270     BinaryAsyncAction s = a.sibling;
271     BinaryAsyncAction p = a.parent;
272     a.sibling = null;
273     a.parent = null;
274     a.completeThis();
275     if (p == null || p.compareAndSetControlState(0, 1))
276     break;
277     try {
278     p.onComplete(a, s);
279 jsr166 1.2 } catch (Throwable rex) {
280 dl 1.1 p.completeExceptionally(rex);
281     return;
282     }
283     a = p;
284     }
285     }
286    
287     public final void completeExceptionally(Throwable ex) {
288 dl 1.46 for (BinaryAsyncAction a = this;;) {
289 dl 1.1 a.completeThisExceptionally(ex);
290     BinaryAsyncAction s = a.sibling;
291 dl 1.46 if (s != null && !s.isDone())
292     s.completeExceptionally(ex);
293     if ((a = a.parent) == null)
294 dl 1.1 break;
295     }
296     }
297    
298     public final BinaryAsyncAction getParent() {
299     return parent;
300     }
301    
302     public BinaryAsyncAction getSibling() {
303     return sibling;
304     }
305    
306     public void reinitialize() {
307     parent = sibling = null;
308     super.reinitialize();
309     }
310    
311     protected final int getControlState() {
312     return controlState;
313     }
314    
315 jsr166 1.2 protected final boolean compareAndSetControlState(int expect,
316 dl 1.1 int update) {
317     return controlStateUpdater.compareAndSet(this, expect, update);
318     }
319    
320     protected final void setControlState(int value) {
321     controlState = value;
322     }
323    
324     protected final void incrementControlState() {
325     controlStateUpdater.incrementAndGet(this);
326     }
327    
328     protected final void decrementControlState() {
329     controlStateUpdater.decrementAndGet(this);
330     }
331    
332     }
333    
334 jsr166 1.6 static final class AsyncFib extends BinaryAsyncAction {
335 dl 1.1 int number;
336 jsr166 1.2 public AsyncFib(int n) {
337 dl 1.1 this.number = n;
338     }
339 jsr166 1.2
340 dl 1.1 public final boolean exec() {
341     AsyncFib f = this;
342     int n = f.number;
343 dl 1.48 while (n > 1) {
344     AsyncFib p = f;
345     AsyncFib r = new AsyncFib(n - 2);
346     f = new AsyncFib(--n);
347     p.linkSubtasks(r, f);
348     r.fork();
349 dl 1.1 }
350     f.complete();
351     return false;
352     }
353    
354     protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
355     number = ((AsyncFib)x).number + ((AsyncFib)y).number;
356     }
357     }
358    
359 jsr166 1.6 static final class FailingAsyncFib extends BinaryAsyncAction {
360 dl 1.1 int number;
361 jsr166 1.2 public FailingAsyncFib(int n) {
362 dl 1.1 this.number = n;
363     }
364 jsr166 1.2
365 dl 1.1 public final boolean exec() {
366     FailingAsyncFib f = this;
367     int n = f.number;
368 dl 1.48 while (n > 1) {
369     FailingAsyncFib p = f;
370     FailingAsyncFib r = new FailingAsyncFib(n - 2);
371     f = new FailingAsyncFib(--n);
372     p.linkSubtasks(r, f);
373     r.fork();
374 dl 1.1 }
375     f.complete();
376     return false;
377     }
378    
379     protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) {
380     completeExceptionally(new FJException());
381     }
382     }
383    
384 jsr166 1.2 /**
385 dl 1.1 * invoke returns when task completes normally.
386     * isCompletedAbnormally and isCancelled return false for normally
387 jsr166 1.26 * completed tasks; getRawResult returns null.
388 dl 1.1 */
389     public void testInvoke() {
390 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
391 jsr166 1.34 protected void realCompute() {
392 jsr166 1.12 AsyncFib f = new AsyncFib(8);
393 jsr166 1.17 assertNull(f.invoke());
394     assertEquals(21, f.number);
395 jsr166 1.24 checkCompletedNormally(f);
396 jsr166 1.12 }};
397 jsr166 1.14 testInvokeOnPool(mainPool(), a);
398 dl 1.1 }
399    
400 jsr166 1.2 /**
401 dl 1.1 * quietlyInvoke task returns when task completes normally.
402     * isCompletedAbnormally and isCancelled return false for normally
403     * completed tasks
404     */
405     public void testQuietlyInvoke() {
406 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
407 jsr166 1.34 protected void realCompute() {
408 jsr166 1.12 AsyncFib f = new AsyncFib(8);
409     f.quietlyInvoke();
410 jsr166 1.17 assertEquals(21, f.number);
411 jsr166 1.24 checkCompletedNormally(f);
412 jsr166 1.12 }};
413 jsr166 1.14 testInvokeOnPool(mainPool(), a);
414 dl 1.1 }
415    
416 jsr166 1.2 /**
417 dl 1.1 * join of a forked task returns when task completes
418     */
419     public void testForkJoin() {
420 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
421 jsr166 1.34 protected void realCompute() {
422 jsr166 1.12 AsyncFib f = new AsyncFib(8);
423 jsr166 1.17 assertSame(f, f.fork());
424     assertNull(f.join());
425     assertEquals(21, f.number);
426 jsr166 1.24 checkCompletedNormally(f);
427 jsr166 1.12 }};
428 jsr166 1.14 testInvokeOnPool(mainPool(), a);
429 dl 1.1 }
430    
431 jsr166 1.2 /**
432 dl 1.1 * get of a forked task returns when task completes
433     */
434     public void testForkGet() {
435 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
436 jsr166 1.34 protected void realCompute() throws Exception {
437 jsr166 1.17 AsyncFib f = new AsyncFib(8);
438     assertSame(f, f.fork());
439     assertNull(f.get());
440     assertEquals(21, f.number);
441 jsr166 1.24 checkCompletedNormally(f);
442 jsr166 1.12 }};
443 jsr166 1.14 testInvokeOnPool(mainPool(), a);
444 dl 1.1 }
445    
446 jsr166 1.2 /**
447 dl 1.1 * timed get of a forked task returns when task completes
448     */
449     public void testForkTimedGet() {
450 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
451 jsr166 1.34 protected void realCompute() throws Exception {
452 jsr166 1.17 AsyncFib f = new AsyncFib(8);
453     assertSame(f, f.fork());
454 jsr166 1.18 assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
455 jsr166 1.17 assertEquals(21, f.number);
456 jsr166 1.24 checkCompletedNormally(f);
457 jsr166 1.12 }};
458 jsr166 1.14 testInvokeOnPool(mainPool(), a);
459 dl 1.1 }
460    
461 jsr166 1.2 /**
462 dl 1.1 * timed get with null time unit throws NPE
463     */
464     public void testForkTimedGetNPE() {
465 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
466 jsr166 1.34 protected void realCompute() throws Exception {
467 jsr166 1.17 AsyncFib f = new AsyncFib(8);
468     assertSame(f, f.fork());
469 jsr166 1.12 try {
470     f.get(5L, null);
471     shouldThrow();
472 jsr166 1.17 } catch (NullPointerException success) {}
473 jsr166 1.12 }};
474 jsr166 1.14 testInvokeOnPool(mainPool(), a);
475 dl 1.1 }
476    
477 jsr166 1.2 /**
478 dl 1.1 * quietlyJoin of a forked task returns when task completes
479     */
480     public void testForkQuietlyJoin() {
481 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
482 jsr166 1.34 protected void realCompute() {
483 jsr166 1.12 AsyncFib f = new AsyncFib(8);
484 jsr166 1.17 assertSame(f, f.fork());
485 jsr166 1.12 f.quietlyJoin();
486 jsr166 1.17 assertEquals(21, f.number);
487 jsr166 1.24 checkCompletedNormally(f);
488 jsr166 1.12 }};
489 jsr166 1.14 testInvokeOnPool(mainPool(), a);
490 dl 1.1 }
491    
492 jsr166 1.2 /**
493 dl 1.1 * helpQuiesce returns when tasks are complete.
494     * getQueuedTaskCount returns 0 when quiescent
495     */
496     public void testForkHelpQuiesce() {
497 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
498 jsr166 1.34 protected void realCompute() {
499 jsr166 1.12 AsyncFib f = new AsyncFib(8);
500 jsr166 1.17 assertSame(f, f.fork());
501 jsr166 1.32 helpQuiesce();
502 jsr166 1.17 assertEquals(21, f.number);
503     assertEquals(0, getQueuedTaskCount());
504 jsr166 1.24 checkCompletedNormally(f);
505 jsr166 1.12 }};
506 jsr166 1.14 testInvokeOnPool(mainPool(), a);
507 dl 1.1 }
508    
509 jsr166 1.2 /**
510 dl 1.1 * invoke task throws exception when task completes abnormally
511     */
512     public void testAbnormalInvoke() {
513 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
514 jsr166 1.34 protected void realCompute() {
515 jsr166 1.17 FailingAsyncFib f = new FailingAsyncFib(8);
516 jsr166 1.12 try {
517     f.invoke();
518     shouldThrow();
519 jsr166 1.24 } catch (FJException success) {
520     checkCompletedAbnormally(f, success);
521     }
522 jsr166 1.12 }};
523 jsr166 1.14 testInvokeOnPool(mainPool(), a);
524 dl 1.1 }
525    
526 jsr166 1.2 /**
527 jsr166 1.3 * quietlyInvoke task returns when task completes abnormally
528 dl 1.1 */
529     public void testAbnormalQuietlyInvoke() {
530 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
531 jsr166 1.34 protected void realCompute() {
532 jsr166 1.12 FailingAsyncFib f = new FailingAsyncFib(8);
533     f.quietlyInvoke();
534 jsr166 1.24 assertTrue(f.getException() instanceof FJException);
535     checkCompletedAbnormally(f, f.getException());
536 jsr166 1.12 }};
537 jsr166 1.14 testInvokeOnPool(mainPool(), a);
538 dl 1.1 }
539    
540 jsr166 1.2 /**
541 dl 1.1 * join of a forked task throws exception when task completes abnormally
542     */
543     public void testAbnormalForkJoin() {
544 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
545 jsr166 1.34 protected void realCompute() {
546 jsr166 1.17 FailingAsyncFib f = new FailingAsyncFib(8);
547     assertSame(f, f.fork());
548 jsr166 1.12 try {
549     f.join();
550     shouldThrow();
551 jsr166 1.24 } catch (FJException success) {
552     checkCompletedAbnormally(f, success);
553     }
554 jsr166 1.12 }};
555 jsr166 1.14 testInvokeOnPool(mainPool(), a);
556 dl 1.1 }
557    
558 jsr166 1.2 /**
559 dl 1.1 * get of a forked task throws exception when task completes abnormally
560     */
561     public void testAbnormalForkGet() {
562 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
563 jsr166 1.34 protected void realCompute() throws Exception {
564 jsr166 1.17 FailingAsyncFib f = new FailingAsyncFib(8);
565     assertSame(f, f.fork());
566 jsr166 1.12 try {
567     f.get();
568     shouldThrow();
569 jsr166 1.18 } catch (ExecutionException success) {
570     Throwable cause = success.getCause();
571     assertTrue(cause instanceof FJException);
572 jsr166 1.24 checkCompletedAbnormally(f, cause);
573 jsr166 1.18 }
574 jsr166 1.12 }};
575 jsr166 1.14 testInvokeOnPool(mainPool(), a);
576 dl 1.1 }
577    
578 jsr166 1.2 /**
579 dl 1.1 * timed get of a forked task throws exception when task completes abnormally
580     */
581     public void testAbnormalForkTimedGet() {
582 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
583 jsr166 1.34 protected void realCompute() throws Exception {
584 jsr166 1.17 FailingAsyncFib f = new FailingAsyncFib(8);
585     assertSame(f, f.fork());
586 jsr166 1.12 try {
587 jsr166 1.18 f.get(LONG_DELAY_MS, MILLISECONDS);
588 jsr166 1.12 shouldThrow();
589 jsr166 1.18 } catch (ExecutionException success) {
590     Throwable cause = success.getCause();
591     assertTrue(cause instanceof FJException);
592 jsr166 1.24 checkCompletedAbnormally(f, cause);
593 jsr166 1.18 }
594 jsr166 1.12 }};
595 jsr166 1.14 testInvokeOnPool(mainPool(), a);
596 dl 1.1 }
597    
598 jsr166 1.2 /**
599 dl 1.1 * quietlyJoin of a forked task returns when task completes abnormally
600     */
601     public void testAbnormalForkQuietlyJoin() {
602 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
603 jsr166 1.34 protected void realCompute() {
604 jsr166 1.12 FailingAsyncFib f = new FailingAsyncFib(8);
605 jsr166 1.17 assertSame(f, f.fork());
606 jsr166 1.12 f.quietlyJoin();
607 jsr166 1.17 assertTrue(f.getException() instanceof FJException);
608 jsr166 1.24 checkCompletedAbnormally(f, f.getException());
609 jsr166 1.12 }};
610 jsr166 1.14 testInvokeOnPool(mainPool(), a);
611 dl 1.1 }
612    
613 jsr166 1.2 /**
614 dl 1.1 * invoke task throws exception when task cancelled
615     */
616     public void testCancelledInvoke() {
617 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
618 jsr166 1.34 protected void realCompute() {
619 jsr166 1.17 AsyncFib f = new AsyncFib(8);
620     assertTrue(f.cancel(true));
621 jsr166 1.12 try {
622     f.invoke();
623     shouldThrow();
624 jsr166 1.18 } catch (CancellationException success) {
625 jsr166 1.24 checkCancelled(f);
626 jsr166 1.18 }
627 jsr166 1.12 }};
628 jsr166 1.14 testInvokeOnPool(mainPool(), a);
629 dl 1.1 }
630    
631 jsr166 1.2 /**
632 dl 1.1 * join of a forked task throws exception when task cancelled
633     */
634     public void testCancelledForkJoin() {
635 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
636 jsr166 1.34 protected void realCompute() {
637 jsr166 1.17 AsyncFib f = new AsyncFib(8);
638     assertTrue(f.cancel(true));
639     assertSame(f, f.fork());
640 jsr166 1.12 try {
641     f.join();
642     shouldThrow();
643 jsr166 1.18 } catch (CancellationException success) {
644 jsr166 1.24 checkCancelled(f);
645 jsr166 1.18 }
646 jsr166 1.12 }};
647 jsr166 1.14 testInvokeOnPool(mainPool(), a);
648 dl 1.1 }
649    
650 jsr166 1.2 /**
651 dl 1.1 * get of a forked task throws exception when task cancelled
652     */
653     public void testCancelledForkGet() {
654 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
655 jsr166 1.34 protected void realCompute() throws Exception {
656 jsr166 1.17 AsyncFib f = new AsyncFib(8);
657     assertTrue(f.cancel(true));
658     assertSame(f, f.fork());
659 jsr166 1.12 try {
660     f.get();
661     shouldThrow();
662 jsr166 1.18 } catch (CancellationException success) {
663 jsr166 1.24 checkCancelled(f);
664 jsr166 1.18 }
665 jsr166 1.12 }};
666 jsr166 1.14 testInvokeOnPool(mainPool(), a);
667 dl 1.1 }
668    
669 jsr166 1.2 /**
670 dl 1.1 * timed get of a forked task throws exception when task cancelled
671     */
672 jsr166 1.17 public void testCancelledForkTimedGet() throws Exception {
673     RecursiveAction a = new CheckedRecursiveAction() {
674 jsr166 1.34 protected void realCompute() throws Exception {
675 jsr166 1.17 AsyncFib f = new AsyncFib(8);
676     assertTrue(f.cancel(true));
677     assertSame(f, f.fork());
678     try {
679 jsr166 1.18 f.get(LONG_DELAY_MS, MILLISECONDS);
680 jsr166 1.12 shouldThrow();
681 jsr166 1.18 } catch (CancellationException success) {
682 jsr166 1.24 checkCancelled(f);
683 jsr166 1.18 }
684 jsr166 1.12 }};
685 jsr166 1.14 testInvokeOnPool(mainPool(), a);
686 dl 1.1 }
687    
688 jsr166 1.2 /**
689 dl 1.1 * quietlyJoin of a forked task returns when task cancelled
690     */
691     public void testCancelledForkQuietlyJoin() {
692 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
693 jsr166 1.34 protected void realCompute() {
694 jsr166 1.12 AsyncFib f = new AsyncFib(8);
695 jsr166 1.17 assertTrue(f.cancel(true));
696     assertSame(f, f.fork());
697 jsr166 1.12 f.quietlyJoin();
698 jsr166 1.24 checkCancelled(f);
699 jsr166 1.12 }};
700 jsr166 1.14 testInvokeOnPool(mainPool(), a);
701 dl 1.1 }
702    
703     /**
704     * getPool of executing task returns its pool
705     */
706     public void testGetPool() {
707 jsr166 1.14 final ForkJoinPool mainPool = mainPool();
708 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
709 jsr166 1.34 protected void realCompute() {
710 jsr166 1.17 assertSame(mainPool, getPool());
711 jsr166 1.12 }};
712 jsr166 1.14 testInvokeOnPool(mainPool, a);
713 dl 1.1 }
714    
715     /**
716     * getPool of non-FJ task returns null
717     */
718     public void testGetPool2() {
719 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
720 jsr166 1.34 protected void realCompute() {
721 jsr166 1.17 assertNull(getPool());
722 jsr166 1.12 }};
723 jsr166 1.16 assertNull(a.invoke());
724 dl 1.1 }
725    
726     /**
727     * inForkJoinPool of executing task returns true
728     */
729     public void testInForkJoinPool() {
730 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
731 jsr166 1.34 protected void realCompute() {
732 jsr166 1.17 assertTrue(inForkJoinPool());
733 jsr166 1.12 }};
734 jsr166 1.14 testInvokeOnPool(mainPool(), a);
735 dl 1.1 }
736    
737     /**
738     * inForkJoinPool of non-FJ task returns false
739     */
740     public void testInForkJoinPool2() {
741 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
742 jsr166 1.34 protected void realCompute() {
743 jsr166 1.24 assertFalse(inForkJoinPool());
744 jsr166 1.12 }};
745 jsr166 1.16 assertNull(a.invoke());
746 dl 1.1 }
747    
748     /**
749     * setRawResult(null) succeeds
750     */
751     public void testSetRawResult() {
752 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
753 jsr166 1.34 protected void realCompute() {
754 jsr166 1.12 setRawResult(null);
755 jsr166 1.27 assertNull(getRawResult());
756 jsr166 1.12 }};
757 jsr166 1.16 assertNull(a.invoke());
758 dl 1.1 }
759    
760 jsr166 1.2 /**
761 dl 1.1 * invoke task throws exception after invoking completeExceptionally
762     */
763     public void testCompleteExceptionally() {
764 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
765 jsr166 1.34 protected void realCompute() {
766 jsr166 1.17 AsyncFib f = new AsyncFib(8);
767     f.completeExceptionally(new FJException());
768 jsr166 1.12 try {
769     f.invoke();
770     shouldThrow();
771 jsr166 1.24 } catch (FJException success) {
772     checkCompletedAbnormally(f, success);
773     }
774 jsr166 1.12 }};
775 jsr166 1.14 testInvokeOnPool(mainPool(), a);
776 dl 1.1 }
777    
778 jsr166 1.2 /**
779 jsr166 1.49 * completeExceptionally(null) surprisingly has the same effect as
780     * completeExceptionally(new RuntimeException())
781     */
782     public void testCompleteExceptionally_null() {
783     RecursiveAction a = new CheckedRecursiveAction() {
784     protected void realCompute() {
785     AsyncFib f = new AsyncFib(8);
786     f.completeExceptionally(null);
787     try {
788     f.invoke();
789     shouldThrow();
790     } catch (RuntimeException success) {
791     assertSame(success.getClass(), RuntimeException.class);
792     assertNull(success.getCause());
793     checkCompletedAbnormally(f, success);
794     }
795     }};
796     testInvokeOnPool(mainPool(), a);
797     }
798    
799     /**
800 dl 1.1 * invokeAll(t1, t2) invokes all task arguments
801     */
802     public void testInvokeAll2() {
803 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
804 jsr166 1.34 protected void realCompute() {
805 jsr166 1.12 AsyncFib f = new AsyncFib(8);
806     AsyncFib g = new AsyncFib(9);
807     invokeAll(f, g);
808 jsr166 1.17 assertEquals(21, f.number);
809     assertEquals(34, g.number);
810 jsr166 1.24 checkCompletedNormally(f);
811     checkCompletedNormally(g);
812 jsr166 1.12 }};
813 jsr166 1.14 testInvokeOnPool(mainPool(), a);
814 dl 1.1 }
815    
816 jsr166 1.2 /**
817 dl 1.1 * invokeAll(tasks) with 1 argument invokes task
818     */
819     public void testInvokeAll1() {
820 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
821 jsr166 1.34 protected void realCompute() {
822 jsr166 1.12 AsyncFib f = new AsyncFib(8);
823     invokeAll(f);
824 jsr166 1.24 checkCompletedNormally(f);
825 jsr166 1.17 assertEquals(21, f.number);
826 jsr166 1.12 }};
827 jsr166 1.14 testInvokeOnPool(mainPool(), a);
828 dl 1.1 }
829    
830 jsr166 1.2 /**
831 dl 1.1 * invokeAll(tasks) with > 2 argument invokes tasks
832     */
833     public void testInvokeAll3() {
834 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
835 jsr166 1.34 protected void realCompute() {
836 jsr166 1.12 AsyncFib f = new AsyncFib(8);
837     AsyncFib g = new AsyncFib(9);
838     AsyncFib h = new AsyncFib(7);
839     invokeAll(f, g, h);
840 jsr166 1.17 assertEquals(21, f.number);
841     assertEquals(34, g.number);
842     assertEquals(13, h.number);
843 jsr166 1.24 checkCompletedNormally(f);
844     checkCompletedNormally(g);
845     checkCompletedNormally(h);
846 jsr166 1.12 }};
847 jsr166 1.14 testInvokeOnPool(mainPool(), a);
848 dl 1.1 }
849    
850 jsr166 1.2 /**
851 dl 1.1 * invokeAll(collection) invokes all tasks in the collection
852     */
853     public void testInvokeAllCollection() {
854 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
855 jsr166 1.34 protected void realCompute() {
856 jsr166 1.12 AsyncFib f = new AsyncFib(8);
857     AsyncFib g = new AsyncFib(9);
858     AsyncFib h = new AsyncFib(7);
859     HashSet set = new HashSet();
860     set.add(f);
861     set.add(g);
862     set.add(h);
863     invokeAll(set);
864 jsr166 1.17 assertEquals(21, f.number);
865     assertEquals(34, g.number);
866     assertEquals(13, h.number);
867 jsr166 1.24 checkCompletedNormally(f);
868     checkCompletedNormally(g);
869     checkCompletedNormally(h);
870 jsr166 1.12 }};
871 jsr166 1.14 testInvokeOnPool(mainPool(), a);
872 dl 1.1 }
873    
874 jsr166 1.2 /**
875 dl 1.1 * invokeAll(tasks) with any null task throws NPE
876     */
877     public void testInvokeAllNPE() {
878 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
879 jsr166 1.34 protected void realCompute() {
880 jsr166 1.17 AsyncFib f = new AsyncFib(8);
881     AsyncFib g = new AsyncFib(9);
882     AsyncFib h = null;
883 jsr166 1.12 try {
884     invokeAll(f, g, h);
885     shouldThrow();
886 jsr166 1.17 } catch (NullPointerException success) {}
887 jsr166 1.12 }};
888 jsr166 1.14 testInvokeOnPool(mainPool(), a);
889 dl 1.1 }
890    
891 jsr166 1.2 /**
892 dl 1.1 * invokeAll(t1, t2) throw exception if any task does
893     */
894     public void testAbnormalInvokeAll2() {
895 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
896 jsr166 1.34 protected void realCompute() {
897 jsr166 1.17 AsyncFib f = new AsyncFib(8);
898     FailingAsyncFib g = new FailingAsyncFib(9);
899 jsr166 1.45 ForkJoinTask[] tasks = { f, g };
900     Collections.shuffle(Arrays.asList(tasks));
901 jsr166 1.12 try {
902 jsr166 1.45 invokeAll(tasks);
903 jsr166 1.12 shouldThrow();
904 jsr166 1.24 } catch (FJException success) {
905     checkCompletedAbnormally(g, success);
906     }
907 jsr166 1.12 }};
908 jsr166 1.14 testInvokeOnPool(mainPool(), a);
909 dl 1.1 }
910    
911 jsr166 1.2 /**
912 dl 1.1 * invokeAll(tasks) with 1 argument throws exception if task does
913     */
914     public void testAbnormalInvokeAll1() {
915 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
916 jsr166 1.34 protected void realCompute() {
917 jsr166 1.17 FailingAsyncFib g = new FailingAsyncFib(9);
918 jsr166 1.12 try {
919     invokeAll(g);
920     shouldThrow();
921 jsr166 1.24 } catch (FJException success) {
922     checkCompletedAbnormally(g, success);
923     }
924 jsr166 1.12 }};
925 jsr166 1.14 testInvokeOnPool(mainPool(), a);
926 dl 1.1 }
927    
928 jsr166 1.2 /**
929 dl 1.1 * invokeAll(tasks) with > 2 argument throws exception if any task does
930     */
931     public void testAbnormalInvokeAll3() {
932 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
933 jsr166 1.34 protected void realCompute() {
934 jsr166 1.17 AsyncFib f = new AsyncFib(8);
935     FailingAsyncFib g = new FailingAsyncFib(9);
936     AsyncFib h = new AsyncFib(7);
937 jsr166 1.45 ForkJoinTask[] tasks = { f, g, h };
938     Collections.shuffle(Arrays.asList(tasks));
939 jsr166 1.12 try {
940 jsr166 1.45 invokeAll(tasks);
941 jsr166 1.12 shouldThrow();
942 jsr166 1.24 } catch (FJException success) {
943     checkCompletedAbnormally(g, success);
944     }
945 jsr166 1.12 }};
946 jsr166 1.14 testInvokeOnPool(mainPool(), a);
947 dl 1.1 }
948    
949 jsr166 1.2 /**
950 jsr166 1.37 * invokeAll(collection) throws exception if any task does
951 dl 1.1 */
952     public void testAbnormalInvokeAllCollection() {
953 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
954 jsr166 1.34 protected void realCompute() {
955 jsr166 1.17 FailingAsyncFib f = new FailingAsyncFib(8);
956     AsyncFib g = new AsyncFib(9);
957     AsyncFib h = new AsyncFib(7);
958 jsr166 1.45 ForkJoinTask[] tasks = { f, g, h };
959     List taskList = Arrays.asList(tasks);
960     Collections.shuffle(taskList);
961 jsr166 1.12 try {
962 jsr166 1.45 invokeAll(taskList);
963 jsr166 1.12 shouldThrow();
964 jsr166 1.24 } catch (FJException success) {
965     checkCompletedAbnormally(f, success);
966     }
967 jsr166 1.12 }};
968 jsr166 1.14 testInvokeOnPool(mainPool(), a);
969 dl 1.1 }
970    
971 jsr166 1.2 /**
972 dl 1.1 * tryUnfork returns true for most recent unexecuted task,
973     * and suppresses execution
974     */
975     public void testTryUnfork() {
976 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
977 jsr166 1.34 protected void realCompute() {
978 jsr166 1.12 AsyncFib g = new AsyncFib(9);
979 jsr166 1.17 assertSame(g, g.fork());
980 jsr166 1.12 AsyncFib f = new AsyncFib(8);
981 jsr166 1.17 assertSame(f, f.fork());
982     assertTrue(f.tryUnfork());
983 jsr166 1.12 helpQuiesce();
984 jsr166 1.24 checkNotDone(f);
985     checkCompletedNormally(g);
986 jsr166 1.12 }};
987 jsr166 1.14 testInvokeOnPool(singletonPool(), a);
988 dl 1.1 }
989    
990 jsr166 1.2 /**
991 dl 1.1 * getSurplusQueuedTaskCount returns > 0 when
992     * there are more tasks than threads
993     */
994     public void testGetSurplusQueuedTaskCount() {
995 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
996 jsr166 1.34 protected void realCompute() {
997 jsr166 1.12 AsyncFib h = new AsyncFib(7);
998 jsr166 1.17 assertSame(h, h.fork());
999 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1000 jsr166 1.17 assertSame(g, g.fork());
1001 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1002 jsr166 1.17 assertSame(f, f.fork());
1003     assertTrue(getSurplusQueuedTaskCount() > 0);
1004 jsr166 1.12 helpQuiesce();
1005 jsr166 1.24 assertEquals(0, getSurplusQueuedTaskCount());
1006     checkCompletedNormally(f);
1007     checkCompletedNormally(g);
1008     checkCompletedNormally(h);
1009 jsr166 1.12 }};
1010 jsr166 1.14 testInvokeOnPool(singletonPool(), a);
1011 dl 1.1 }
1012    
1013 jsr166 1.2 /**
1014 dl 1.1 * peekNextLocalTask returns most recent unexecuted task.
1015     */
1016     public void testPeekNextLocalTask() {
1017 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1018 jsr166 1.34 protected void realCompute() {
1019 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1020 jsr166 1.17 assertSame(g, g.fork());
1021 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1022 jsr166 1.17 assertSame(f, f.fork());
1023     assertSame(f, peekNextLocalTask());
1024     assertNull(f.join());
1025 jsr166 1.24 checkCompletedNormally(f);
1026 jsr166 1.12 helpQuiesce();
1027 jsr166 1.24 checkCompletedNormally(g);
1028 jsr166 1.12 }};
1029 jsr166 1.14 testInvokeOnPool(singletonPool(), a);
1030 dl 1.1 }
1031    
1032 jsr166 1.2 /**
1033 jsr166 1.24 * pollNextLocalTask returns most recent unexecuted task without
1034     * executing it
1035 dl 1.1 */
1036     public void testPollNextLocalTask() {
1037 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1038 jsr166 1.34 protected void realCompute() {
1039 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1040 jsr166 1.17 assertSame(g, g.fork());
1041 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1042 jsr166 1.17 assertSame(f, f.fork());
1043     assertSame(f, pollNextLocalTask());
1044 jsr166 1.12 helpQuiesce();
1045 jsr166 1.24 checkNotDone(f);
1046     assertEquals(34, g.number);
1047     checkCompletedNormally(g);
1048 jsr166 1.12 }};
1049 jsr166 1.14 testInvokeOnPool(singletonPool(), a);
1050 dl 1.1 }
1051    
1052 jsr166 1.2 /**
1053 jsr166 1.24 * pollTask returns an unexecuted task without executing it
1054 dl 1.1 */
1055     public void testPollTask() {
1056 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1057 jsr166 1.34 protected void realCompute() {
1058 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1059 jsr166 1.17 assertSame(g, g.fork());
1060 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1061 jsr166 1.17 assertSame(f, f.fork());
1062     assertSame(f, pollTask());
1063 jsr166 1.12 helpQuiesce();
1064 jsr166 1.24 checkNotDone(f);
1065     checkCompletedNormally(g);
1066 jsr166 1.12 }};
1067 jsr166 1.14 testInvokeOnPool(singletonPool(), a);
1068 dl 1.1 }
1069    
1070 jsr166 1.2 /**
1071 dl 1.1 * peekNextLocalTask returns least recent unexecuted task in async mode
1072     */
1073     public void testPeekNextLocalTaskAsync() {
1074 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1075 jsr166 1.34 protected void realCompute() {
1076 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1077 jsr166 1.17 assertSame(g, g.fork());
1078 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1079 jsr166 1.17 assertSame(f, f.fork());
1080     assertSame(g, peekNextLocalTask());
1081     assertNull(f.join());
1082 jsr166 1.12 helpQuiesce();
1083 jsr166 1.24 checkCompletedNormally(f);
1084     assertEquals(34, g.number);
1085     checkCompletedNormally(g);
1086 jsr166 1.12 }};
1087 jsr166 1.14 testInvokeOnPool(asyncSingletonPool(), a);
1088 dl 1.1 }
1089    
1090 jsr166 1.2 /**
1091 jsr166 1.24 * pollNextLocalTask returns least recent unexecuted task without
1092     * executing it, in async mode
1093 dl 1.1 */
1094     public void testPollNextLocalTaskAsync() {
1095 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1096 jsr166 1.34 protected void realCompute() {
1097 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1098 jsr166 1.17 assertSame(g, g.fork());
1099 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1100 jsr166 1.17 assertSame(f, f.fork());
1101     assertSame(g, pollNextLocalTask());
1102 jsr166 1.12 helpQuiesce();
1103 jsr166 1.24 assertEquals(21, f.number);
1104     checkCompletedNormally(f);
1105     checkNotDone(g);
1106 jsr166 1.12 }};
1107 jsr166 1.14 testInvokeOnPool(asyncSingletonPool(), a);
1108 dl 1.1 }
1109    
1110 jsr166 1.2 /**
1111 jsr166 1.24 * pollTask returns an unexecuted task without executing it, in
1112     * async mode
1113 dl 1.1 */
1114     public void testPollTaskAsync() {
1115 jsr166 1.17 RecursiveAction a = new CheckedRecursiveAction() {
1116 jsr166 1.34 protected void realCompute() {
1117 jsr166 1.12 AsyncFib g = new AsyncFib(9);
1118 jsr166 1.17 assertSame(g, g.fork());
1119 jsr166 1.12 AsyncFib f = new AsyncFib(8);
1120 jsr166 1.17 assertSame(f, f.fork());
1121     assertSame(g, pollTask());
1122 jsr166 1.12 helpQuiesce();
1123 jsr166 1.24 assertEquals(21, f.number);
1124     checkCompletedNormally(f);
1125     checkNotDone(g);
1126 jsr166 1.12 }};
1127 jsr166 1.14 testInvokeOnPool(asyncSingletonPool(), a);
1128 dl 1.1 }
1129 dl 1.20
1130     // versions for singleton pools
1131    
1132     /**
1133     * invoke returns when task completes normally.
1134     * isCompletedAbnormally and isCancelled return false for normally
1135 jsr166 1.26 * completed tasks; getRawResult returns null.
1136 dl 1.20 */
1137     public void testInvokeSingleton() {
1138     RecursiveAction a = new CheckedRecursiveAction() {
1139 jsr166 1.34 protected void realCompute() {
1140 dl 1.20 AsyncFib f = new AsyncFib(8);
1141     assertNull(f.invoke());
1142     assertEquals(21, f.number);
1143 jsr166 1.24 checkCompletedNormally(f);
1144 dl 1.20 }};
1145     testInvokeOnPool(singletonPool(), a);
1146     }
1147    
1148     /**
1149     * quietlyInvoke task returns when task completes normally.
1150     * isCompletedAbnormally and isCancelled return false for normally
1151     * completed tasks
1152     */
1153     public void testQuietlyInvokeSingleton() {
1154     RecursiveAction a = new CheckedRecursiveAction() {
1155 jsr166 1.34 protected void realCompute() {
1156 dl 1.20 AsyncFib f = new AsyncFib(8);
1157     f.quietlyInvoke();
1158     assertEquals(21, f.number);
1159 jsr166 1.24 checkCompletedNormally(f);
1160 dl 1.20 }};
1161     testInvokeOnPool(singletonPool(), a);
1162     }
1163    
1164     /**
1165     * join of a forked task returns when task completes
1166     */
1167     public void testForkJoinSingleton() {
1168     RecursiveAction a = new CheckedRecursiveAction() {
1169 jsr166 1.34 protected void realCompute() {
1170 dl 1.20 AsyncFib f = new AsyncFib(8);
1171     assertSame(f, f.fork());
1172     assertNull(f.join());
1173     assertEquals(21, f.number);
1174 jsr166 1.24 checkCompletedNormally(f);
1175 dl 1.20 }};
1176     testInvokeOnPool(singletonPool(), a);
1177     }
1178    
1179     /**
1180     * get of a forked task returns when task completes
1181     */
1182     public void testForkGetSingleton() {
1183     RecursiveAction a = new CheckedRecursiveAction() {
1184 jsr166 1.34 protected void realCompute() throws Exception {
1185 dl 1.20 AsyncFib f = new AsyncFib(8);
1186     assertSame(f, f.fork());
1187     assertNull(f.get());
1188     assertEquals(21, f.number);
1189 jsr166 1.24 checkCompletedNormally(f);
1190 dl 1.20 }};
1191     testInvokeOnPool(singletonPool(), a);
1192     }
1193    
1194     /**
1195     * timed get of a forked task returns when task completes
1196     */
1197     public void testForkTimedGetSingleton() {
1198     RecursiveAction a = new CheckedRecursiveAction() {
1199 jsr166 1.34 protected void realCompute() throws Exception {
1200 dl 1.20 AsyncFib f = new AsyncFib(8);
1201     assertSame(f, f.fork());
1202     assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
1203     assertEquals(21, f.number);
1204 jsr166 1.24 checkCompletedNormally(f);
1205 dl 1.20 }};
1206     testInvokeOnPool(singletonPool(), a);
1207     }
1208    
1209     /**
1210     * timed get with null time unit throws NPE
1211     */
1212     public void testForkTimedGetNPESingleton() {
1213     RecursiveAction a = new CheckedRecursiveAction() {
1214 jsr166 1.34 protected void realCompute() throws Exception {
1215 dl 1.20 AsyncFib f = new AsyncFib(8);
1216     assertSame(f, f.fork());
1217     try {
1218     f.get(5L, null);
1219     shouldThrow();
1220     } catch (NullPointerException success) {}
1221     }};
1222     testInvokeOnPool(singletonPool(), a);
1223     }
1224    
1225     /**
1226     * quietlyJoin of a forked task returns when task completes
1227     */
1228     public void testForkQuietlyJoinSingleton() {
1229     RecursiveAction a = new CheckedRecursiveAction() {
1230 jsr166 1.34 protected void realCompute() {
1231 dl 1.20 AsyncFib f = new AsyncFib(8);
1232     assertSame(f, f.fork());
1233     f.quietlyJoin();
1234     assertEquals(21, f.number);
1235 jsr166 1.24 checkCompletedNormally(f);
1236 dl 1.20 }};
1237     testInvokeOnPool(singletonPool(), a);
1238     }
1239    
1240     /**
1241     * helpQuiesce returns when tasks are complete.
1242     * getQueuedTaskCount returns 0 when quiescent
1243     */
1244     public void testForkHelpQuiesceSingleton() {
1245     RecursiveAction a = new CheckedRecursiveAction() {
1246 jsr166 1.34 protected void realCompute() {
1247 dl 1.20 AsyncFib f = new AsyncFib(8);
1248     assertSame(f, f.fork());
1249 jsr166 1.32 helpQuiesce();
1250 jsr166 1.24 assertEquals(0, getQueuedTaskCount());
1251 dl 1.20 assertEquals(21, f.number);
1252 jsr166 1.24 checkCompletedNormally(f);
1253 dl 1.20 }};
1254     testInvokeOnPool(singletonPool(), a);
1255     }
1256    
1257     /**
1258     * invoke task throws exception when task completes abnormally
1259     */
1260     public void testAbnormalInvokeSingleton() {
1261     RecursiveAction a = new CheckedRecursiveAction() {
1262 jsr166 1.34 protected void realCompute() {
1263 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1264     try {
1265     f.invoke();
1266     shouldThrow();
1267 jsr166 1.24 } catch (FJException success) {
1268     checkCompletedAbnormally(f, success);
1269     }
1270 dl 1.20 }};
1271     testInvokeOnPool(singletonPool(), a);
1272     }
1273    
1274     /**
1275     * quietlyInvoke task returns when task completes abnormally
1276     */
1277     public void testAbnormalQuietlyInvokeSingleton() {
1278     RecursiveAction a = new CheckedRecursiveAction() {
1279 jsr166 1.34 protected void realCompute() {
1280 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1281     f.quietlyInvoke();
1282 jsr166 1.24 assertTrue(f.getException() instanceof FJException);
1283     checkCompletedAbnormally(f, f.getException());
1284 dl 1.20 }};
1285     testInvokeOnPool(singletonPool(), a);
1286     }
1287    
1288     /**
1289     * join of a forked task throws exception when task completes abnormally
1290     */
1291     public void testAbnormalForkJoinSingleton() {
1292     RecursiveAction a = new CheckedRecursiveAction() {
1293 jsr166 1.34 protected void realCompute() {
1294 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1295     assertSame(f, f.fork());
1296     try {
1297     f.join();
1298     shouldThrow();
1299 jsr166 1.24 } catch (FJException success) {
1300     checkCompletedAbnormally(f, success);
1301     }
1302 dl 1.20 }};
1303     testInvokeOnPool(singletonPool(), a);
1304     }
1305    
1306     /**
1307     * get of a forked task throws exception when task completes abnormally
1308     */
1309     public void testAbnormalForkGetSingleton() {
1310     RecursiveAction a = new CheckedRecursiveAction() {
1311 jsr166 1.34 protected void realCompute() throws Exception {
1312 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1313     assertSame(f, f.fork());
1314     try {
1315     f.get();
1316     shouldThrow();
1317     } catch (ExecutionException success) {
1318     Throwable cause = success.getCause();
1319     assertTrue(cause instanceof FJException);
1320 jsr166 1.24 checkCompletedAbnormally(f, cause);
1321 dl 1.20 }
1322     }};
1323     testInvokeOnPool(singletonPool(), a);
1324     }
1325    
1326     /**
1327     * timed get of a forked task throws exception when task completes abnormally
1328     */
1329     public void testAbnormalForkTimedGetSingleton() {
1330     RecursiveAction a = new CheckedRecursiveAction() {
1331 jsr166 1.34 protected void realCompute() throws Exception {
1332 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1333     assertSame(f, f.fork());
1334     try {
1335     f.get(LONG_DELAY_MS, MILLISECONDS);
1336     shouldThrow();
1337     } catch (ExecutionException success) {
1338     Throwable cause = success.getCause();
1339     assertTrue(cause instanceof FJException);
1340 jsr166 1.24 checkCompletedAbnormally(f, cause);
1341 dl 1.20 }
1342     }};
1343     testInvokeOnPool(singletonPool(), a);
1344     }
1345    
1346     /**
1347     * quietlyJoin of a forked task returns when task completes abnormally
1348     */
1349     public void testAbnormalForkQuietlyJoinSingleton() {
1350     RecursiveAction a = new CheckedRecursiveAction() {
1351 jsr166 1.34 protected void realCompute() {
1352 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1353     assertSame(f, f.fork());
1354     f.quietlyJoin();
1355     assertTrue(f.getException() instanceof FJException);
1356 jsr166 1.24 checkCompletedAbnormally(f, f.getException());
1357 dl 1.20 }};
1358     testInvokeOnPool(singletonPool(), a);
1359     }
1360    
1361     /**
1362     * invoke task throws exception when task cancelled
1363     */
1364     public void testCancelledInvokeSingleton() {
1365     RecursiveAction a = new CheckedRecursiveAction() {
1366 jsr166 1.34 protected void realCompute() {
1367 dl 1.20 AsyncFib f = new AsyncFib(8);
1368     assertTrue(f.cancel(true));
1369     try {
1370     f.invoke();
1371     shouldThrow();
1372     } catch (CancellationException success) {
1373 jsr166 1.24 checkCancelled(f);
1374 dl 1.20 }
1375     }};
1376     testInvokeOnPool(singletonPool(), a);
1377     }
1378    
1379     /**
1380     * join of a forked task throws exception when task cancelled
1381     */
1382     public void testCancelledForkJoinSingleton() {
1383     RecursiveAction a = new CheckedRecursiveAction() {
1384 jsr166 1.34 protected void realCompute() {
1385 dl 1.20 AsyncFib f = new AsyncFib(8);
1386     assertTrue(f.cancel(true));
1387     assertSame(f, f.fork());
1388     try {
1389     f.join();
1390     shouldThrow();
1391     } catch (CancellationException success) {
1392 jsr166 1.24 checkCancelled(f);
1393 dl 1.20 }
1394     }};
1395     testInvokeOnPool(singletonPool(), a);
1396     }
1397    
1398     /**
1399     * get of a forked task throws exception when task cancelled
1400     */
1401     public void testCancelledForkGetSingleton() {
1402     RecursiveAction a = new CheckedRecursiveAction() {
1403 jsr166 1.34 protected void realCompute() throws Exception {
1404 dl 1.20 AsyncFib f = new AsyncFib(8);
1405     assertTrue(f.cancel(true));
1406     assertSame(f, f.fork());
1407     try {
1408     f.get();
1409     shouldThrow();
1410     } catch (CancellationException success) {
1411 jsr166 1.24 checkCancelled(f);
1412 dl 1.20 }
1413     }};
1414     testInvokeOnPool(singletonPool(), a);
1415     }
1416    
1417     /**
1418     * timed get of a forked task throws exception when task cancelled
1419     */
1420     public void testCancelledForkTimedGetSingleton() throws Exception {
1421     RecursiveAction a = new CheckedRecursiveAction() {
1422 jsr166 1.34 protected void realCompute() throws Exception {
1423 dl 1.20 AsyncFib f = new AsyncFib(8);
1424     assertTrue(f.cancel(true));
1425     assertSame(f, f.fork());
1426     try {
1427     f.get(LONG_DELAY_MS, MILLISECONDS);
1428     shouldThrow();
1429     } catch (CancellationException success) {
1430 jsr166 1.24 checkCancelled(f);
1431 dl 1.20 }
1432     }};
1433     testInvokeOnPool(singletonPool(), a);
1434     }
1435    
1436     /**
1437     * quietlyJoin of a forked task returns when task cancelled
1438     */
1439     public void testCancelledForkQuietlyJoinSingleton() {
1440     RecursiveAction a = new CheckedRecursiveAction() {
1441 jsr166 1.34 protected void realCompute() {
1442 dl 1.20 AsyncFib f = new AsyncFib(8);
1443     assertTrue(f.cancel(true));
1444     assertSame(f, f.fork());
1445     f.quietlyJoin();
1446 jsr166 1.24 checkCancelled(f);
1447 dl 1.20 }};
1448     testInvokeOnPool(singletonPool(), a);
1449     }
1450    
1451     /**
1452     * invoke task throws exception after invoking completeExceptionally
1453     */
1454     public void testCompleteExceptionallySingleton() {
1455     RecursiveAction a = new CheckedRecursiveAction() {
1456 jsr166 1.34 protected void realCompute() {
1457 dl 1.20 AsyncFib f = new AsyncFib(8);
1458     f.completeExceptionally(new FJException());
1459     try {
1460     f.invoke();
1461     shouldThrow();
1462 jsr166 1.24 } catch (FJException success) {
1463     checkCompletedAbnormally(f, success);
1464     }
1465 dl 1.20 }};
1466     testInvokeOnPool(singletonPool(), a);
1467     }
1468    
1469     /**
1470     * invokeAll(t1, t2) invokes all task arguments
1471     */
1472     public void testInvokeAll2Singleton() {
1473     RecursiveAction a = new CheckedRecursiveAction() {
1474 jsr166 1.34 protected void realCompute() {
1475 dl 1.20 AsyncFib f = new AsyncFib(8);
1476     AsyncFib g = new AsyncFib(9);
1477     invokeAll(f, g);
1478     assertEquals(21, f.number);
1479     assertEquals(34, g.number);
1480 jsr166 1.24 checkCompletedNormally(f);
1481     checkCompletedNormally(g);
1482 dl 1.20 }};
1483     testInvokeOnPool(singletonPool(), a);
1484     }
1485    
1486     /**
1487     * invokeAll(tasks) with 1 argument invokes task
1488     */
1489     public void testInvokeAll1Singleton() {
1490     RecursiveAction a = new CheckedRecursiveAction() {
1491 jsr166 1.34 protected void realCompute() {
1492 dl 1.20 AsyncFib f = new AsyncFib(8);
1493     invokeAll(f);
1494 jsr166 1.24 checkCompletedNormally(f);
1495 dl 1.20 assertEquals(21, f.number);
1496     }};
1497     testInvokeOnPool(singletonPool(), a);
1498     }
1499    
1500     /**
1501     * invokeAll(tasks) with > 2 argument invokes tasks
1502     */
1503     public void testInvokeAll3Singleton() {
1504     RecursiveAction a = new CheckedRecursiveAction() {
1505 jsr166 1.34 protected void realCompute() {
1506 dl 1.20 AsyncFib f = new AsyncFib(8);
1507     AsyncFib g = new AsyncFib(9);
1508     AsyncFib h = new AsyncFib(7);
1509     invokeAll(f, g, h);
1510     assertEquals(21, f.number);
1511     assertEquals(34, g.number);
1512     assertEquals(13, h.number);
1513 jsr166 1.24 checkCompletedNormally(f);
1514     checkCompletedNormally(g);
1515     checkCompletedNormally(h);
1516 dl 1.20 }};
1517     testInvokeOnPool(singletonPool(), a);
1518     }
1519    
1520     /**
1521     * invokeAll(collection) invokes all tasks in the collection
1522     */
1523     public void testInvokeAllCollectionSingleton() {
1524     RecursiveAction a = new CheckedRecursiveAction() {
1525 jsr166 1.34 protected void realCompute() {
1526 dl 1.20 AsyncFib f = new AsyncFib(8);
1527     AsyncFib g = new AsyncFib(9);
1528     AsyncFib h = new AsyncFib(7);
1529     HashSet set = new HashSet();
1530     set.add(f);
1531     set.add(g);
1532     set.add(h);
1533     invokeAll(set);
1534     assertEquals(21, f.number);
1535     assertEquals(34, g.number);
1536     assertEquals(13, h.number);
1537 jsr166 1.24 checkCompletedNormally(f);
1538     checkCompletedNormally(g);
1539     checkCompletedNormally(h);
1540 dl 1.20 }};
1541     testInvokeOnPool(singletonPool(), a);
1542     }
1543    
1544     /**
1545     * invokeAll(tasks) with any null task throws NPE
1546     */
1547     public void testInvokeAllNPESingleton() {
1548     RecursiveAction a = new CheckedRecursiveAction() {
1549 jsr166 1.34 protected void realCompute() {
1550 dl 1.20 AsyncFib f = new AsyncFib(8);
1551     AsyncFib g = new AsyncFib(9);
1552     AsyncFib h = null;
1553     try {
1554     invokeAll(f, g, h);
1555     shouldThrow();
1556     } catch (NullPointerException success) {}
1557     }};
1558     testInvokeOnPool(singletonPool(), a);
1559     }
1560    
1561     /**
1562     * invokeAll(t1, t2) throw exception if any task does
1563     */
1564     public void testAbnormalInvokeAll2Singleton() {
1565     RecursiveAction a = new CheckedRecursiveAction() {
1566 jsr166 1.34 protected void realCompute() {
1567 dl 1.20 AsyncFib f = new AsyncFib(8);
1568     FailingAsyncFib g = new FailingAsyncFib(9);
1569 jsr166 1.45 ForkJoinTask[] tasks = { f, g };
1570     Collections.shuffle(Arrays.asList(tasks));
1571 dl 1.20 try {
1572 jsr166 1.45 invokeAll(tasks);
1573 dl 1.20 shouldThrow();
1574 jsr166 1.24 } catch (FJException success) {
1575     checkCompletedAbnormally(g, success);
1576     }
1577 dl 1.20 }};
1578     testInvokeOnPool(singletonPool(), a);
1579     }
1580    
1581     /**
1582     * invokeAll(tasks) with 1 argument throws exception if task does
1583     */
1584     public void testAbnormalInvokeAll1Singleton() {
1585     RecursiveAction a = new CheckedRecursiveAction() {
1586 jsr166 1.34 protected void realCompute() {
1587 dl 1.20 FailingAsyncFib g = new FailingAsyncFib(9);
1588     try {
1589     invokeAll(g);
1590     shouldThrow();
1591 jsr166 1.24 } catch (FJException success) {
1592     checkCompletedAbnormally(g, success);
1593     }
1594 dl 1.20 }};
1595     testInvokeOnPool(singletonPool(), a);
1596     }
1597    
1598     /**
1599     * invokeAll(tasks) with > 2 argument throws exception if any task does
1600     */
1601     public void testAbnormalInvokeAll3Singleton() {
1602     RecursiveAction a = new CheckedRecursiveAction() {
1603 jsr166 1.34 protected void realCompute() {
1604 dl 1.20 AsyncFib f = new AsyncFib(8);
1605     FailingAsyncFib g = new FailingAsyncFib(9);
1606     AsyncFib h = new AsyncFib(7);
1607 jsr166 1.45 ForkJoinTask[] tasks = { f, g, h };
1608     Collections.shuffle(Arrays.asList(tasks));
1609 dl 1.20 try {
1610 jsr166 1.45 invokeAll(tasks);
1611 dl 1.20 shouldThrow();
1612 jsr166 1.24 } catch (FJException success) {
1613     checkCompletedAbnormally(g, success);
1614     }
1615 dl 1.20 }};
1616     testInvokeOnPool(singletonPool(), a);
1617     }
1618    
1619     /**
1620 jsr166 1.37 * invokeAll(collection) throws exception if any task does
1621 dl 1.20 */
1622     public void testAbnormalInvokeAllCollectionSingleton() {
1623     RecursiveAction a = new CheckedRecursiveAction() {
1624 jsr166 1.34 protected void realCompute() {
1625 dl 1.20 FailingAsyncFib f = new FailingAsyncFib(8);
1626     AsyncFib g = new AsyncFib(9);
1627     AsyncFib h = new AsyncFib(7);
1628 jsr166 1.45 ForkJoinTask[] tasks = { f, g, h };
1629     List taskList = Arrays.asList(tasks);
1630     Collections.shuffle(taskList);
1631 dl 1.20 try {
1632 jsr166 1.45 invokeAll(taskList);
1633 dl 1.20 shouldThrow();
1634 jsr166 1.24 } catch (FJException success) {
1635     checkCompletedAbnormally(f, success);
1636     }
1637 dl 1.20 }};
1638     testInvokeOnPool(singletonPool(), a);
1639     }
1640    
1641 dl 1.35 /**
1642     * ForkJoinTask.quietlyComplete returns when task completes
1643     * normally without setting a value. The most recent value
1644     * established by setRawResult(V) (or null by default) is returned
1645     * from invoke.
1646     */
1647     public void testQuietlyComplete() {
1648     RecursiveAction a = new CheckedRecursiveAction() {
1649     protected void realCompute() {
1650     AsyncFib f = new AsyncFib(8);
1651     f.quietlyComplete();
1652     assertEquals(8, f.number);
1653     checkCompletedNormally(f);
1654     }};
1655     testInvokeOnPool(mainPool(), a);
1656     }
1657    
1658 dl 1.1 }