ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck-jsr166e/ForkJoinTaskTest.java
Revision: 1.3
Committed: Thu Feb 26 06:53:34 2015 UTC (9 years, 2 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -1 lines
Log Message:
delete unused imports

File Contents

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