ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinTaskTest.java
Revision: 1.48
Committed: Sun Oct 11 19:53:59 2015 UTC (8 years, 6 months ago) by dl
Branch: MAIN
Changes since 1.47: +12 -18 lines
Log Message:
remove unused code remnant

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