ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.80
Committed: Wed Jan 27 01:57:24 2021 UTC (3 years, 2 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.79: +1 -1 lines
Log Message:
use diamond <> pervasively

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