ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.50
Committed: Mon May 20 16:46:23 2013 UTC (10 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.49: +28 -0 lines
Log Message:
add testAwaitTermination_timesOut

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