ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.30
Committed: Fri Sep 17 17:07:47 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.29: +2 -1 lines
Log Message:
testisQuiescent: use SMALL delay

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.29 final CountDownLatch uehInvoked = new CountDownLatch(1);
237 jsr166 1.27 final Thread.UncaughtExceptionHandler eh =
238     new Thread.UncaughtExceptionHandler() {
239     public void uncaughtException(Thread t, Throwable e) {
240 jsr166 1.29 uehInvoked.countDown();
241 jsr166 1.27 }};
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 jsr166 1.29 p.execute(new FibTask(8));
247     assertTrue(uehInvoked.await(MEDIUM_DELAY_MS, MILLISECONDS));
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 jsr166 1.30 assertTrue(p.isQuiescent());
263 dl 1.1 p.invoke(new FibTask(20));
264 jsr166 1.26 assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory,
265     p.getFactory());
266 jsr166 1.30 Thread.sleep(SMALL_DELAY_MS);
267 dl 1.1 assertTrue(p.isQuiescent());
268     assertFalse(p.getAsyncMode());
269 jsr166 1.26 assertEquals(0, p.getActiveThreadCount());
270     assertEquals(0, p.getQueuedTaskCount());
271     assertEquals(0, p.getQueuedSubmissionCount());
272 dl 1.1 assertFalse(p.hasQueuedSubmissions());
273     assertFalse(p.isShutdown());
274     assertFalse(p.isTerminating());
275     assertFalse(p.isTerminated());
276     } finally {
277     joinPool(p);
278     }
279     }
280    
281     /**
282     * Completed submit(ForkJoinTask) returns result
283     */
284 jsr166 1.6 public void testSubmitForkJoinTask() throws Throwable {
285 jsr166 1.23 ForkJoinPool p = new ForkJoinPool(1);
286 dl 1.1 try {
287     ForkJoinTask<Integer> f = p.submit(new FibTask(8));
288 jsr166 1.26 assertEquals(21, (int) f.get());
289 dl 1.1 } finally {
290     joinPool(p);
291     }
292     }
293    
294     /**
295     * A task submitted after shutdown is rejected
296     */
297     public void testSubmitAfterShutdown() {
298 jsr166 1.23 ForkJoinPool p = new ForkJoinPool(1);
299 dl 1.1 try {
300     p.shutdown();
301     assertTrue(p.isShutdown());
302 jsr166 1.26 try {
303     ForkJoinTask<Integer> f = p.submit(new FibTask(8));
304     shouldThrow();
305     } catch (RejectedExecutionException success) {}
306 dl 1.1 } finally {
307     joinPool(p);
308     }
309     }
310    
311     /**
312     * Pool maintains parallelism when using ManagedBlocker
313     */
314 jsr166 1.6 public void testBlockingForkJoinTask() throws Throwable {
315 jsr166 1.23 ForkJoinPool p = new ForkJoinPool(4);
316 dl 1.1 try {
317     ReentrantLock lock = new ReentrantLock();
318     ManagedLocker locker = new ManagedLocker(lock);
319     ForkJoinTask<Integer> f = new LockingFibTask(30, locker, lock);
320     p.execute(f);
321 jsr166 1.26 assertEquals(832040, (int) f.get());
322 dl 1.1 } finally {
323 dl 1.7 p.shutdownNow(); // don't wait out shutdown
324 dl 1.1 }
325     }
326    
327     /**
328     * pollSubmission returns unexecuted submitted task, if present
329     */
330     public void testPollSubmission() {
331 jsr166 1.23 SubFJP p = new SubFJP();
332 dl 1.1 try {
333     ForkJoinTask a = p.submit(new MediumRunnable());
334     ForkJoinTask b = p.submit(new MediumRunnable());
335     ForkJoinTask c = p.submit(new MediumRunnable());
336     ForkJoinTask r = p.pollSubmission();
337     assertTrue(r == a || r == b || r == c);
338     assertFalse(r.isDone());
339     } finally {
340     joinPool(p);
341     }
342     }
343    
344     /**
345     * drainTasksTo transfers unexecuted submitted tasks, if present
346     */
347     public void testDrainTasksTo() {
348 jsr166 1.23 SubFJP p = new SubFJP();
349 dl 1.1 try {
350     ForkJoinTask a = p.submit(new MediumRunnable());
351     ForkJoinTask b = p.submit(new MediumRunnable());
352     ForkJoinTask c = p.submit(new MediumRunnable());
353     ArrayList<ForkJoinTask> al = new ArrayList();
354     p.drainTasksTo(al);
355     assertTrue(al.size() > 0);
356     for (ForkJoinTask r : al) {
357     assertTrue(r == a || r == b || r == c);
358     assertFalse(r.isDone());
359     }
360     } finally {
361     joinPool(p);
362     }
363     }
364    
365 jsr166 1.2
366 dl 1.1 // FJ Versions of AbstractExecutorService tests
367    
368     /**
369     * execute(runnable) runs it to completion
370     */
371 jsr166 1.6 public void testExecuteRunnable() throws Throwable {
372     ExecutorService e = new ForkJoinPool(1);
373 jsr166 1.23 try {
374     TrackedShortRunnable task = new TrackedShortRunnable();
375     assertFalse(task.done);
376     Future<?> future = e.submit(task);
377     future.get();
378     assertTrue(task.done);
379     } finally {
380     joinPool(e);
381     }
382 dl 1.1 }
383    
384    
385     /**
386     * Completed submit(callable) returns result
387     */
388 jsr166 1.6 public void testSubmitCallable() throws Throwable {
389     ExecutorService e = new ForkJoinPool(1);
390 jsr166 1.23 try {
391     Future<String> future = e.submit(new StringTask());
392     String result = future.get();
393     assertSame(TEST_STRING, result);
394     } finally {
395     joinPool(e);
396     }
397 dl 1.1 }
398    
399     /**
400     * Completed submit(runnable) returns successfully
401     */
402 jsr166 1.6 public void testSubmitRunnable() throws Throwable {
403     ExecutorService e = new ForkJoinPool(1);
404 jsr166 1.23 try {
405     Future<?> future = e.submit(new NoOpRunnable());
406     future.get();
407     assertTrue(future.isDone());
408     } finally {
409     joinPool(e);
410     }
411 dl 1.1 }
412    
413     /**
414     * Completed submit(runnable, result) returns result
415     */
416 jsr166 1.6 public void testSubmitRunnable2() throws Throwable {
417     ExecutorService e = new ForkJoinPool(1);
418 jsr166 1.23 try {
419     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
420     String result = future.get();
421     assertSame(TEST_STRING, result);
422     } finally {
423     joinPool(e);
424     }
425 dl 1.1 }
426    
427 dl 1.20
428 dl 1.1 /**
429 dl 1.20 * A submitted privileged action to completion
430 dl 1.1 */
431 jsr166 1.6 public void testSubmitPrivilegedAction() throws Throwable {
432 dl 1.20 Policy savedPolicy = null;
433     try {
434     savedPolicy = Policy.getPolicy();
435     AdjustablePolicy policy = new AdjustablePolicy();
436     policy.addPermission(new RuntimePermission("getContextClassLoader"));
437     policy.addPermission(new RuntimePermission("setContextClassLoader"));
438     Policy.setPolicy(policy);
439     } catch (AccessControlException ok) {
440     return;
441     }
442 jsr166 1.23
443 dl 1.20 try {
444     ExecutorService e = new ForkJoinPool(1);
445 jsr166 1.23 try {
446     Future future = e.submit(Executors.callable(new PrivilegedAction() {
447 dl 1.1 public Object run() {
448     return TEST_STRING;
449     }}));
450    
451 jsr166 1.23 Object result = future.get();
452     assertSame(TEST_STRING, result);
453     } finally {
454     joinPool(e);
455     }
456     } finally {
457 dl 1.20 Policy.setPolicy(savedPolicy);
458     }
459 dl 1.1 }
460    
461     /**
462 dl 1.20 * A submitted a privileged exception action runs to completion
463 dl 1.1 */
464 jsr166 1.6 public void testSubmitPrivilegedExceptionAction() throws Throwable {
465 dl 1.20 Policy savedPolicy = null;
466     try {
467     savedPolicy = Policy.getPolicy();
468     AdjustablePolicy policy = new AdjustablePolicy();
469     policy.addPermission(new RuntimePermission("getContextClassLoader"));
470     policy.addPermission(new RuntimePermission("setContextClassLoader"));
471     Policy.setPolicy(policy);
472     } catch (AccessControlException ok) {
473     return;
474     }
475    
476     try {
477     ExecutorService e = new ForkJoinPool(1);
478 jsr166 1.23 try {
479     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
480 dl 1.1 public Object run() {
481     return TEST_STRING;
482     }}));
483    
484 jsr166 1.23 Object result = future.get();
485     assertSame(TEST_STRING, result);
486     } finally {
487     joinPool(e);
488     }
489     } finally {
490 dl 1.20 Policy.setPolicy(savedPolicy);
491     }
492 dl 1.1 }
493    
494     /**
495     * A submitted failed privileged exception action reports exception
496     */
497 jsr166 1.6 public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
498 dl 1.20 Policy savedPolicy = null;
499     try {
500     savedPolicy = Policy.getPolicy();
501     AdjustablePolicy policy = new AdjustablePolicy();
502     policy.addPermission(new RuntimePermission("getContextClassLoader"));
503     policy.addPermission(new RuntimePermission("setContextClassLoader"));
504     Policy.setPolicy(policy);
505     } catch (AccessControlException ok) {
506     return;
507     }
508    
509     try {
510     ExecutorService e = new ForkJoinPool(1);
511 jsr166 1.23 try {
512     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
513 dl 1.1 public Object run() throws Exception {
514     throw new IndexOutOfBoundsException();
515     }}));
516    
517 jsr166 1.23 Object result = future.get();
518     shouldThrow();
519     } catch (ExecutionException success) {
520     assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
521     } finally {
522     joinPool(e);
523     }
524 dl 1.20 } finally {
525     Policy.setPolicy(savedPolicy);
526     }
527 dl 1.1 }
528    
529     /**
530 jsr166 1.6 * execute(null runnable) throws NullPointerException
531 dl 1.1 */
532     public void testExecuteNullRunnable() {
533 jsr166 1.23 ExecutorService e = new ForkJoinPool(1);
534 jsr166 1.26 TrackedShortRunnable task = null;
535 dl 1.1 try {
536     Future<?> future = e.submit(task);
537     shouldThrow();
538 jsr166 1.23 } catch (NullPointerException success) {
539     } finally {
540     joinPool(e);
541     }
542 dl 1.1 }
543    
544    
545     /**
546 jsr166 1.6 * submit(null callable) throws NullPointerException
547 dl 1.1 */
548     public void testSubmitNullCallable() {
549 jsr166 1.23 ExecutorService e = new ForkJoinPool(1);
550 jsr166 1.26 StringTask t = null;
551 dl 1.1 try {
552     Future<String> future = e.submit(t);
553     shouldThrow();
554 jsr166 1.23 } catch (NullPointerException success) {
555     } finally {
556     joinPool(e);
557     }
558 dl 1.1 }
559    
560    
561     /**
562 jsr166 1.27 * submit(callable).get() throws InterruptedException if interrupted
563 dl 1.1 */
564 jsr166 1.6 public void testInterruptedSubmit() throws InterruptedException {
565 jsr166 1.27 final CountDownLatch submitted = new CountDownLatch(1);
566     final CountDownLatch quittingTime = new CountDownLatch(1);
567     final ExecutorService p = new ForkJoinPool(1);
568     final Callable<Void> awaiter = new CheckedCallable<Void>() {
569     public Void realCall() throws InterruptedException {
570     assertTrue(quittingTime.await(MEDIUM_DELAY_MS, MILLISECONDS));
571     return null;
572     }};
573     try {
574     Thread t = new Thread(new CheckedInterruptedRunnable() {
575     public void realRun() throws Exception {
576     Future<Void> future = p.submit(awaiter);
577     submitted.countDown();
578     future.get();
579     }});
580     t.start();
581     assertTrue(submitted.await(MEDIUM_DELAY_MS, MILLISECONDS));
582     t.interrupt();
583     t.join();
584     } finally {
585     quittingTime.countDown();
586     joinPool(p);
587     }
588 dl 1.1 }
589    
590     /**
591 jsr166 1.4 * get of submit(callable) throws ExecutionException if callable
592     * throws exception
593 dl 1.1 */
594 jsr166 1.6 public void testSubmitEE() throws Throwable {
595 dl 1.1 ForkJoinPool p = new ForkJoinPool(1);
596     try {
597 jsr166 1.8 p.submit(new Callable() {
598     public Object call() {
599     int i = 5/0;
600     return Boolean.TRUE;
601     }}).get();
602 dl 1.1 shouldThrow();
603 jsr166 1.12 } catch (ExecutionException success) {
604     assertTrue(success.getCause() instanceof ArithmeticException);
605 jsr166 1.23 } finally {
606     joinPool(p);
607 jsr166 1.12 }
608 dl 1.1 }
609    
610     /**
611 jsr166 1.6 * invokeAny(null) throws NullPointerException
612 dl 1.1 */
613 jsr166 1.6 public void testInvokeAny1() throws Throwable {
614 dl 1.1 ExecutorService e = new ForkJoinPool(1);
615     try {
616     e.invokeAny(null);
617 jsr166 1.6 shouldThrow();
618 dl 1.1 } catch (NullPointerException success) {
619     } finally {
620     joinPool(e);
621     }
622     }
623    
624     /**
625 jsr166 1.6 * invokeAny(empty collection) throws IllegalArgumentException
626 dl 1.1 */
627 jsr166 1.6 public void testInvokeAny2() throws Throwable {
628 dl 1.1 ExecutorService e = new ForkJoinPool(1);
629     try {
630     e.invokeAny(new ArrayList<Callable<String>>());
631 jsr166 1.6 shouldThrow();
632 dl 1.1 } catch (IllegalArgumentException success) {
633     } finally {
634     joinPool(e);
635     }
636     }
637    
638     /**
639 jsr166 1.9 * invokeAny(c) throws NullPointerException if c has a single null element
640     */
641     public void testInvokeAny3() throws Throwable {
642     ExecutorService e = new ForkJoinPool(1);
643 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
644     l.add(null);
645 jsr166 1.9 try {
646     e.invokeAny(l);
647     shouldThrow();
648     } catch (NullPointerException success) {
649     } finally {
650     joinPool(e);
651     }
652     }
653    
654     /**
655 jsr166 1.6 * invokeAny(c) throws NullPointerException if c has null elements
656 dl 1.1 */
657 jsr166 1.9 public void testInvokeAny4() throws Throwable {
658 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
659 dl 1.1 ExecutorService e = new ForkJoinPool(1);
660 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
661     l.add(latchAwaitingStringTask(latch));
662     l.add(null);
663 dl 1.1 try {
664     e.invokeAny(l);
665 jsr166 1.6 shouldThrow();
666 dl 1.1 } catch (NullPointerException success) {
667     } finally {
668 jsr166 1.16 latch.countDown();
669 dl 1.1 joinPool(e);
670     }
671     }
672    
673     /**
674     * invokeAny(c) throws ExecutionException if no task in c completes
675     */
676 jsr166 1.9 public void testInvokeAny5() throws Throwable {
677 dl 1.1 ExecutorService e = new ForkJoinPool(1);
678 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
679     l.add(new NPETask());
680 dl 1.1 try {
681     e.invokeAny(l);
682 jsr166 1.6 shouldThrow();
683 jsr166 1.2 } catch (ExecutionException success) {
684 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
685 dl 1.1 } finally {
686     joinPool(e);
687     }
688     }
689    
690     /**
691     * invokeAny(c) returns result of some task in c if at least one completes
692     */
693 jsr166 1.9 public void testInvokeAny6() throws Throwable {
694 dl 1.1 ExecutorService e = new ForkJoinPool(1);
695     try {
696 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
697 dl 1.1 l.add(new StringTask());
698     l.add(new StringTask());
699     String result = e.invokeAny(l);
700     assertSame(TEST_STRING, result);
701     } finally {
702     joinPool(e);
703     }
704     }
705    
706     /**
707 jsr166 1.6 * invokeAll(null) throws NullPointerException
708 dl 1.1 */
709 jsr166 1.6 public void testInvokeAll1() throws Throwable {
710 dl 1.1 ExecutorService e = new ForkJoinPool(1);
711     try {
712     e.invokeAll(null);
713 jsr166 1.6 shouldThrow();
714 dl 1.1 } catch (NullPointerException success) {
715     } finally {
716     joinPool(e);
717     }
718     }
719    
720     /**
721     * invokeAll(empty collection) returns empty collection
722     */
723 jsr166 1.6 public void testInvokeAll2() throws InterruptedException {
724 dl 1.1 ExecutorService e = new ForkJoinPool(1);
725     try {
726 jsr166 1.6 List<Future<String>> r
727     = e.invokeAll(new ArrayList<Callable<String>>());
728 dl 1.1 assertTrue(r.isEmpty());
729     } finally {
730     joinPool(e);
731     }
732     }
733    
734     /**
735 jsr166 1.6 * invokeAll(c) throws NullPointerException if c has null elements
736 dl 1.1 */
737 jsr166 1.6 public void testInvokeAll3() throws InterruptedException {
738 dl 1.1 ExecutorService e = new ForkJoinPool(1);
739 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
740     l.add(new StringTask());
741     l.add(null);
742 dl 1.1 try {
743     e.invokeAll(l);
744 jsr166 1.6 shouldThrow();
745 dl 1.1 } catch (NullPointerException success) {
746     } finally {
747     joinPool(e);
748     }
749     }
750    
751     /**
752 jsr166 1.6 * get of returned element of invokeAll(c) throws
753     * ExecutionException on failed task
754 dl 1.1 */
755 jsr166 1.6 public void testInvokeAll4() throws Throwable {
756 dl 1.1 ExecutorService e = new ForkJoinPool(1);
757 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
758     l.add(new NPETask());
759     List<Future<String>> futures = e.invokeAll(l);
760     assertEquals(1, futures.size());
761 dl 1.1 try {
762 jsr166 1.16 futures.get(0).get();
763 jsr166 1.6 shouldThrow();
764 jsr166 1.2 } catch (ExecutionException success) {
765 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
766 dl 1.1 } finally {
767     joinPool(e);
768     }
769     }
770    
771     /**
772     * invokeAll(c) returns results of all completed tasks in c
773     */
774 jsr166 1.6 public void testInvokeAll5() throws Throwable {
775 dl 1.1 ExecutorService e = new ForkJoinPool(1);
776     try {
777 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
778 dl 1.1 l.add(new StringTask());
779     l.add(new StringTask());
780 jsr166 1.16 List<Future<String>> futures = e.invokeAll(l);
781     assertEquals(2, futures.size());
782     for (Future<String> future : futures)
783 jsr166 1.6 assertSame(TEST_STRING, future.get());
784 dl 1.1 } finally {
785     joinPool(e);
786     }
787     }
788    
789    
790     /**
791 jsr166 1.6 * timed invokeAny(null) throws NullPointerException
792 dl 1.1 */
793 jsr166 1.6 public void testTimedInvokeAny1() throws Throwable {
794 dl 1.1 ExecutorService e = new ForkJoinPool(1);
795     try {
796 jsr166 1.27 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
797 jsr166 1.6 shouldThrow();
798 dl 1.1 } catch (NullPointerException success) {
799     } finally {
800     joinPool(e);
801     }
802     }
803    
804     /**
805 jsr166 1.6 * timed invokeAny(null time unit) throws NullPointerException
806 dl 1.1 */
807 jsr166 1.6 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
808 dl 1.1 ExecutorService e = new ForkJoinPool(1);
809 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
810     l.add(new StringTask());
811 dl 1.1 try {
812     e.invokeAny(l, MEDIUM_DELAY_MS, null);
813 jsr166 1.6 shouldThrow();
814 dl 1.1 } catch (NullPointerException success) {
815     } finally {
816     joinPool(e);
817     }
818     }
819    
820     /**
821 jsr166 1.6 * timed invokeAny(empty collection) throws IllegalArgumentException
822 dl 1.1 */
823 jsr166 1.6 public void testTimedInvokeAny2() throws Throwable {
824 dl 1.1 ExecutorService e = new ForkJoinPool(1);
825     try {
826 jsr166 1.6 e.invokeAny(new ArrayList<Callable<String>>(),
827 jsr166 1.27 MEDIUM_DELAY_MS, MILLISECONDS);
828 jsr166 1.6 shouldThrow();
829 dl 1.1 } catch (IllegalArgumentException success) {
830     } finally {
831     joinPool(e);
832     }
833     }
834    
835     /**
836 jsr166 1.6 * timed invokeAny(c) throws NullPointerException if c has null elements
837 dl 1.1 */
838 jsr166 1.6 public void testTimedInvokeAny3() throws Throwable {
839 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
840 dl 1.1 ExecutorService e = new ForkJoinPool(1);
841 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
842     l.add(latchAwaitingStringTask(latch));
843     l.add(null);
844 dl 1.1 try {
845 jsr166 1.27 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
846 jsr166 1.6 shouldThrow();
847 dl 1.1 } catch (NullPointerException success) {
848     } finally {
849 jsr166 1.15 latch.countDown();
850 dl 1.1 joinPool(e);
851     }
852     }
853    
854     /**
855     * timed invokeAny(c) throws ExecutionException if no task completes
856     */
857 jsr166 1.6 public void testTimedInvokeAny4() throws Throwable {
858 dl 1.1 ExecutorService e = new ForkJoinPool(1);
859 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
860     l.add(new NPETask());
861 dl 1.1 try {
862 jsr166 1.27 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
863 jsr166 1.6 shouldThrow();
864 jsr166 1.2 } catch (ExecutionException success) {
865 jsr166 1.11 assertTrue(success.getCause() instanceof NullPointerException);
866 dl 1.1 } finally {
867     joinPool(e);
868     }
869     }
870    
871     /**
872     * timed invokeAny(c) returns result of some task in c
873     */
874 jsr166 1.6 public void testTimedInvokeAny5() throws Throwable {
875 dl 1.1 ExecutorService e = new ForkJoinPool(1);
876     try {
877 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
878 dl 1.1 l.add(new StringTask());
879     l.add(new StringTask());
880 jsr166 1.27 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
881 dl 1.1 assertSame(TEST_STRING, result);
882     } finally {
883     joinPool(e);
884     }
885     }
886    
887     /**
888 jsr166 1.6 * timed invokeAll(null) throws NullPointerException
889 dl 1.1 */
890 jsr166 1.6 public void testTimedInvokeAll1() throws Throwable {
891 dl 1.1 ExecutorService e = new ForkJoinPool(1);
892     try {
893 jsr166 1.27 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
894 jsr166 1.6 shouldThrow();
895 dl 1.1 } catch (NullPointerException success) {
896     } finally {
897     joinPool(e);
898     }
899     }
900    
901     /**
902 jsr166 1.6 * timed invokeAll(null time unit) throws NullPointerException
903 dl 1.1 */
904 jsr166 1.6 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
905 dl 1.1 ExecutorService e = new ForkJoinPool(1);
906 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
907     l.add(new StringTask());
908 dl 1.1 try {
909     e.invokeAll(l, MEDIUM_DELAY_MS, null);
910 jsr166 1.6 shouldThrow();
911 dl 1.1 } catch (NullPointerException success) {
912     } finally {
913     joinPool(e);
914     }
915     }
916    
917     /**
918     * timed invokeAll(empty collection) returns empty collection
919     */
920 jsr166 1.6 public void testTimedInvokeAll2() throws InterruptedException {
921 dl 1.1 ExecutorService e = new ForkJoinPool(1);
922     try {
923 jsr166 1.6 List<Future<String>> r
924     = e.invokeAll(new ArrayList<Callable<String>>(),
925 jsr166 1.27 MEDIUM_DELAY_MS, MILLISECONDS);
926 dl 1.1 assertTrue(r.isEmpty());
927     } finally {
928     joinPool(e);
929     }
930     }
931    
932     /**
933 jsr166 1.6 * timed invokeAll(c) throws NullPointerException if c has null elements
934 dl 1.1 */
935 jsr166 1.6 public void testTimedInvokeAll3() throws InterruptedException {
936 dl 1.1 ExecutorService e = new ForkJoinPool(1);
937 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
938     l.add(new StringTask());
939     l.add(null);
940 dl 1.1 try {
941 jsr166 1.27 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
942 jsr166 1.6 shouldThrow();
943 dl 1.1 } catch (NullPointerException success) {
944     } finally {
945     joinPool(e);
946     }
947     }
948    
949     /**
950     * get of returned element of invokeAll(c) throws exception on failed task
951     */
952 jsr166 1.6 public void testTimedInvokeAll4() throws Throwable {
953 dl 1.1 ExecutorService e = new ForkJoinPool(1);
954 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
955     l.add(new NPETask());
956     List<Future<String>> futures
957 jsr166 1.27 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
958 jsr166 1.16 assertEquals(1, futures.size());
959 dl 1.1 try {
960 jsr166 1.16 futures.get(0).get();
961 jsr166 1.6 shouldThrow();
962 jsr166 1.2 } catch (ExecutionException success) {
963 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
964 dl 1.1 } finally {
965     joinPool(e);
966     }
967     }
968    
969     /**
970     * timed invokeAll(c) returns results of all completed tasks in c
971     */
972 jsr166 1.6 public void testTimedInvokeAll5() throws Throwable {
973 dl 1.1 ExecutorService e = new ForkJoinPool(1);
974     try {
975 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
976 dl 1.1 l.add(new StringTask());
977     l.add(new StringTask());
978 jsr166 1.16 List<Future<String>> futures
979 jsr166 1.27 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
980 jsr166 1.16 assertEquals(2, futures.size());
981     for (Future<String> future : futures)
982 jsr166 1.6 assertSame(TEST_STRING, future.get());
983 dl 1.1 } finally {
984     joinPool(e);
985     }
986     }
987    
988     }