ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
Revision: 1.22
Committed: Sun Nov 21 20:32:15 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +4 -0 lines
Log Message:
add assertions for behavior of cancel() when task done

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