ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.36
Committed: Mon Nov 29 07:42:58 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +12 -6 lines
Log Message:
remove unreliable sleeps from testDrainTasksTo and testPollSubmission

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