ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinTaskTest.java
Revision: 1.32
Committed: Fri May 27 17:15:48 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +2 -2 lines
Log Message:
Fix javac warnings

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