ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.47
Committed: Mon Jan 14 22:05:39 2013 UTC (11 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.46: +2 -4 lines
Log Message:
remove all javac [divzero] warnings

File Contents

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