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

File Contents

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