ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinTaskTest.java
Revision: 1.17
Committed: Thu Sep 16 00:52:49 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +256 -276 lines
Log Message:
testcase hygiene: introduce CheckedRecursiveAction and CheckedRecursiveTask; eliminate almost all threadAssertXXX; use preferred junit conventions;narrow the scope of exception checking code; make sure test failures in non-junit threads produce proper stacktraces

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