ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.70
Committed: Tue Oct 13 21:18:28 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.69: +4 -1 lines
Log Message:
testIsQuiescent: fix 1/billion failure; getActiveThreadCount will eventually become 0 after isQuiescent reports true, but not necessarily immediately

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