ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveTaskTest.java
Revision: 1.31
Committed: Wed Dec 31 19:05:43 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +6 -3 lines
Log Message:
no wildcard imports

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