ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinTaskTest.java
Revision: 1.18
Committed: Fri Sep 17 00:55:19 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.17: +42 -9 lines
Log Message:
more checks when get throws ExecutionException or CancellationException

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