ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveTaskTest.java
Revision: 1.33
Committed: Sun Oct 4 18:28:51 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.32: +1 -3 lines
Log Message:
PoolCleaning

File Contents

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