ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CountedCompleterTest.java
Revision: 1.35
Committed: Thu Oct 26 22:50:07 2017 UTC (6 years, 6 months ago) by dl
Branch: MAIN
Changes since 1.34: +2 -0 lines
Log Message:
testForkHelpQuiesce should not assume quiescence implies task visibly done

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