ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CountedCompleterTest.java
Revision: 1.36
Committed: Wed Nov 8 02:26:14 2017 UTC (6 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +1 -1 lines
Log Message:
rollback: better exception handling

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4     * http://creativecommons.org/publicdomain/zero/1.0/
5     */
6 jsr166 1.16
7     import static java.util.concurrent.TimeUnit.MILLISECONDS;
8    
9 jsr166 1.15 import java.util.HashSet;
10     import java.util.concurrent.CancellationException;
11     import java.util.concurrent.CountedCompleter;
12 dl 1.1 import java.util.concurrent.ExecutionException;
13     import java.util.concurrent.ForkJoinPool;
14     import java.util.concurrent.ForkJoinTask;
15     import java.util.concurrent.TimeoutException;
16 jsr166 1.8 import java.util.concurrent.atomic.AtomicInteger;
17     import java.util.concurrent.atomic.AtomicReference;
18 jsr166 1.16
19     import junit.framework.Test;
20     import junit.framework.TestSuite;
21 dl 1.1
22     public class CountedCompleterTest extends JSR166TestCase {
23    
24     public static void main(String[] args) {
25 jsr166 1.18 main(suite(), args);
26 dl 1.1 }
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 jsr166 1.19 try (PoolCleaner cleaner = cleaner(pool)) {
52 dl 1.1 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 jsr166 1.33 a.get(randomExpiredTimeout(), randomTimeUnit());
80 dl 1.1 shouldThrow();
81     } catch (TimeoutException success) {
82     } catch (Throwable fail) { threadUnexpectedException(fail); }
83     }
84    
85 jsr166 1.8 void checkCompletedNormally(CountedCompleter<?> a) {
86 dl 1.1 assertTrue(a.isDone());
87     assertFalse(a.isCancelled());
88     assertTrue(a.isCompletedNormally());
89     assertFalse(a.isCompletedAbnormally());
90     assertNull(a.getException());
91 jsr166 1.8 assertNull(a.getRawResult());
92 dl 1.1
93     {
94     Thread.currentThread().interrupt();
95 jsr166 1.20 long startTime = System.nanoTime();
96 jsr166 1.8 assertNull(a.join());
97 jsr166 1.33 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
98 dl 1.1 Thread.interrupted();
99     }
100    
101     {
102     Thread.currentThread().interrupt();
103 jsr166 1.20 long startTime = System.nanoTime();
104 dl 1.1 a.quietlyJoin(); // should be no-op
105 jsr166 1.33 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
106 dl 1.1 Thread.interrupted();
107     }
108    
109     assertFalse(a.cancel(false));
110     assertFalse(a.cancel(true));
111     try {
112 jsr166 1.8 assertNull(a.get());
113 jsr166 1.33 assertNull(a.get(randomTimeout(), randomTimeUnit()));
114 jsr166 1.36 } catch (Throwable fail) { threadUnexpectedException(fail); }
115 dl 1.1 }
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 jsr166 1.20 long startTime = System.nanoTime();
137 dl 1.1 a.quietlyJoin(); // should be no-op
138 jsr166 1.33 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
139 dl 1.1 }
140    
141     try {
142     a.get();
143     shouldThrow();
144     } catch (CancellationException success) {
145     } catch (Throwable fail) { threadUnexpectedException(fail); }
146    
147     try {
148 jsr166 1.33 a.get(randomTimeout(), randomTimeUnit());
149 dl 1.1 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 jsr166 1.20 long startTime = System.nanoTime();
175 dl 1.1 a.quietlyJoin(); // should be no-op
176 jsr166 1.33 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
177 dl 1.1 }
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 jsr166 1.33 a.get(randomTimeout(), randomTimeUnit());
188 dl 1.1 shouldThrow();
189     } catch (ExecutionException success) {
190     assertSame(t.getClass(), success.getCause().getClass());
191     } catch (Throwable fail) { threadUnexpectedException(fail); }
192 jsr166 1.8
193     try {
194     a.invoke();
195     shouldThrow();
196 jsr166 1.17 } catch (Throwable success) {
197     assertSame(t, success);
198 jsr166 1.8 }
199 dl 1.1 }
200    
201     public static final class FJException extends RuntimeException {
202     FJException() { super(); }
203     }
204    
205 jsr166 1.8 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 jsr166 1.31 final AtomicReference<Object> rawResult = new AtomicReference<>(null);
211 jsr166 1.8 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 jsr166 1.10 int pendingCount = getPendingCount();
251 jsr166 1.8 complete(rawResult);
252 jsr166 1.10 assertEquals(pendingCount, getPendingCount());
253 jsr166 1.8 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 dl 1.1 }
273     }
274    
275 jsr166 1.8 final class NoopCC extends CheckedCC {
276     NoopCC() { super(); }
277     NoopCC(CountedCompleter p) { super(p); }
278 jsr166 1.21 NoopCC(CountedCompleter p, int initialPendingCount) {
279     super(p, initialPendingCount);
280     }
281 jsr166 1.8 protected void realCompute() {}
282     }
283    
284 dl 1.1 /**
285 jsr166 1.3 * A newly constructed CountedCompleter is not completed;
286 jsr166 1.10 * complete() causes completion. pendingCount is ignored.
287 dl 1.1 */
288     public void testComplete() {
289 jsr166 1.8 for (Object x : new Object[] { Boolean.TRUE, null }) {
290 jsr166 1.10 for (int pendingCount : new int[] { 0, 42 }) {
291     testComplete(new NoopCC(), x, pendingCount);
292     testComplete(new NoopCC(new NoopCC()), x, pendingCount);
293     }
294 jsr166 1.8 }
295 dl 1.1 }
296 jsr166 1.10 void testComplete(NoopCC cc, Object x, int pendingCount) {
297     cc.setPendingCount(pendingCount);
298     cc.checkCompletes(x);
299 jsr166 1.22 assertEquals(pendingCount, cc.getPendingCount());
300 jsr166 1.10 }
301 dl 1.1
302     /**
303     * completeExceptionally completes exceptionally
304     */
305     public void testCompleteExceptionally() {
306 jsr166 1.8 new NoopCC()
307     .checkCompletesExceptionally(new FJException());
308     new NoopCC(new NoopCC())
309     .checkCompletesExceptionally(new FJException());
310     }
311    
312     /**
313 jsr166 1.21 * completeExceptionally(null) surprisingly has the same effect as
314     * completeExceptionally(new RuntimeException())
315 jsr166 1.8 */
316     public void testCompleteExceptionally_null() {
317 jsr166 1.21 NoopCC a = new NoopCC();
318     a.completeExceptionally(null);
319 jsr166 1.8 try {
320 jsr166 1.21 a.invoke();
321 jsr166 1.8 shouldThrow();
322 jsr166 1.21 } catch (RuntimeException success) {
323     assertSame(success.getClass(), RuntimeException.class);
324     assertNull(success.getCause());
325     a.checkCompletedExceptionally(success);
326     }
327 dl 1.1 }
328    
329     /**
330     * setPendingCount sets the reported pending count
331     */
332     public void testSetPendingCount() {
333 jsr166 1.8 NoopCC a = new NoopCC();
334 dl 1.1 assertEquals(0, a.getPendingCount());
335 jsr166 1.25 int[] vals = {
336     -1, 0, 1,
337     Integer.MIN_VALUE,
338     Integer.MAX_VALUE,
339     };
340     for (int val : vals) {
341 jsr166 1.24 a.setPendingCount(val);
342     assertEquals(val, a.getPendingCount());
343     }
344 dl 1.1 }
345    
346     /**
347     * addToPendingCount adds to the reported pending count
348     */
349     public void testAddToPendingCount() {
350 jsr166 1.8 NoopCC a = new NoopCC();
351 dl 1.1 assertEquals(0, a.getPendingCount());
352     a.addToPendingCount(1);
353     assertEquals(1, a.getPendingCount());
354     a.addToPendingCount(27);
355     assertEquals(28, a.getPendingCount());
356 jsr166 1.26 a.addToPendingCount(-28);
357     assertEquals(0, a.getPendingCount());
358 dl 1.1 }
359    
360     /**
361     * decrementPendingCountUnlessZero decrements reported pending
362     * count unless zero
363     */
364 jsr166 1.21 public void testDecrementPendingCountUnlessZero() {
365     NoopCC a = new NoopCC(null, 2);
366     assertEquals(2, a.getPendingCount());
367     assertEquals(2, a.decrementPendingCountUnlessZero());
368 dl 1.1 assertEquals(1, a.getPendingCount());
369 jsr166 1.21 assertEquals(1, a.decrementPendingCountUnlessZero());
370 dl 1.1 assertEquals(0, a.getPendingCount());
371 jsr166 1.21 assertEquals(0, a.decrementPendingCountUnlessZero());
372 dl 1.1 assertEquals(0, a.getPendingCount());
373 jsr166 1.23 a.setPendingCount(-1);
374     assertEquals(-1, a.decrementPendingCountUnlessZero());
375     assertEquals(-2, a.getPendingCount());
376 dl 1.1 }
377    
378     /**
379 jsr166 1.8 * 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 dl 1.1 * getCompleter returns parent or null if at root
395     */
396     public void testGetCompleter() {
397 jsr166 1.8 NoopCC a = new NoopCC();
398 dl 1.1 assertNull(a.getCompleter());
399 jsr166 1.8 CountedCompleter b = new NoopCC(a);
400     assertSame(a, b.getCompleter());
401     CountedCompleter c = new NoopCC(b);
402     assertSame(b, c.getCompleter());
403 dl 1.1 }
404 jsr166 1.3
405 dl 1.1 /**
406     * getRoot returns self if no parent, else parent's root
407     */
408     public void testGetRoot() {
409 jsr166 1.8 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 dl 1.1 }
416 jsr166 1.3
417 dl 1.1 /**
418 jsr166 1.8 * tryComplete decrements pending count unless zero, in which case
419     * causes completion
420 dl 1.1 */
421 jsr166 1.8 public void testTryComplete() {
422     NoopCC a = new NoopCC();
423 dl 1.1 assertEquals(0, a.getPendingCount());
424 jsr166 1.8 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 dl 1.1 a.tryComplete();
433 jsr166 1.8 assertEquals(0, a.computeN());
434     assertEquals(1, a.onCompletionN());
435     assertEquals(0, a.onExceptionalCompletionN());
436     assertEquals(0, a.setRawResultN());
437     checkCompletedNormally(a);
438 dl 1.1 }
439    
440     /**
441 jsr166 1.8 * propagateCompletion decrements pending count unless zero, in
442     * which case causes completion, without invoking onCompletion
443 dl 1.1 */
444     public void testPropagateCompletion() {
445 jsr166 1.8 NoopCC a = new NoopCC();
446 dl 1.1 assertEquals(0, a.getPendingCount());
447 jsr166 1.8 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 dl 1.1 a.propagateCompletion();
456 jsr166 1.8 assertEquals(0, a.computeN());
457     assertEquals(0, a.onCompletionN());
458     assertEquals(0, a.onExceptionalCompletionN());
459     assertEquals(0, a.setRawResultN());
460     checkCompletedNormally(a);
461 dl 1.1 }
462    
463     /**
464     * firstComplete returns this if pending count is zero else null
465     */
466     public void testFirstComplete() {
467 jsr166 1.8 NoopCC a = new NoopCC();
468 dl 1.1 a.setPendingCount(1);
469     assertNull(a.firstComplete());
470 jsr166 1.9 a.checkIncomplete();
471     assertSame(a, a.firstComplete());
472     a.checkIncomplete();
473 dl 1.1 }
474    
475     /**
476     * firstComplete.nextComplete returns parent if pending count is
477     * zero else null
478     */
479     public void testNextComplete() {
480 jsr166 1.8 NoopCC a = new NoopCC();
481     NoopCC b = new NoopCC(a);
482 dl 1.1 a.setPendingCount(1);
483     b.setPendingCount(1);
484     assertNull(b.firstComplete());
485 jsr166 1.9 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 dl 1.1 }
497    
498     /**
499 jsr166 1.27 * quietlyCompleteRoot completes root task and only root task
500 dl 1.1 */
501     public void testQuietlyCompleteRoot() {
502 jsr166 1.8 NoopCC a = new NoopCC();
503     NoopCC b = new NoopCC(a);
504     NoopCC c = new NoopCC(b);
505 dl 1.1 a.setPendingCount(1);
506     b.setPendingCount(1);
507 jsr166 1.8 c.setPendingCount(1);
508     c.quietlyCompleteRoot();
509 dl 1.1 assertTrue(a.isDone());
510     assertFalse(b.isDone());
511 jsr166 1.8 assertFalse(c.isDone());
512 dl 1.1 }
513 dl 1.2
514     // Invocation tests use some interdependent task classes
515     // to better test propagation etc
516    
517 jsr166 1.11 /**
518     * Version of Fibonacci with different classes for left vs right forks
519     */
520 jsr166 1.8 abstract class CCF extends CheckedCC {
521 dl 1.2 int number;
522     int rnumber;
523    
524     public CCF(CountedCompleter parent, int n) {
525     super(parent, 1);
526     this.number = n;
527     }
528    
529 jsr166 1.8 protected final void realCompute() {
530 dl 1.2 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 jsr166 1.8 f.complete(null);
537 dl 1.2 }
538     }
539    
540 jsr166 1.8 final class LCCF extends CCF {
541     public LCCF(int n) { this(null, n); }
542 dl 1.2 public LCCF(CountedCompleter parent, int n) {
543     super(parent, n);
544     }
545     public final void onCompletion(CountedCompleter caller) {
546 jsr166 1.8 super.onCompletion(caller);
547 dl 1.2 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 jsr166 1.8 final class RCCF extends CCF {
556 dl 1.2 public RCCF(CountedCompleter parent, int n) {
557     super(parent, n);
558     }
559     public final void onCompletion(CountedCompleter caller) {
560 jsr166 1.8 super.onCompletion(caller);
561 dl 1.2 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 jsr166 1.8 abstract class FailingCCF extends CheckedCC {
572 dl 1.2 int number;
573     int rnumber;
574    
575     public FailingCCF(CountedCompleter parent, int n) {
576     super(parent, 1);
577     this.number = n;
578     }
579    
580 jsr166 1.8 protected final void realCompute() {
581 dl 1.2 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 jsr166 1.8 f.complete(null);
588 dl 1.2 }
589     }
590    
591 jsr166 1.8 final class LFCCF extends FailingCCF {
592     public LFCCF(int n) { this(null, n); }
593 dl 1.2 public LFCCF(CountedCompleter parent, int n) {
594     super(parent, n);
595     }
596     public final void onCompletion(CountedCompleter caller) {
597 jsr166 1.8 super.onCompletion(caller);
598 dl 1.2 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 jsr166 1.8 final class RFCCF extends FailingCCF {
607 dl 1.2 public RFCCF(CountedCompleter parent, int n) {
608     super(parent, n);
609     }
610     public final void onCompletion(CountedCompleter caller) {
611 jsr166 1.8 super.onCompletion(caller);
612 dl 1.2 completeExceptionally(new FJException());
613     }
614     }
615 jsr166 1.3
616 dl 1.1 /**
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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
623     protected void realCompute() {
624 jsr166 1.8 CCF f = new LCCF(8);
625 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
639     protected void realCompute() {
640 jsr166 1.8 CCF f = new LCCF(8);
641 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
653     protected void realCompute() {
654 jsr166 1.8 CCF f = new LCCF(8);
655 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
668     protected void realCompute() throws Exception {
669 jsr166 1.8 CCF f = new LCCF(8);
670 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
683     protected void realCompute() throws Exception {
684 jsr166 1.8 CCF f = new LCCF(8);
685 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
698     protected void realCompute() throws Exception {
699 jsr166 1.8 CCF f = new LCCF(8);
700 dl 1.1 assertSame(f, f.fork());
701     try {
702 jsr166 1.33 f.get(randomTimeout(), null);
703 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
714     protected void realCompute() {
715 jsr166 1.8 CCF f = new LCCF(8);
716 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
730     protected void realCompute() {
731 jsr166 1.8 CCF f = new LCCF(8);
732 dl 1.1 assertSame(f, f.fork());
733     helpQuiesce();
734 dl 1.35 while (!f.isDone()) // wait out race
735     ;
736 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
748     protected void realCompute() {
749 jsr166 1.8 FailingCCF f = new LFCCF(8);
750 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
765     protected void realCompute() {
766 jsr166 1.8 FailingCCF f = new LFCCF(8);
767 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
779     protected void realCompute() {
780 jsr166 1.8 FailingCCF f = new LFCCF(8);
781 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
797     protected void realCompute() throws Exception {
798 jsr166 1.8 FailingCCF f = new LFCCF(8);
799 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
817     protected void realCompute() throws Exception {
818 jsr166 1.8 FailingCCF f = new LFCCF(8);
819 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
837     protected void realCompute() {
838 jsr166 1.8 FailingCCF f = new LFCCF(8);
839 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
852     protected void realCompute() {
853 jsr166 1.8 CCF f = new LCCF(8);
854 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
870     protected void realCompute() {
871 jsr166 1.8 CCF f = new LCCF(8);
872 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
889     protected void realCompute() throws Exception {
890 jsr166 1.8 CCF f = new LCCF(8);
891 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
908     protected void realCompute() throws Exception {
909 jsr166 1.8 CCF f = new LCCF(8);
910 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
927     protected void realCompute() {
928 jsr166 1.8 CCF f = new LCCF(8);
929 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
943     protected void realCompute() {
944 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
954     protected void realCompute() {
955 dl 1.1 assertNull(getPool());
956     }};
957     assertNull(a.invoke());
958     }
959    
960     /**
961     * inForkJoinPool of executing task returns true
962     */
963     public void testInForkJoinPool() {
964 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
965     protected void realCompute() {
966 dl 1.1 assertTrue(inForkJoinPool());
967     }};
968     testInvokeOnPool(mainPool(), a);
969     }
970    
971     /**
972     * inForkJoinPool of non-FJ task returns false
973     */
974     public void testInForkJoinPool2() {
975 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
976     protected void realCompute() {
977 dl 1.1 assertFalse(inForkJoinPool());
978     }};
979     assertNull(a.invoke());
980     }
981    
982     /**
983     * setRawResult(null) succeeds
984     */
985     public void testSetRawResult() {
986 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
987     protected void realCompute() {
988 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
999     protected void realCompute() {
1000 jsr166 1.8 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 dl 1.1 }};
1007     testInvokeOnPool(mainPool(), a);
1008     }
1009    
1010     /**
1011     * invokeAll(t1, t2) invokes all task arguments
1012     */
1013     public void testInvokeAll2() {
1014 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1015     protected void realCompute() {
1016 jsr166 1.8 CCF f = new LCCF(8);
1017     CCF g = new LCCF(9);
1018 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1032     protected void realCompute() {
1033 jsr166 1.8 CCF f = new LCCF(8);
1034 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1046     protected void realCompute() {
1047 jsr166 1.8 CCF f = new LCCF(8);
1048     CCF g = new LCCF(9);
1049     CCF h = new LCCF(7);
1050 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1066     protected void realCompute() {
1067 jsr166 1.8 CCF f = new LCCF(8);
1068     CCF g = new LCCF(9);
1069     CCF h = new LCCF(7);
1070 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1090     protected void realCompute() {
1091 jsr166 1.8 CCF f = new LCCF(8);
1092     CCF g = new LCCF(9);
1093 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1107     protected void realCompute() {
1108 jsr166 1.8 CCF f = new LCCF(8);
1109     FailingCCF g = new LFCCF(9);
1110 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1125     protected void realCompute() {
1126 jsr166 1.8 FailingCCF g = new LFCCF(9);
1127 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1142     protected void realCompute() {
1143 jsr166 1.8 CCF f = new LCCF(8);
1144     FailingCCF g = new LFCCF(9);
1145     CCF h = new LCCF(7);
1146 dl 1.1 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 jsr166 1.13 * invokeAll(collection) throws exception if any task does
1158 dl 1.1 */
1159     public void testAbnormalInvokeAllCollection() {
1160 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1161     protected void realCompute() {
1162 jsr166 1.8 FailingCCF f = new LFCCF(8);
1163     CCF g = new LCCF(9);
1164     CCF h = new LCCF(7);
1165 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1185     protected void realCompute() {
1186 jsr166 1.8 CCF g = new LCCF(9);
1187 dl 1.1 assertSame(g, g.fork());
1188 jsr166 1.8 CCF f = new LCCF(8);
1189 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1204     protected void realCompute() {
1205 jsr166 1.8 CCF h = new LCCF(7);
1206 dl 1.1 assertSame(h, h.fork());
1207 jsr166 1.8 CCF g = new LCCF(9);
1208 dl 1.1 assertSame(g, g.fork());
1209 jsr166 1.8 CCF f = new LCCF(8);
1210 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1226     protected void realCompute() {
1227 jsr166 1.8 CCF g = new LCCF(9);
1228 dl 1.1 assertSame(g, g.fork());
1229 jsr166 1.8 CCF f = new LCCF(8);
1230 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1246     protected void realCompute() {
1247 jsr166 1.8 CCF g = new LCCF(9);
1248 dl 1.1 assertSame(g, g.fork());
1249 jsr166 1.8 CCF f = new LCCF(8);
1250 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1265     protected void realCompute() {
1266 jsr166 1.8 CCF g = new LCCF(9);
1267 dl 1.1 assertSame(g, g.fork());
1268 jsr166 1.8 CCF f = new LCCF(8);
1269 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1283     protected void realCompute() {
1284 jsr166 1.8 CCF g = new LCCF(9);
1285 dl 1.1 assertSame(g, g.fork());
1286 jsr166 1.8 CCF f = new LCCF(8);
1287 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1304     protected void realCompute() {
1305 jsr166 1.8 CCF g = new LCCF(9);
1306 dl 1.1 assertSame(g, g.fork());
1307 jsr166 1.8 CCF f = new LCCF(8);
1308 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1324     protected void realCompute() {
1325 jsr166 1.8 CCF g = new LCCF(9);
1326 dl 1.1 assertSame(g, g.fork());
1327 jsr166 1.8 CCF f = new LCCF(8);
1328 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1347     protected void realCompute() {
1348 jsr166 1.8 CCF f = new LCCF(8);
1349 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1363     protected void realCompute() {
1364 jsr166 1.8 CCF f = new LCCF(8);
1365 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1377     protected void realCompute() {
1378 jsr166 1.8 CCF f = new LCCF(8);
1379 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1392     protected void realCompute() throws Exception {
1393 jsr166 1.8 CCF f = new LCCF(8);
1394 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1407     protected void realCompute() throws Exception {
1408 jsr166 1.8 CCF f = new LCCF(8);
1409 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1422     protected void realCompute() throws Exception {
1423 jsr166 1.8 CCF f = new LCCF(8);
1424 dl 1.1 assertSame(f, f.fork());
1425     try {
1426 jsr166 1.33 f.get(randomTimeout(), null);
1427 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1438     protected void realCompute() {
1439 jsr166 1.8 CCF f = new LCCF(8);
1440 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1454     protected void realCompute() {
1455 jsr166 1.8 CCF f = new LCCF(8);
1456 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1470     protected void realCompute() {
1471 jsr166 1.8 FailingCCF f = new LFCCF(8);
1472 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1487     protected void realCompute() {
1488 jsr166 1.8 FailingCCF f = new LFCCF(8);
1489 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1501     protected void realCompute() {
1502 jsr166 1.8 FailingCCF f = new LFCCF(8);
1503 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1519     protected void realCompute() throws Exception {
1520 jsr166 1.8 FailingCCF f = new LFCCF(8);
1521 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1539     protected void realCompute() throws Exception {
1540 jsr166 1.8 FailingCCF f = new LFCCF(8);
1541 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1559     protected void realCompute() {
1560 jsr166 1.8 FailingCCF f = new LFCCF(8);
1561 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1574     protected void realCompute() {
1575 jsr166 1.8 CCF f = new LCCF(8);
1576 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1592     protected void realCompute() {
1593 jsr166 1.8 CCF f = new LCCF(8);
1594 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1611     protected void realCompute() throws Exception {
1612 jsr166 1.8 CCF f = new LCCF(8);
1613 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1630     protected void realCompute() throws Exception {
1631 jsr166 1.8 CCF f = new LCCF(8);
1632 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1649     protected void realCompute() {
1650 jsr166 1.8 CCF f = new LCCF(8);
1651 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1664     protected void realCompute() {
1665 jsr166 1.8 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 dl 1.1 }};
1672     testInvokeOnPool(singletonPool(), a);
1673     }
1674    
1675     /**
1676     * invokeAll(t1, t2) invokes all task arguments
1677     */
1678     public void testInvokeAll2Singleton() {
1679 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1680     protected void realCompute() {
1681 jsr166 1.8 CCF f = new LCCF(8);
1682     CCF g = new LCCF(9);
1683 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1697     protected void realCompute() {
1698 jsr166 1.8 CCF f = new LCCF(8);
1699 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1711     protected void realCompute() {
1712 jsr166 1.8 CCF f = new LCCF(8);
1713     CCF g = new LCCF(9);
1714     CCF h = new LCCF(7);
1715 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1731     protected void realCompute() {
1732 jsr166 1.8 CCF f = new LCCF(8);
1733     CCF g = new LCCF(9);
1734     CCF h = new LCCF(7);
1735 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1755     protected void realCompute() {
1756 jsr166 1.8 CCF f = new LCCF(8);
1757     CCF g = new LCCF(9);
1758 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1772     protected void realCompute() {
1773 jsr166 1.8 CCF f = new LCCF(8);
1774     FailingCCF g = new LFCCF(9);
1775 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1790     protected void realCompute() {
1791 jsr166 1.8 FailingCCF g = new LFCCF(9);
1792 dl 1.1 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 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1807     protected void realCompute() {
1808 jsr166 1.8 CCF f = new LCCF(8);
1809     FailingCCF g = new LFCCF(9);
1810     CCF h = new LCCF(7);
1811 dl 1.1 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 jsr166 1.13 * invokeAll(collection) throws exception if any task does
1823 dl 1.1 */
1824     public void testAbnormalInvokeAllCollectionSingleton() {
1825 jsr166 1.7 ForkJoinTask a = new CheckedRecursiveAction() {
1826     protected void realCompute() {
1827 jsr166 1.8 FailingCCF f = new LFCCF(8);
1828     CCF g = new LCCF(9);
1829     CCF h = new LCCF(7);
1830 dl 1.1 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     }