ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
Revision: 1.19
Committed: Sun Nov 21 08:25:10 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.18: +204 -84 lines
Log Message:
more thorough testing

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