ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.28
Committed: Fri Sep 17 14:19:52 2010 UTC (13 years, 8 months ago) by dl
Branch: MAIN
Changes since 1.27: +1 -1 lines
Log Message:
testSetUncaughtExceptionHandler needs shutdownNow

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