ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
Revision: 1.16
Committed: Mon Sep 13 23:23:45 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.15: +48 -48 lines
Log Message:
check return values from invoke, fork, join, cancel

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