ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
Revision: 1.23
Committed: Mon Nov 22 07:50:50 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.22: +1 -0 lines
Log Message:
small improvement to testSetRawResult

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