ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.65
Committed: Tue Oct 6 21:22:54 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.64: +10 -10 lines
Log Message:
improve testSetUncaughtExceptionHandler

File Contents

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