ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.69
Committed: Tue Oct 13 21:14:39 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.68: +16 -2 lines
Log Message:
fix a theoretical never-observed race failure in testGetPoolSize

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