ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.75
Committed: Mon May 29 22:44:27 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.74: +14 -10 lines
Log Message:
more timeout handling rework; remove most uses of MEDIUM_DELAY_MS; randomize timeouts and TimeUnits; write out IAE and ISE

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