ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.44
Committed: Tue Jan 10 13:48:27 2012 UTC (12 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.43: +5 -2 lines
Log Message:
Allow either outcome in UncaughtExceptionHandler vs RejectedExecution race

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     assertTrue(uehInvoked.await(10000, MILLISECONDS));
248     } catch(RejectedExecutionException ok) {
249     }
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     public Object call() {
579     int i = 5/0;
580     return Boolean.TRUE;
581     }}).get();
582 dl 1.1 shouldThrow();
583 jsr166 1.12 } catch (ExecutionException success) {
584     assertTrue(success.getCause() instanceof ArithmeticException);
585 jsr166 1.23 } finally {
586     joinPool(p);
587 jsr166 1.12 }
588 dl 1.1 }
589    
590     /**
591 jsr166 1.6 * invokeAny(null) throws NullPointerException
592 dl 1.1 */
593 jsr166 1.6 public void testInvokeAny1() throws Throwable {
594 dl 1.1 ExecutorService e = new ForkJoinPool(1);
595     try {
596     e.invokeAny(null);
597 jsr166 1.6 shouldThrow();
598 dl 1.1 } catch (NullPointerException success) {
599     } finally {
600     joinPool(e);
601     }
602     }
603    
604     /**
605 jsr166 1.6 * invokeAny(empty collection) throws IllegalArgumentException
606 dl 1.1 */
607 jsr166 1.6 public void testInvokeAny2() throws Throwable {
608 dl 1.1 ExecutorService e = new ForkJoinPool(1);
609     try {
610     e.invokeAny(new ArrayList<Callable<String>>());
611 jsr166 1.6 shouldThrow();
612 dl 1.1 } catch (IllegalArgumentException success) {
613     } finally {
614     joinPool(e);
615     }
616     }
617    
618     /**
619 jsr166 1.9 * invokeAny(c) throws NullPointerException if c has a single null element
620     */
621     public void testInvokeAny3() throws Throwable {
622     ExecutorService e = new ForkJoinPool(1);
623 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
624     l.add(null);
625 jsr166 1.9 try {
626     e.invokeAny(l);
627     shouldThrow();
628     } catch (NullPointerException success) {
629     } finally {
630     joinPool(e);
631     }
632     }
633    
634     /**
635 jsr166 1.6 * invokeAny(c) throws NullPointerException if c has null elements
636 dl 1.1 */
637 jsr166 1.9 public void testInvokeAny4() throws Throwable {
638 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
639 dl 1.1 ExecutorService e = new ForkJoinPool(1);
640 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
641     l.add(latchAwaitingStringTask(latch));
642     l.add(null);
643 dl 1.1 try {
644     e.invokeAny(l);
645 jsr166 1.6 shouldThrow();
646 dl 1.1 } catch (NullPointerException success) {
647     } finally {
648 jsr166 1.16 latch.countDown();
649 dl 1.1 joinPool(e);
650     }
651     }
652    
653     /**
654     * invokeAny(c) throws ExecutionException if no task in c completes
655     */
656 jsr166 1.9 public void testInvokeAny5() throws Throwable {
657 dl 1.1 ExecutorService e = new ForkJoinPool(1);
658 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
659     l.add(new NPETask());
660 dl 1.1 try {
661     e.invokeAny(l);
662 jsr166 1.6 shouldThrow();
663 jsr166 1.2 } catch (ExecutionException success) {
664 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
665 dl 1.1 } finally {
666     joinPool(e);
667     }
668     }
669    
670     /**
671     * invokeAny(c) returns result of some task in c if at least one completes
672     */
673 jsr166 1.9 public void testInvokeAny6() throws Throwable {
674 dl 1.1 ExecutorService e = new ForkJoinPool(1);
675     try {
676 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
677 dl 1.1 l.add(new StringTask());
678     l.add(new StringTask());
679     String result = e.invokeAny(l);
680     assertSame(TEST_STRING, result);
681     } finally {
682     joinPool(e);
683     }
684     }
685    
686     /**
687 jsr166 1.6 * invokeAll(null) throws NullPointerException
688 dl 1.1 */
689 jsr166 1.6 public void testInvokeAll1() throws Throwable {
690 dl 1.1 ExecutorService e = new ForkJoinPool(1);
691     try {
692     e.invokeAll(null);
693 jsr166 1.6 shouldThrow();
694 dl 1.1 } catch (NullPointerException success) {
695     } finally {
696     joinPool(e);
697     }
698     }
699    
700     /**
701     * invokeAll(empty collection) returns empty collection
702     */
703 jsr166 1.6 public void testInvokeAll2() throws InterruptedException {
704 dl 1.1 ExecutorService e = new ForkJoinPool(1);
705     try {
706 jsr166 1.6 List<Future<String>> r
707     = e.invokeAll(new ArrayList<Callable<String>>());
708 dl 1.1 assertTrue(r.isEmpty());
709     } finally {
710     joinPool(e);
711     }
712     }
713    
714     /**
715 jsr166 1.6 * invokeAll(c) throws NullPointerException if c has null elements
716 dl 1.1 */
717 jsr166 1.6 public void testInvokeAll3() throws InterruptedException {
718 dl 1.1 ExecutorService e = new ForkJoinPool(1);
719 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
720     l.add(new StringTask());
721     l.add(null);
722 dl 1.1 try {
723     e.invokeAll(l);
724 jsr166 1.6 shouldThrow();
725 dl 1.1 } catch (NullPointerException success) {
726     } finally {
727     joinPool(e);
728     }
729     }
730    
731     /**
732 jsr166 1.6 * get of returned element of invokeAll(c) throws
733     * ExecutionException on failed task
734 dl 1.1 */
735 jsr166 1.6 public void testInvokeAll4() throws Throwable {
736 dl 1.1 ExecutorService e = new ForkJoinPool(1);
737 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
738     l.add(new NPETask());
739     List<Future<String>> futures = e.invokeAll(l);
740     assertEquals(1, futures.size());
741 dl 1.1 try {
742 jsr166 1.16 futures.get(0).get();
743 jsr166 1.6 shouldThrow();
744 jsr166 1.2 } catch (ExecutionException success) {
745 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
746 dl 1.1 } finally {
747     joinPool(e);
748     }
749     }
750    
751     /**
752     * invokeAll(c) returns results of all completed tasks in c
753     */
754 jsr166 1.6 public void testInvokeAll5() throws Throwable {
755 dl 1.1 ExecutorService e = new ForkJoinPool(1);
756     try {
757 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
758 dl 1.1 l.add(new StringTask());
759     l.add(new StringTask());
760 jsr166 1.16 List<Future<String>> futures = e.invokeAll(l);
761     assertEquals(2, futures.size());
762     for (Future<String> future : futures)
763 jsr166 1.6 assertSame(TEST_STRING, future.get());
764 dl 1.1 } finally {
765     joinPool(e);
766     }
767     }
768    
769     /**
770 jsr166 1.6 * timed invokeAny(null) throws NullPointerException
771 dl 1.1 */
772 jsr166 1.6 public void testTimedInvokeAny1() throws Throwable {
773 dl 1.1 ExecutorService e = new ForkJoinPool(1);
774     try {
775 jsr166 1.27 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
776 jsr166 1.6 shouldThrow();
777 dl 1.1 } catch (NullPointerException success) {
778     } finally {
779     joinPool(e);
780     }
781     }
782    
783     /**
784 jsr166 1.6 * timed invokeAny(null time unit) throws NullPointerException
785 dl 1.1 */
786 jsr166 1.6 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
787 dl 1.1 ExecutorService e = new ForkJoinPool(1);
788 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
789     l.add(new StringTask());
790 dl 1.1 try {
791     e.invokeAny(l, MEDIUM_DELAY_MS, null);
792 jsr166 1.6 shouldThrow();
793 dl 1.1 } catch (NullPointerException success) {
794     } finally {
795     joinPool(e);
796     }
797     }
798    
799     /**
800 jsr166 1.6 * timed invokeAny(empty collection) throws IllegalArgumentException
801 dl 1.1 */
802 jsr166 1.6 public void testTimedInvokeAny2() throws Throwable {
803 dl 1.1 ExecutorService e = new ForkJoinPool(1);
804     try {
805 jsr166 1.6 e.invokeAny(new ArrayList<Callable<String>>(),
806 jsr166 1.27 MEDIUM_DELAY_MS, MILLISECONDS);
807 jsr166 1.6 shouldThrow();
808 dl 1.1 } catch (IllegalArgumentException success) {
809     } finally {
810     joinPool(e);
811     }
812     }
813    
814     /**
815 jsr166 1.6 * timed invokeAny(c) throws NullPointerException if c has null elements
816 dl 1.1 */
817 jsr166 1.6 public void testTimedInvokeAny3() throws Throwable {
818 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
819 dl 1.1 ExecutorService e = new ForkJoinPool(1);
820 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
821     l.add(latchAwaitingStringTask(latch));
822     l.add(null);
823 dl 1.1 try {
824 jsr166 1.27 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
825 jsr166 1.6 shouldThrow();
826 dl 1.1 } catch (NullPointerException success) {
827     } finally {
828 jsr166 1.15 latch.countDown();
829 dl 1.1 joinPool(e);
830     }
831     }
832    
833     /**
834     * timed invokeAny(c) throws ExecutionException if no task completes
835     */
836 jsr166 1.6 public void testTimedInvokeAny4() throws Throwable {
837 dl 1.1 ExecutorService e = new ForkJoinPool(1);
838 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
839     l.add(new NPETask());
840 dl 1.1 try {
841 jsr166 1.27 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
842 jsr166 1.6 shouldThrow();
843 jsr166 1.2 } catch (ExecutionException success) {
844 jsr166 1.11 assertTrue(success.getCause() instanceof NullPointerException);
845 dl 1.1 } finally {
846     joinPool(e);
847     }
848     }
849    
850     /**
851     * timed invokeAny(c) returns result of some task in c
852     */
853 jsr166 1.6 public void testTimedInvokeAny5() throws Throwable {
854 dl 1.1 ExecutorService e = new ForkJoinPool(1);
855     try {
856 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
857 dl 1.1 l.add(new StringTask());
858     l.add(new StringTask());
859 jsr166 1.27 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
860 dl 1.1 assertSame(TEST_STRING, result);
861     } finally {
862     joinPool(e);
863     }
864     }
865    
866     /**
867 jsr166 1.6 * timed invokeAll(null) throws NullPointerException
868 dl 1.1 */
869 jsr166 1.6 public void testTimedInvokeAll1() throws Throwable {
870 dl 1.1 ExecutorService e = new ForkJoinPool(1);
871     try {
872 jsr166 1.27 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
873 jsr166 1.6 shouldThrow();
874 dl 1.1 } catch (NullPointerException success) {
875     } finally {
876     joinPool(e);
877     }
878     }
879    
880     /**
881 jsr166 1.6 * timed invokeAll(null time unit) throws NullPointerException
882 dl 1.1 */
883 jsr166 1.6 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
884 dl 1.1 ExecutorService e = new ForkJoinPool(1);
885 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
886     l.add(new StringTask());
887 dl 1.1 try {
888     e.invokeAll(l, MEDIUM_DELAY_MS, null);
889 jsr166 1.6 shouldThrow();
890 dl 1.1 } catch (NullPointerException success) {
891     } finally {
892     joinPool(e);
893     }
894     }
895    
896     /**
897     * timed invokeAll(empty collection) returns empty collection
898     */
899 jsr166 1.6 public void testTimedInvokeAll2() throws InterruptedException {
900 dl 1.1 ExecutorService e = new ForkJoinPool(1);
901     try {
902 jsr166 1.6 List<Future<String>> r
903     = e.invokeAll(new ArrayList<Callable<String>>(),
904 jsr166 1.27 MEDIUM_DELAY_MS, MILLISECONDS);
905 dl 1.1 assertTrue(r.isEmpty());
906     } finally {
907     joinPool(e);
908     }
909     }
910    
911     /**
912 jsr166 1.6 * timed invokeAll(c) throws NullPointerException if c has null elements
913 dl 1.1 */
914 jsr166 1.6 public void testTimedInvokeAll3() throws InterruptedException {
915 dl 1.1 ExecutorService e = new ForkJoinPool(1);
916 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
917     l.add(new StringTask());
918     l.add(null);
919 dl 1.1 try {
920 jsr166 1.27 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
921 jsr166 1.6 shouldThrow();
922 dl 1.1 } catch (NullPointerException success) {
923     } finally {
924     joinPool(e);
925     }
926     }
927    
928     /**
929     * get of returned element of invokeAll(c) throws exception on failed task
930     */
931 jsr166 1.6 public void testTimedInvokeAll4() throws Throwable {
932 dl 1.1 ExecutorService e = new ForkJoinPool(1);
933 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
934     l.add(new NPETask());
935     List<Future<String>> futures
936 jsr166 1.27 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
937 jsr166 1.16 assertEquals(1, futures.size());
938 dl 1.1 try {
939 jsr166 1.16 futures.get(0).get();
940 jsr166 1.6 shouldThrow();
941 jsr166 1.2 } catch (ExecutionException success) {
942 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
943 dl 1.1 } finally {
944     joinPool(e);
945     }
946     }
947    
948     /**
949     * timed invokeAll(c) returns results of all completed tasks in c
950     */
951 jsr166 1.6 public void testTimedInvokeAll5() throws Throwable {
952 dl 1.1 ExecutorService e = new ForkJoinPool(1);
953     try {
954 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
955 dl 1.1 l.add(new StringTask());
956     l.add(new StringTask());
957 jsr166 1.16 List<Future<String>> futures
958 jsr166 1.27 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
959 jsr166 1.16 assertEquals(2, futures.size());
960     for (Future<String> future : futures)
961 jsr166 1.6 assertSame(TEST_STRING, future.get());
962 dl 1.1 } finally {
963     joinPool(e);
964     }
965     }
966    
967     }