ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.62
Committed: Sun Oct 4 07:42:07 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.61: +186 -239 lines
Log Message:
PoolCleaning

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 eh =
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 eh, false);
266 try {
267 assertSame(eh, p.getUncaughtExceptionHandler());
268 try {
269 p.execute(new FibTask(8));
270 assertTrue(uehInvoked.await(MEDIUM_DELAY_MS, MILLISECONDS));
271 } catch (RejectedExecutionException ok) {
272 }
273 } finally {
274 p.shutdownNow(); // failure might have prevented processing task
275 joinPool(p);
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 ExecutorService p = new ForkJoinPool(1);
552 final Callable<Void> awaiter = new CheckedCallable<Void>() {
553 public Void realCall() throws InterruptedException {
554 assertTrue(quittingTime.await(MEDIUM_DELAY_MS, MILLISECONDS));
555 return null;
556 }};
557 try {
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 assertTrue(submitted.await(MEDIUM_DELAY_MS, MILLISECONDS));
566 t.interrupt();
567 t.join();
568 } finally {
569 quittingTime.countDown();
570 joinPool(p);
571 }
572 }
573
574 /**
575 * get of submit(callable) throws ExecutionException if callable
576 * throws exception
577 */
578 public void testSubmitEE() throws Throwable {
579 ForkJoinPool p = new ForkJoinPool(1);
580 try (PoolCleaner cleaner = cleaner(p)) {
581 try {
582 p.submit(new Callable() {
583 public Object call() { throw new ArithmeticException(); }})
584 .get();
585 shouldThrow();
586 } catch (ExecutionException success) {
587 assertTrue(success.getCause() instanceof ArithmeticException);
588 }
589 }
590 }
591
592 /**
593 * invokeAny(null) throws NullPointerException
594 */
595 public void testInvokeAny1() throws Throwable {
596 ExecutorService e = new ForkJoinPool(1);
597 try (PoolCleaner cleaner = cleaner(e)) {
598 try {
599 e.invokeAny(null);
600 shouldThrow();
601 } catch (NullPointerException success) {}
602 }
603 }
604
605 /**
606 * invokeAny(empty collection) throws IllegalArgumentException
607 */
608 public void testInvokeAny2() throws Throwable {
609 ExecutorService e = new ForkJoinPool(1);
610 try (PoolCleaner cleaner = cleaner(e)) {
611 try {
612 e.invokeAny(new ArrayList<Callable<String>>());
613 shouldThrow();
614 } catch (IllegalArgumentException success) {}
615 }
616 }
617
618 /**
619 * invokeAny(c) throws NullPointerException if c has a single null element
620 */
621 public void testInvokeAny3() throws Throwable {
622 ExecutorService e = new ForkJoinPool(1);
623 try (PoolCleaner cleaner = cleaner(e)) {
624 List<Callable<String>> l = new ArrayList<Callable<String>>();
625 l.add(null);
626 try {
627 e.invokeAny(l);
628 shouldThrow();
629 } catch (NullPointerException success) {}
630 }
631 }
632
633 /**
634 * invokeAny(c) throws NullPointerException if c has null elements
635 */
636 public void testInvokeAny4() throws Throwable {
637 CountDownLatch latch = new CountDownLatch(1);
638 ExecutorService e = new ForkJoinPool(1);
639 try (PoolCleaner cleaner = cleaner(e)) {
640 List<Callable<String>> l = new ArrayList<Callable<String>>();
641 l.add(latchAwaitingStringTask(latch));
642 l.add(null);
643 try {
644 e.invokeAny(l);
645 shouldThrow();
646 } catch (NullPointerException success) {}
647 latch.countDown();
648 }
649 }
650
651 /**
652 * invokeAny(c) throws ExecutionException if no task in c completes
653 */
654 public void testInvokeAny5() throws Throwable {
655 ExecutorService e = new ForkJoinPool(1);
656 try (PoolCleaner cleaner = cleaner(e)) {
657 List<Callable<String>> l = new ArrayList<Callable<String>>();
658 l.add(new NPETask());
659 try {
660 e.invokeAny(l);
661 shouldThrow();
662 } catch (ExecutionException success) {
663 assertTrue(success.getCause() instanceof NullPointerException);
664 }
665 }
666 }
667
668 /**
669 * invokeAny(c) returns result of some task in c if at least one completes
670 */
671 public void testInvokeAny6() throws Throwable {
672 ExecutorService e = new ForkJoinPool(1);
673 try (PoolCleaner cleaner = cleaner(e)) {
674 List<Callable<String>> l = new ArrayList<Callable<String>>();
675 l.add(new StringTask());
676 l.add(new StringTask());
677 String result = e.invokeAny(l);
678 assertSame(TEST_STRING, result);
679 }
680 }
681
682 /**
683 * invokeAll(null) throws NullPointerException
684 */
685 public void testInvokeAll1() throws Throwable {
686 ExecutorService e = new ForkJoinPool(1);
687 try (PoolCleaner cleaner = cleaner(e)) {
688 try {
689 e.invokeAll(null);
690 shouldThrow();
691 } catch (NullPointerException success) {}
692 }
693 }
694
695 /**
696 * invokeAll(empty collection) returns empty collection
697 */
698 public void testInvokeAll2() throws InterruptedException {
699 ExecutorService e = new ForkJoinPool(1);
700 try (PoolCleaner cleaner = cleaner(e)) {
701 List<Future<String>> r
702 = e.invokeAll(new ArrayList<Callable<String>>());
703 assertTrue(r.isEmpty());
704 }
705 }
706
707 /**
708 * invokeAll(c) throws NullPointerException if c has null elements
709 */
710 public void testInvokeAll3() throws InterruptedException {
711 ExecutorService e = new ForkJoinPool(1);
712 try (PoolCleaner cleaner = cleaner(e)) {
713 List<Callable<String>> l = new ArrayList<Callable<String>>();
714 l.add(new StringTask());
715 l.add(null);
716 try {
717 e.invokeAll(l);
718 shouldThrow();
719 } catch (NullPointerException success) {}
720 }
721 }
722
723 /**
724 * get of returned element of invokeAll(c) throws
725 * ExecutionException on failed task
726 */
727 public void testInvokeAll4() throws Throwable {
728 ExecutorService e = new ForkJoinPool(1);
729 try (PoolCleaner cleaner = cleaner(e)) {
730 List<Callable<String>> l = new ArrayList<Callable<String>>();
731 l.add(new NPETask());
732 List<Future<String>> futures = e.invokeAll(l);
733 assertEquals(1, futures.size());
734 try {
735 futures.get(0).get();
736 shouldThrow();
737 } catch (ExecutionException success) {
738 assertTrue(success.getCause() instanceof NullPointerException);
739 }
740 }
741 }
742
743 /**
744 * invokeAll(c) returns results of all completed tasks in c
745 */
746 public void testInvokeAll5() throws Throwable {
747 ExecutorService e = new ForkJoinPool(1);
748 try (PoolCleaner cleaner = cleaner(e)) {
749 List<Callable<String>> l = new ArrayList<Callable<String>>();
750 l.add(new StringTask());
751 l.add(new StringTask());
752 List<Future<String>> futures = e.invokeAll(l);
753 assertEquals(2, futures.size());
754 for (Future<String> future : futures)
755 assertSame(TEST_STRING, future.get());
756 }
757 }
758
759 /**
760 * timed invokeAny(null) throws NullPointerException
761 */
762 public void testTimedInvokeAny1() throws Throwable {
763 ExecutorService e = new ForkJoinPool(1);
764 try (PoolCleaner cleaner = cleaner(e)) {
765 try {
766 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
767 shouldThrow();
768 } catch (NullPointerException success) {}
769 }
770 }
771
772 /**
773 * timed invokeAny(null time unit) throws NullPointerException
774 */
775 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
776 ExecutorService e = new ForkJoinPool(1);
777 try (PoolCleaner cleaner = cleaner(e)) {
778 List<Callable<String>> l = new ArrayList<Callable<String>>();
779 l.add(new StringTask());
780 try {
781 e.invokeAny(l, MEDIUM_DELAY_MS, null);
782 shouldThrow();
783 } catch (NullPointerException success) {}
784 }
785 }
786
787 /**
788 * timed invokeAny(empty collection) throws IllegalArgumentException
789 */
790 public void testTimedInvokeAny2() throws Throwable {
791 ExecutorService e = new ForkJoinPool(1);
792 try (PoolCleaner cleaner = cleaner(e)) {
793 try {
794 e.invokeAny(new ArrayList<Callable<String>>(),
795 MEDIUM_DELAY_MS, MILLISECONDS);
796 shouldThrow();
797 } catch (IllegalArgumentException success) {}
798 }
799 }
800
801 /**
802 * timed invokeAny(c) throws NullPointerException if c has null elements
803 */
804 public void testTimedInvokeAny3() throws Throwable {
805 CountDownLatch latch = new CountDownLatch(1);
806 ExecutorService e = new ForkJoinPool(1);
807 try (PoolCleaner cleaner = cleaner(e)) {
808 List<Callable<String>> l = new ArrayList<Callable<String>>();
809 l.add(latchAwaitingStringTask(latch));
810 l.add(null);
811 try {
812 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
813 shouldThrow();
814 } catch (NullPointerException success) {}
815 latch.countDown();
816 }
817 }
818
819 /**
820 * timed invokeAny(c) throws ExecutionException if no task completes
821 */
822 public void testTimedInvokeAny4() throws Throwable {
823 ExecutorService e = new ForkJoinPool(1);
824 try (PoolCleaner cleaner = cleaner(e)) {
825 List<Callable<String>> l = new ArrayList<Callable<String>>();
826 l.add(new NPETask());
827 try {
828 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
829 shouldThrow();
830 } catch (ExecutionException success) {
831 assertTrue(success.getCause() instanceof NullPointerException);
832 }
833 }
834 }
835
836 /**
837 * timed invokeAny(c) returns result of some task in c
838 */
839 public void testTimedInvokeAny5() throws Throwable {
840 ExecutorService e = new ForkJoinPool(1);
841 try (PoolCleaner cleaner = cleaner(e)) {
842 List<Callable<String>> l = new ArrayList<Callable<String>>();
843 l.add(new StringTask());
844 l.add(new StringTask());
845 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
846 assertSame(TEST_STRING, result);
847 }
848 }
849
850 /**
851 * timed invokeAll(null) throws NullPointerException
852 */
853 public void testTimedInvokeAll1() throws Throwable {
854 ExecutorService e = new ForkJoinPool(1);
855 try (PoolCleaner cleaner = cleaner(e)) {
856 try {
857 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
858 shouldThrow();
859 } catch (NullPointerException success) {}
860 }
861 }
862
863 /**
864 * timed invokeAll(null time unit) throws NullPointerException
865 */
866 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
867 ExecutorService e = new ForkJoinPool(1);
868 try (PoolCleaner cleaner = cleaner(e)) {
869 List<Callable<String>> l = new ArrayList<Callable<String>>();
870 l.add(new StringTask());
871 try {
872 e.invokeAll(l, MEDIUM_DELAY_MS, null);
873 shouldThrow();
874 } catch (NullPointerException success) {}
875 }
876 }
877
878 /**
879 * timed invokeAll(empty collection) returns empty collection
880 */
881 public void testTimedInvokeAll2() throws InterruptedException {
882 ExecutorService e = new ForkJoinPool(1);
883 try (PoolCleaner cleaner = cleaner(e)) {
884 List<Future<String>> r
885 = e.invokeAll(new ArrayList<Callable<String>>(),
886 MEDIUM_DELAY_MS, MILLISECONDS);
887 assertTrue(r.isEmpty());
888 }
889 }
890
891 /**
892 * timed invokeAll(c) throws NullPointerException if c has null elements
893 */
894 public void testTimedInvokeAll3() throws InterruptedException {
895 ExecutorService e = new ForkJoinPool(1);
896 try (PoolCleaner cleaner = cleaner(e)) {
897 List<Callable<String>> l = new ArrayList<Callable<String>>();
898 l.add(new StringTask());
899 l.add(null);
900 try {
901 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
902 shouldThrow();
903 } catch (NullPointerException success) {}
904 }
905 }
906
907 /**
908 * get of returned element of invokeAll(c) throws exception on failed task
909 */
910 public void testTimedInvokeAll4() throws Throwable {
911 ExecutorService e = new ForkJoinPool(1);
912 try (PoolCleaner cleaner = cleaner(e)) {
913 List<Callable<String>> l = new ArrayList<Callable<String>>();
914 l.add(new NPETask());
915 List<Future<String>> futures
916 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
917 assertEquals(1, futures.size());
918 try {
919 futures.get(0).get();
920 shouldThrow();
921 } catch (ExecutionException success) {
922 assertTrue(success.getCause() instanceof NullPointerException);
923 }
924 }
925 }
926
927 /**
928 * timed invokeAll(c) returns results of all completed tasks in c
929 */
930 public void testTimedInvokeAll5() throws Throwable {
931 ForkJoinPool e = new ForkJoinPool(1);
932 try (PoolCleaner cleaner = cleaner(e)) {
933 List<Callable<String>> l = new ArrayList<Callable<String>>();
934 l.add(new StringTask());
935 l.add(new StringTask());
936 List<Future<String>> futures
937 = e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
938 assertEquals(2, futures.size());
939 for (Future<String> future : futures)
940 assertSame(TEST_STRING, future.get());
941 }
942 }
943
944 }