ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.6
Committed: Mon Aug 3 22:08:07 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +135 -270 lines
Log Message:
cleanup exception handling

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    
7    
8     import junit.framework.*;
9     import java.util.*;
10     import java.util.concurrent.*;
11 jsr166 1.6 import static java.util.concurrent.TimeUnit.MILLISECONDS;
12 dl 1.1 import java.util.concurrent.locks.*;
13     import java.security.*;
14    
15 jsr166 1.3 public class ForkJoinPoolTest extends JSR166TestCase {
16 dl 1.1 public static void main(String[] args) {
17     junit.textui.TestRunner.run (suite());
18     }
19     public static Test suite() {
20     return new TestSuite(ForkJoinPoolTest.class);
21     }
22    
23     /**
24     * Testing coverage notes:
25     *
26     * 1. shutdown and related methods are tested via super.joinPool.
27     *
28     * 2. newTaskFor and adapters are tested in submit/invoke tests
29 jsr166 1.2 *
30 dl 1.1 * 3. We cannot portably test monitoring methods such as
31     * getStealCount() since they rely ultimately on random task
32     * stealing that may cause tasks not to be stolen/propagated
33     * across threads, especially on uniprocessors.
34 jsr166 1.2 *
35 dl 1.1 * 4. There are no independently testable ForkJoinWorkerThread
36     * methods, but they are covered here and in task tests.
37     */
38    
39     // Some classes to test extension and factory methods
40    
41     static class MyHandler implements Thread.UncaughtExceptionHandler {
42     int catches = 0;
43     public void uncaughtException(Thread t, Throwable e) {
44     ++catches;
45     }
46     }
47    
48     // to test handlers
49     static class FailingFJWSubclass extends ForkJoinWorkerThread {
50     public FailingFJWSubclass(ForkJoinPool p) { super(p) ; }
51     protected void onStart() { throw new Error(); }
52     }
53    
54 jsr166 1.6 static class FailingThreadFactory
55     implements ForkJoinPool.ForkJoinWorkerThreadFactory {
56 dl 1.1 int calls = 0;
57 jsr166 1.2 public ForkJoinWorkerThread newThread(ForkJoinPool p) {
58 dl 1.1 if (++calls > 1) return null;
59     return new FailingFJWSubclass(p);
60 jsr166 1.2 }
61 dl 1.1 }
62    
63 jsr166 1.2 static class SubFJP extends ForkJoinPool { // to expose protected
64 dl 1.1 SubFJP() { super(1); }
65     public int drainTasksTo(Collection<? super ForkJoinTask<?>> c) {
66     return super.drainTasksTo(c);
67     }
68     public ForkJoinTask<?> pollSubmission() {
69     return super.pollSubmission();
70     }
71     }
72    
73     static class ManagedLocker implements ForkJoinPool.ManagedBlocker {
74     final ReentrantLock lock;
75     boolean hasLock = false;
76     ManagedLocker(ReentrantLock lock) { this.lock = lock; }
77     public boolean block() {
78     if (!hasLock)
79     lock.lock();
80     return true;
81     }
82     public boolean isReleasable() {
83     return hasLock || (hasLock = lock.tryLock());
84     }
85     }
86    
87     // A simple recursive task for testing
88 jsr166 1.2 static final class FibTask extends RecursiveTask<Integer> {
89 dl 1.1 final int number;
90     FibTask(int n) { number = n; }
91     public Integer compute() {
92     int n = number;
93     if (n <= 1)
94     return n;
95     FibTask f1 = new FibTask(n - 1);
96     f1.fork();
97     return (new FibTask(n - 2)).compute() + f1.join();
98     }
99     }
100    
101     // A failing task for testing
102 jsr166 1.2 static final class FailingTask extends ForkJoinTask<Void> {
103 dl 1.1 public final Void getRawResult() { return null; }
104     protected final void setRawResult(Void mustBeNull) { }
105     protected final boolean exec() { throw new Error(); }
106     FailingTask() {}
107     }
108    
109     // Fib needlessly using locking to test ManagedBlockers
110 jsr166 1.2 static final class LockingFibTask extends RecursiveTask<Integer> {
111 dl 1.1 final int number;
112     final ManagedLocker locker;
113     final ReentrantLock lock;
114 jsr166 1.2 LockingFibTask(int n, ManagedLocker locker, ReentrantLock lock) {
115     number = n;
116 dl 1.1 this.locker = locker;
117     this.lock = lock;
118     }
119     public Integer compute() {
120     int n;
121     LockingFibTask f1 = null;
122     LockingFibTask f2 = null;
123     locker.block();
124 jsr166 1.2 n = number;
125 dl 1.1 if (n > 1) {
126     f1 = new LockingFibTask(n - 1, locker, lock);
127     f2 = new LockingFibTask(n - 2, locker, lock);
128     }
129     lock.unlock();
130     if (n <= 1)
131     return n;
132     else {
133     f1.fork();
134     return f2.compute() + f1.join();
135     }
136     }
137     }
138    
139 jsr166 1.2 /**
140 jsr166 1.5 * Successfully constructed pool reports default factory,
141 dl 1.1 * parallelism and async mode policies, no active threads or
142     * tasks, and quiescent running state.
143     */
144     public void testDefaultInitialState() {
145     ForkJoinPool p = null;
146     try {
147     p = new ForkJoinPool(1);
148 jsr166 1.6 assertTrue(p.getFactory() ==
149     ForkJoinPool.defaultForkJoinWorkerThreadFactory);
150 dl 1.1 assertTrue(p.isQuiescent());
151     assertTrue(p.getMaintainsParallelism());
152     assertFalse(p.getAsyncMode());
153     assertTrue(p.getActiveThreadCount() == 0);
154     assertTrue(p.getStealCount() == 0);
155     assertTrue(p.getQueuedTaskCount() == 0);
156     assertTrue(p.getQueuedSubmissionCount() == 0);
157     assertFalse(p.hasQueuedSubmissions());
158     assertFalse(p.isShutdown());
159     assertFalse(p.isTerminating());
160     assertFalse(p.isTerminated());
161     } finally {
162     joinPool(p);
163     }
164     }
165    
166 jsr166 1.2 /**
167     * Constructor throws if size argument is less than zero
168 dl 1.1 */
169     public void testConstructor1() {
170     try {
171     new ForkJoinPool(-1);
172     shouldThrow();
173     }
174 jsr166 1.2 catch (IllegalArgumentException success) {}
175 dl 1.1 }
176    
177 jsr166 1.2 /**
178     * Constructor throws if factory argument is null
179 dl 1.1 */
180     public void testConstructor2() {
181     try {
182     new ForkJoinPool(1, null);
183     shouldThrow();
184 jsr166 1.6 } catch (NullPointerException success) {
185 dl 1.1 }
186     }
187    
188    
189 jsr166 1.2 /**
190     * getParallelism returns size set in constructor
191 dl 1.1 */
192     public void testGetParallelism() {
193     ForkJoinPool p = null;
194     try {
195     p = new ForkJoinPool(1);
196     assertTrue(p.getParallelism() == 1);
197     } finally {
198     joinPool(p);
199     }
200     }
201    
202 jsr166 1.2 /**
203 dl 1.1 * setParallelism changes reported parallelism level.
204     */
205     public void testSetParallelism() {
206     ForkJoinPool p = null;
207     try {
208     p = new ForkJoinPool(1);
209     assertTrue(p.getParallelism() == 1);
210     p.setParallelism(2);
211     assertTrue(p.getParallelism() == 2);
212     } finally {
213     joinPool(p);
214     }
215     }
216    
217 jsr166 1.2 /**
218 dl 1.1 * setParallelism with argument <= 0 throws exception
219     */
220     public void testSetParallelism2() {
221     ForkJoinPool p = null;
222     try {
223     p = new ForkJoinPool(1);
224     assertTrue(p.getParallelism() == 1);
225     p.setParallelism(-2);
226     shouldThrow();
227 jsr166 1.2 } catch (IllegalArgumentException success) {
228 dl 1.1 } finally {
229     joinPool(p);
230     }
231     }
232    
233 jsr166 1.2 /**
234 dl 1.1 * getPoolSize returns number of started workers.
235     */
236     public void testGetPoolSize() {
237     ForkJoinPool p = null;
238     try {
239     p = new ForkJoinPool(1);
240     assertTrue(p.getPoolSize() == 0);
241     Future<String> future = p.submit(new StringTask());
242     assertTrue(p.getPoolSize() == 1);
243    
244     } finally {
245     joinPool(p);
246     }
247     }
248    
249 jsr166 1.2 /**
250 dl 1.1 * setMaximumPoolSize changes size reported by getMaximumPoolSize.
251     */
252     public void testSetMaximumPoolSize() {
253     ForkJoinPool p = null;
254     try {
255     p = new ForkJoinPool(1);
256     p.setMaximumPoolSize(2);
257     assertTrue(p.getMaximumPoolSize() == 2);
258     } finally {
259     joinPool(p);
260     }
261     }
262    
263 jsr166 1.2 /**
264 dl 1.1 * setMaximumPoolSize with argument <= 0 throws exception
265     */
266     public void testSetMaximumPoolSize2() {
267     ForkJoinPool p = null;
268     try {
269     p = new ForkJoinPool(1);
270     p.setMaximumPoolSize(-2);
271     shouldThrow();
272 jsr166 1.2 } catch (IllegalArgumentException success) {
273 dl 1.1 } finally {
274     joinPool(p);
275     }
276     }
277    
278 jsr166 1.2 /**
279 dl 1.1 * setMaintainsParallelism changes policy reported by
280     * getMaintainsParallelism.
281     */
282     public void testSetMaintainsParallelism() {
283     ForkJoinPool p = null;
284     try {
285     p = new ForkJoinPool(1);
286     p.setMaintainsParallelism(false);
287     assertFalse(p.getMaintainsParallelism());
288     } finally {
289     joinPool(p);
290     }
291     }
292 jsr166 1.2
293     /**
294 dl 1.1 * setAsyncMode changes policy reported by
295     * getAsyncMode.
296     */
297     public void testSetAsyncMode() {
298     ForkJoinPool p = null;
299     try {
300     p = new ForkJoinPool(1);
301     p.setAsyncMode(true);
302     assertTrue(p.getAsyncMode());
303     } finally {
304     joinPool(p);
305     }
306     }
307    
308 jsr166 1.2 /**
309 dl 1.1 * setUncaughtExceptionHandler changes handler for uncaught exceptions.
310     *
311     * Additionally tests: Overriding ForkJoinWorkerThread.onStart
312     * performs its defined action
313     */
314 jsr166 1.6 public void testSetUncaughtExceptionHandler() throws InterruptedException {
315 dl 1.1 ForkJoinPool p = null;
316     try {
317     p = new ForkJoinPool(1, new FailingThreadFactory());
318     MyHandler eh = new MyHandler();
319     p.setUncaughtExceptionHandler(eh);
320     assertEquals(eh, p.getUncaughtExceptionHandler());
321     p.execute(new FailingTask());
322     Thread.sleep(MEDIUM_DELAY_MS);
323     assertTrue(eh.catches > 0);
324     } finally {
325     joinPool(p);
326     }
327     }
328    
329 jsr166 1.2 /**
330 dl 1.1 * setUncaughtExceptionHandler of null removes handler
331     */
332     public void testSetUncaughtExceptionHandler2() {
333     ForkJoinPool p = null;
334     try {
335     p = new ForkJoinPool(1);
336     p.setUncaughtExceptionHandler(null);
337     assertNull(p.getUncaughtExceptionHandler());
338     } finally {
339     joinPool(p);
340     }
341     }
342    
343    
344 jsr166 1.2 /**
345 dl 1.1 * After invoking a single task, isQuiescent is true,
346     * queues are empty, threads are not active, and
347     * construction parameters continue to hold
348     */
349 jsr166 1.6 public void testisQuiescent() throws InterruptedException {
350 dl 1.1 ForkJoinPool p = null;
351     try {
352     p = new ForkJoinPool(2);
353     p.invoke(new FibTask(20));
354 jsr166 1.6 assertTrue(p.getFactory() ==
355     ForkJoinPool.defaultForkJoinWorkerThreadFactory);
356 dl 1.1 Thread.sleep(MEDIUM_DELAY_MS);
357     assertTrue(p.isQuiescent());
358     assertTrue(p.getMaintainsParallelism());
359     assertFalse(p.getAsyncMode());
360     assertTrue(p.getActiveThreadCount() == 0);
361     assertTrue(p.getQueuedTaskCount() == 0);
362     assertTrue(p.getQueuedSubmissionCount() == 0);
363     assertFalse(p.hasQueuedSubmissions());
364     assertFalse(p.isShutdown());
365     assertFalse(p.isTerminating());
366     assertFalse(p.isTerminated());
367     } finally {
368     joinPool(p);
369     }
370     }
371    
372     /**
373     * Completed submit(ForkJoinTask) returns result
374     */
375 jsr166 1.6 public void testSubmitForkJoinTask() throws Throwable {
376 dl 1.1 ForkJoinPool p = null;
377     try {
378     p = new ForkJoinPool(1);
379     ForkJoinTask<Integer> f = p.submit(new FibTask(8));
380     int r = f.get();
381     assertTrue(r == 21);
382     } finally {
383     joinPool(p);
384     }
385     }
386    
387     /**
388     * A task submitted after shutdown is rejected
389     */
390     public void testSubmitAfterShutdown() {
391     ForkJoinPool p = null;
392     try {
393     p = new ForkJoinPool(1);
394     p.shutdown();
395     assertTrue(p.isShutdown());
396     ForkJoinTask<Integer> f = p.submit(new FibTask(8));
397     shouldThrow();
398     } catch (RejectedExecutionException success) {
399     } finally {
400     joinPool(p);
401     }
402     }
403    
404     /**
405     * Pool maintains parallelism when using ManagedBlocker
406     */
407 jsr166 1.6 public void testBlockingForkJoinTask() throws Throwable {
408 dl 1.1 ForkJoinPool p = null;
409     try {
410     p = new ForkJoinPool(4);
411     ReentrantLock lock = new ReentrantLock();
412     ManagedLocker locker = new ManagedLocker(lock);
413     ForkJoinTask<Integer> f = new LockingFibTask(30, locker, lock);
414     p.execute(f);
415     assertTrue(p.getPoolSize() >= 4);
416     int r = f.get();
417     assertTrue(r == 832040);
418     } finally {
419     joinPool(p);
420     }
421     }
422    
423     /**
424     * pollSubmission returns unexecuted submitted task, if present
425     */
426     public void testPollSubmission() {
427     SubFJP p = null;
428     try {
429     p = new SubFJP();
430     ForkJoinTask a = p.submit(new MediumRunnable());
431     ForkJoinTask b = p.submit(new MediumRunnable());
432     ForkJoinTask c = p.submit(new MediumRunnable());
433     ForkJoinTask r = p.pollSubmission();
434     assertTrue(r == a || r == b || r == c);
435     assertFalse(r.isDone());
436     } finally {
437     joinPool(p);
438     }
439     }
440    
441     /**
442     * drainTasksTo transfers unexecuted submitted tasks, if present
443     */
444     public void testDrainTasksTo() {
445     SubFJP p = null;
446     try {
447     p = new SubFJP();
448     ForkJoinTask a = p.submit(new MediumRunnable());
449     ForkJoinTask b = p.submit(new MediumRunnable());
450     ForkJoinTask c = p.submit(new MediumRunnable());
451     ArrayList<ForkJoinTask> al = new ArrayList();
452     p.drainTasksTo(al);
453     assertTrue(al.size() > 0);
454     for (ForkJoinTask r : al) {
455     assertTrue(r == a || r == b || r == c);
456     assertFalse(r.isDone());
457     }
458     } finally {
459     joinPool(p);
460     }
461     }
462    
463 jsr166 1.2
464 dl 1.1 // FJ Versions of AbstractExecutorService tests
465    
466     /**
467     * execute(runnable) runs it to completion
468     */
469 jsr166 1.6 public void testExecuteRunnable() throws Throwable {
470     ExecutorService e = new ForkJoinPool(1);
471     TrackedShortRunnable task = new TrackedShortRunnable();
472     assertFalse(task.done);
473     Future<?> future = e.submit(task);
474     future.get();
475     assertTrue(task.done);
476 dl 1.1 }
477    
478    
479     /**
480     * Completed submit(callable) returns result
481     */
482 jsr166 1.6 public void testSubmitCallable() throws Throwable {
483     ExecutorService e = new ForkJoinPool(1);
484     Future<String> future = e.submit(new StringTask());
485     String result = future.get();
486     assertSame(TEST_STRING, result);
487 dl 1.1 }
488    
489     /**
490     * Completed submit(runnable) returns successfully
491     */
492 jsr166 1.6 public void testSubmitRunnable() throws Throwable {
493     ExecutorService e = new ForkJoinPool(1);
494     Future<?> future = e.submit(new NoOpRunnable());
495     future.get();
496     assertTrue(future.isDone());
497 dl 1.1 }
498    
499     /**
500     * Completed submit(runnable, result) returns result
501     */
502 jsr166 1.6 public void testSubmitRunnable2() throws Throwable {
503     ExecutorService e = new ForkJoinPool(1);
504     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
505     String result = future.get();
506     assertSame(TEST_STRING, result);
507 dl 1.1 }
508    
509    
510     /**
511     * A submitted privileged action to completion
512     */
513 jsr166 1.6 public void testSubmitPrivilegedAction() throws Throwable {
514 dl 1.1 Policy savedPolicy = null;
515     try {
516     savedPolicy = Policy.getPolicy();
517     AdjustablePolicy policy = new AdjustablePolicy();
518     policy.addPermission(new RuntimePermission("getContextClassLoader"));
519     policy.addPermission(new RuntimePermission("setContextClassLoader"));
520     Policy.setPolicy(policy);
521 jsr166 1.2 } catch (AccessControlException ok) {
522 dl 1.1 return;
523     }
524     try {
525     ExecutorService e = new ForkJoinPool(1);
526     Future future = e.submit(Executors.callable(new PrivilegedAction() {
527     public Object run() {
528     return TEST_STRING;
529     }}));
530    
531     Object result = future.get();
532     assertSame(TEST_STRING, result);
533     }
534     finally {
535 jsr166 1.6 Policy.setPolicy(savedPolicy);
536 dl 1.1 }
537     }
538    
539     /**
540     * A submitted a privileged exception action runs to completion
541     */
542 jsr166 1.6 public void testSubmitPrivilegedExceptionAction() throws Throwable {
543 dl 1.1 Policy savedPolicy = null;
544     try {
545     savedPolicy = Policy.getPolicy();
546     AdjustablePolicy policy = new AdjustablePolicy();
547     policy.addPermission(new RuntimePermission("getContextClassLoader"));
548     policy.addPermission(new RuntimePermission("setContextClassLoader"));
549     Policy.setPolicy(policy);
550 jsr166 1.2 } catch (AccessControlException ok) {
551 dl 1.1 return;
552     }
553    
554     try {
555     ExecutorService e = new ForkJoinPool(1);
556     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
557     public Object run() {
558     return TEST_STRING;
559     }}));
560    
561     Object result = future.get();
562     assertSame(TEST_STRING, result);
563     }
564     finally {
565     Policy.setPolicy(savedPolicy);
566     }
567     }
568    
569     /**
570     * A submitted failed privileged exception action reports exception
571     */
572 jsr166 1.6 public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
573 dl 1.1 Policy savedPolicy = null;
574     try {
575     savedPolicy = Policy.getPolicy();
576     AdjustablePolicy policy = new AdjustablePolicy();
577     policy.addPermission(new RuntimePermission("getContextClassLoader"));
578     policy.addPermission(new RuntimePermission("setContextClassLoader"));
579     Policy.setPolicy(policy);
580 jsr166 1.2 } catch (AccessControlException ok) {
581 dl 1.1 return;
582     }
583    
584    
585     try {
586     ExecutorService e = new ForkJoinPool(1);
587     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
588     public Object run() throws Exception {
589     throw new IndexOutOfBoundsException();
590     }}));
591    
592     Object result = future.get();
593     shouldThrow();
594 jsr166 1.6 } catch (ExecutionException success) {
595     } finally {
596 dl 1.1 Policy.setPolicy(savedPolicy);
597     }
598     }
599    
600     /**
601 jsr166 1.6 * execute(null runnable) throws NullPointerException
602 dl 1.1 */
603     public void testExecuteNullRunnable() {
604     try {
605     ExecutorService e = new ForkJoinPool(1);
606     TrackedShortRunnable task = null;
607     Future<?> future = e.submit(task);
608     shouldThrow();
609 jsr166 1.6 } catch (NullPointerException success) {
610 dl 1.1 }
611     }
612    
613    
614     /**
615 jsr166 1.6 * submit(null callable) throws NullPointerException
616 dl 1.1 */
617     public void testSubmitNullCallable() {
618     try {
619     ExecutorService e = new ForkJoinPool(1);
620     StringTask t = null;
621     Future<String> future = e.submit(t);
622     shouldThrow();
623 jsr166 1.6 } catch (NullPointerException success) {
624 dl 1.1 }
625     }
626    
627    
628     /**
629 jsr166 1.4 * Blocking on submit(callable) throws InterruptedException if
630     * caller interrupted.
631 dl 1.1 */
632 jsr166 1.6 public void testInterruptedSubmit() throws InterruptedException {
633 dl 1.1 final ForkJoinPool p = new ForkJoinPool(1);
634    
635 jsr166 1.6 Thread t = new Thread(new CheckedInterruptedRunnable() {
636     void realRun() throws Throwable {
637     p.submit(new CheckedCallable<Object>() {
638     public Object realCall() throws Throwable {
639     Thread.sleep(MEDIUM_DELAY_MS);
640     return null;
641     }}).get();
642     }});
643    
644     t.start();
645     Thread.sleep(SHORT_DELAY_MS);
646     t.interrupt();
647 dl 1.1 joinPool(p);
648     }
649    
650     /**
651 jsr166 1.4 * get of submit(callable) throws ExecutionException if callable
652     * throws exception
653 dl 1.1 */
654 jsr166 1.6 public void testSubmitEE() throws Throwable {
655 dl 1.1 ForkJoinPool p = new ForkJoinPool(1);
656    
657     try {
658     Callable c = new Callable() {
659     public Object call() {
660     int i = 5/0;
661     return Boolean.TRUE;
662     }
663     };
664    
665 jsr166 1.2 for (int i = 0; i < 5; i++) {
666 dl 1.1 p.submit(c).get();
667     }
668     shouldThrow();
669 jsr166 1.2 } catch (ExecutionException success) {
670 dl 1.1 }
671     joinPool(p);
672     }
673    
674     /**
675 jsr166 1.6 * invokeAny(null) throws NullPointerException
676 dl 1.1 */
677 jsr166 1.6 public void testInvokeAny1() throws Throwable {
678 dl 1.1 ExecutorService e = new ForkJoinPool(1);
679     try {
680     e.invokeAny(null);
681 jsr166 1.6 shouldThrow();
682 dl 1.1 } catch (NullPointerException success) {
683     } finally {
684     joinPool(e);
685     }
686     }
687    
688     /**
689 jsr166 1.6 * invokeAny(empty collection) throws IllegalArgumentException
690 dl 1.1 */
691 jsr166 1.6 public void testInvokeAny2() throws Throwable {
692 dl 1.1 ExecutorService e = new ForkJoinPool(1);
693     try {
694     e.invokeAny(new ArrayList<Callable<String>>());
695 jsr166 1.6 shouldThrow();
696 dl 1.1 } catch (IllegalArgumentException success) {
697     } finally {
698     joinPool(e);
699     }
700     }
701    
702     /**
703 jsr166 1.6 * invokeAny(c) throws NullPointerException if c has null elements
704 dl 1.1 */
705 jsr166 1.6 public void testInvokeAny3() throws Throwable {
706 dl 1.1 ExecutorService e = new ForkJoinPool(1);
707     try {
708     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
709     l.add(new StringTask());
710     l.add(null);
711     e.invokeAny(l);
712 jsr166 1.6 shouldThrow();
713 dl 1.1 } catch (NullPointerException success) {
714     } finally {
715     joinPool(e);
716     }
717     }
718    
719     /**
720     * invokeAny(c) throws ExecutionException if no task in c completes
721     */
722 jsr166 1.6 public void testInvokeAny4() throws Throwable {
723 dl 1.1 ExecutorService e = new ForkJoinPool(1);
724     try {
725     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
726     l.add(new NPETask());
727     e.invokeAny(l);
728 jsr166 1.6 shouldThrow();
729 jsr166 1.2 } catch (ExecutionException success) {
730 dl 1.1 } finally {
731     joinPool(e);
732     }
733     }
734    
735     /**
736     * invokeAny(c) returns result of some task in c if at least one completes
737     */
738 jsr166 1.6 public void testInvokeAny5() throws Throwable {
739 dl 1.1 ExecutorService e = new ForkJoinPool(1);
740     try {
741     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
742     l.add(new StringTask());
743     l.add(new StringTask());
744     String result = e.invokeAny(l);
745     assertSame(TEST_STRING, result);
746     } finally {
747     joinPool(e);
748     }
749     }
750    
751     /**
752 jsr166 1.6 * invokeAll(null) throws NullPointerException
753 dl 1.1 */
754 jsr166 1.6 public void testInvokeAll1() throws Throwable {
755 dl 1.1 ExecutorService e = new ForkJoinPool(1);
756     try {
757     e.invokeAll(null);
758 jsr166 1.6 shouldThrow();
759 dl 1.1 } catch (NullPointerException success) {
760     } finally {
761     joinPool(e);
762     }
763     }
764    
765     /**
766     * invokeAll(empty collection) returns empty collection
767     */
768 jsr166 1.6 public void testInvokeAll2() throws InterruptedException {
769 dl 1.1 ExecutorService e = new ForkJoinPool(1);
770     try {
771 jsr166 1.6 List<Future<String>> r
772     = e.invokeAll(new ArrayList<Callable<String>>());
773 dl 1.1 assertTrue(r.isEmpty());
774     } finally {
775     joinPool(e);
776     }
777     }
778    
779     /**
780 jsr166 1.6 * invokeAll(c) throws NullPointerException if c has null elements
781 dl 1.1 */
782 jsr166 1.6 public void testInvokeAll3() throws InterruptedException {
783 dl 1.1 ExecutorService e = new ForkJoinPool(1);
784     try {
785     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
786     l.add(new StringTask());
787     l.add(null);
788     e.invokeAll(l);
789 jsr166 1.6 shouldThrow();
790 dl 1.1 } catch (NullPointerException success) {
791     } finally {
792     joinPool(e);
793     }
794     }
795    
796     /**
797 jsr166 1.6 * get of returned element of invokeAll(c) throws
798     * ExecutionException on failed task
799 dl 1.1 */
800 jsr166 1.6 public void testInvokeAll4() throws Throwable {
801 dl 1.1 ExecutorService e = new ForkJoinPool(1);
802     try {
803     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
804     l.add(new NPETask());
805     List<Future<String>> result = e.invokeAll(l);
806     assertEquals(1, result.size());
807 jsr166 1.6 for (Future<String> future : result)
808     future.get();
809     shouldThrow();
810 jsr166 1.2 } catch (ExecutionException success) {
811 dl 1.1 } finally {
812     joinPool(e);
813     }
814     }
815    
816     /**
817     * invokeAll(c) returns results of all completed tasks in c
818     */
819 jsr166 1.6 public void testInvokeAll5() throws Throwable {
820 dl 1.1 ExecutorService e = new ForkJoinPool(1);
821     try {
822     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
823     l.add(new StringTask());
824     l.add(new StringTask());
825     List<Future<String>> result = e.invokeAll(l);
826     assertEquals(2, result.size());
827 jsr166 1.6 for (Future<String> future : result)
828     assertSame(TEST_STRING, future.get());
829 dl 1.1 } finally {
830     joinPool(e);
831     }
832     }
833    
834    
835     /**
836 jsr166 1.6 * timed invokeAny(null) throws NullPointerException
837 dl 1.1 */
838 jsr166 1.6 public void testTimedInvokeAny1() throws Throwable {
839 dl 1.1 ExecutorService e = new ForkJoinPool(1);
840     try {
841 jsr166 1.6 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
842     shouldThrow();
843 dl 1.1 } catch (NullPointerException success) {
844     } finally {
845     joinPool(e);
846     }
847     }
848    
849     /**
850 jsr166 1.6 * timed invokeAny(null time unit) throws NullPointerException
851 dl 1.1 */
852 jsr166 1.6 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
853 dl 1.1 ExecutorService e = new ForkJoinPool(1);
854     try {
855     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
856     l.add(new StringTask());
857     e.invokeAny(l, MEDIUM_DELAY_MS, null);
858 jsr166 1.6 shouldThrow();
859 dl 1.1 } catch (NullPointerException success) {
860     } finally {
861     joinPool(e);
862     }
863     }
864    
865     /**
866 jsr166 1.6 * timed invokeAny(empty collection) throws IllegalArgumentException
867 dl 1.1 */
868 jsr166 1.6 public void testTimedInvokeAny2() throws Throwable {
869 dl 1.1 ExecutorService e = new ForkJoinPool(1);
870     try {
871 jsr166 1.6 e.invokeAny(new ArrayList<Callable<String>>(),
872     MEDIUM_DELAY_MS, MILLISECONDS);
873     shouldThrow();
874 dl 1.1 } catch (IllegalArgumentException success) {
875     } finally {
876     joinPool(e);
877     }
878     }
879    
880     /**
881 jsr166 1.6 * timed invokeAny(c) throws NullPointerException if c has null elements
882 dl 1.1 */
883 jsr166 1.6 public void testTimedInvokeAny3() throws Throwable {
884 dl 1.1 ExecutorService e = new ForkJoinPool(1);
885     try {
886     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
887     l.add(new StringTask());
888     l.add(null);
889 jsr166 1.6 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
890     shouldThrow();
891 dl 1.1 } catch (NullPointerException success) {
892     } finally {
893     joinPool(e);
894     }
895     }
896    
897     /**
898     * timed invokeAny(c) throws ExecutionException if no task completes
899     */
900 jsr166 1.6 public void testTimedInvokeAny4() throws Throwable {
901 dl 1.1 ExecutorService e = new ForkJoinPool(1);
902     try {
903     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
904     l.add(new NPETask());
905 jsr166 1.6 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
906     shouldThrow();
907 jsr166 1.2 } catch (ExecutionException success) {
908 dl 1.1 } finally {
909     joinPool(e);
910     }
911     }
912    
913     /**
914     * timed invokeAny(c) returns result of some task in c
915     */
916 jsr166 1.6 public void testTimedInvokeAny5() throws Throwable {
917 dl 1.1 ExecutorService e = new ForkJoinPool(1);
918     try {
919     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
920     l.add(new StringTask());
921     l.add(new StringTask());
922 jsr166 1.6 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
923 dl 1.1 assertSame(TEST_STRING, result);
924     } finally {
925     joinPool(e);
926     }
927     }
928    
929     /**
930 jsr166 1.6 * timed invokeAll(null) throws NullPointerException
931 dl 1.1 */
932 jsr166 1.6 public void testTimedInvokeAll1() throws Throwable {
933 dl 1.1 ExecutorService e = new ForkJoinPool(1);
934     try {
935 jsr166 1.6 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
936     shouldThrow();
937 dl 1.1 } catch (NullPointerException success) {
938     } finally {
939     joinPool(e);
940     }
941     }
942    
943     /**
944 jsr166 1.6 * timed invokeAll(null time unit) throws NullPointerException
945 dl 1.1 */
946 jsr166 1.6 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
947 dl 1.1 ExecutorService e = new ForkJoinPool(1);
948     try {
949     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
950     l.add(new StringTask());
951     e.invokeAll(l, MEDIUM_DELAY_MS, null);
952 jsr166 1.6 shouldThrow();
953 dl 1.1 } catch (NullPointerException success) {
954     } finally {
955     joinPool(e);
956     }
957     }
958    
959     /**
960     * timed invokeAll(empty collection) returns empty collection
961     */
962 jsr166 1.6 public void testTimedInvokeAll2() throws InterruptedException {
963 dl 1.1 ExecutorService e = new ForkJoinPool(1);
964     try {
965 jsr166 1.6 List<Future<String>> r
966     = e.invokeAll(new ArrayList<Callable<String>>(),
967     MEDIUM_DELAY_MS, MILLISECONDS);
968 dl 1.1 assertTrue(r.isEmpty());
969     } finally {
970     joinPool(e);
971     }
972     }
973    
974     /**
975 jsr166 1.6 * timed invokeAll(c) throws NullPointerException if c has null elements
976 dl 1.1 */
977 jsr166 1.6 public void testTimedInvokeAll3() throws InterruptedException {
978 dl 1.1 ExecutorService e = new ForkJoinPool(1);
979     try {
980     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
981     l.add(new StringTask());
982     l.add(null);
983 jsr166 1.6 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
984     shouldThrow();
985 dl 1.1 } catch (NullPointerException success) {
986     } finally {
987     joinPool(e);
988     }
989     }
990    
991     /**
992     * get of returned element of invokeAll(c) throws exception on failed task
993     */
994 jsr166 1.6 public void testTimedInvokeAll4() throws Throwable {
995 dl 1.1 ExecutorService e = new ForkJoinPool(1);
996     try {
997     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
998     l.add(new NPETask());
999 jsr166 1.6 List<Future<String>> result
1000     = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1001 dl 1.1 assertEquals(1, result.size());
1002 jsr166 1.6 for (Future<String> future : result)
1003     future.get();
1004     shouldThrow();
1005 jsr166 1.2 } catch (ExecutionException success) {
1006 dl 1.1 } finally {
1007     joinPool(e);
1008     }
1009     }
1010    
1011     /**
1012     * timed invokeAll(c) returns results of all completed tasks in c
1013     */
1014 jsr166 1.6 public void testTimedInvokeAll5() throws Throwable {
1015 dl 1.1 ExecutorService e = new ForkJoinPool(1);
1016     try {
1017     ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1018     l.add(new StringTask());
1019     l.add(new StringTask());
1020 jsr166 1.6 List<Future<String>> result
1021     = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1022 dl 1.1 assertEquals(2, result.size());
1023 jsr166 1.6 for (Future<String> future : result)
1024     assertSame(TEST_STRING, future.get());
1025 dl 1.1 } finally {
1026     joinPool(e);
1027     }
1028     }
1029    
1030     }