ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.69
Committed: Tue Oct 13 21:14:39 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.68: +16 -2 lines
Log Message:
fix a theoretical never-observed race failure in testGetPoolSize

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.getActiveThreadCount());
323 assertEquals(0, p.getQueuedTaskCount());
324 assertEquals(0, p.getQueuedSubmissionCount());
325 assertFalse(p.hasQueuedSubmissions());
326 assertFalse(p.isShutdown());
327 assertFalse(p.isTerminating());
328 assertFalse(p.isTerminated());
329 assertTrue(f.isDone());
330 assertEquals(6765, (int) f.get());
331 }
332 }
333
334 /**
335 * Completed submit(ForkJoinTask) returns result
336 */
337 public void testSubmitForkJoinTask() throws Throwable {
338 ForkJoinPool p = new ForkJoinPool(1);
339 try (PoolCleaner cleaner = cleaner(p)) {
340 ForkJoinTask<Integer> f = p.submit(new FibTask(8));
341 assertEquals(21, (int) f.get());
342 }
343 }
344
345 /**
346 * A task submitted after shutdown is rejected
347 */
348 public void testSubmitAfterShutdown() {
349 ForkJoinPool p = new ForkJoinPool(1);
350 try (PoolCleaner cleaner = cleaner(p)) {
351 p.shutdown();
352 assertTrue(p.isShutdown());
353 try {
354 ForkJoinTask<Integer> f = p.submit(new FibTask(8));
355 shouldThrow();
356 } catch (RejectedExecutionException success) {}
357 }
358 }
359
360 /**
361 * Pool maintains parallelism when using ManagedBlocker
362 */
363 public void testBlockingForkJoinTask() throws Throwable {
364 ForkJoinPool p = new ForkJoinPool(4);
365 try {
366 ReentrantLock lock = new ReentrantLock();
367 ManagedLocker locker = new ManagedLocker(lock);
368 ForkJoinTask<Integer> f = new LockingFibTask(20, locker, lock);
369 p.execute(f);
370 assertEquals(6765, (int) f.get());
371 } finally {
372 p.shutdownNow(); // don't wait out shutdown
373 }
374 }
375
376 /**
377 * pollSubmission returns unexecuted submitted task, if present
378 */
379 public void testPollSubmission() {
380 final CountDownLatch done = new CountDownLatch(1);
381 SubFJP p = new SubFJP();
382 try (PoolCleaner cleaner = cleaner(p)) {
383 ForkJoinTask a = p.submit(awaiter(done));
384 ForkJoinTask b = p.submit(awaiter(done));
385 ForkJoinTask c = p.submit(awaiter(done));
386 ForkJoinTask r = p.pollSubmission();
387 assertTrue(r == a || r == b || r == c);
388 assertFalse(r.isDone());
389 done.countDown();
390 }
391 }
392
393 /**
394 * drainTasksTo transfers unexecuted submitted tasks, if present
395 */
396 public void testDrainTasksTo() {
397 final CountDownLatch done = new CountDownLatch(1);
398 SubFJP p = new SubFJP();
399 try (PoolCleaner cleaner = cleaner(p)) {
400 ForkJoinTask a = p.submit(awaiter(done));
401 ForkJoinTask b = p.submit(awaiter(done));
402 ForkJoinTask c = p.submit(awaiter(done));
403 ArrayList<ForkJoinTask> al = new ArrayList();
404 p.drainTasksTo(al);
405 assertTrue(al.size() > 0);
406 for (ForkJoinTask r : al) {
407 assertTrue(r == a || r == b || r == c);
408 assertFalse(r.isDone());
409 }
410 done.countDown();
411 }
412 }
413
414 // FJ Versions of AbstractExecutorService tests
415
416 /**
417 * execute(runnable) runs it to completion
418 */
419 public void testExecuteRunnable() throws Throwable {
420 ExecutorService e = new ForkJoinPool(1);
421 try (PoolCleaner cleaner = cleaner(e)) {
422 final AtomicBoolean done = new AtomicBoolean(false);
423 Future<?> future = e.submit(new CheckedRunnable() {
424 public void realRun() {
425 done.set(true);
426 }});
427 assertNull(future.get());
428 assertNull(future.get(0, MILLISECONDS));
429 assertTrue(done.get());
430 assertTrue(future.isDone());
431 assertFalse(future.isCancelled());
432 }
433 }
434
435 /**
436 * Completed submit(callable) returns result
437 */
438 public void testSubmitCallable() throws Throwable {
439 ExecutorService e = new ForkJoinPool(1);
440 try (PoolCleaner cleaner = cleaner(e)) {
441 Future<String> future = e.submit(new StringTask());
442 assertSame(TEST_STRING, future.get());
443 assertTrue(future.isDone());
444 assertFalse(future.isCancelled());
445 }
446 }
447
448 /**
449 * Completed submit(runnable) returns successfully
450 */
451 public void testSubmitRunnable() throws Throwable {
452 ExecutorService e = new ForkJoinPool(1);
453 try (PoolCleaner cleaner = cleaner(e)) {
454 Future<?> future = e.submit(new NoOpRunnable());
455 assertNull(future.get());
456 assertTrue(future.isDone());
457 assertFalse(future.isCancelled());
458 }
459 }
460
461 /**
462 * Completed submit(runnable, result) returns result
463 */
464 public void testSubmitRunnable2() throws Throwable {
465 ExecutorService e = new ForkJoinPool(1);
466 try (PoolCleaner cleaner = cleaner(e)) {
467 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
468 assertSame(TEST_STRING, future.get());
469 assertTrue(future.isDone());
470 assertFalse(future.isCancelled());
471 }
472 }
473
474 /**
475 * A submitted privileged action runs to completion
476 */
477 public void testSubmitPrivilegedAction() throws Exception {
478 final Callable callable = Executors.callable(new PrivilegedAction() {
479 public Object run() { return TEST_STRING; }});
480 Runnable r = new CheckedRunnable() {
481 public void realRun() throws Exception {
482 ExecutorService e = new ForkJoinPool(1);
483 try (PoolCleaner cleaner = cleaner(e)) {
484 Future future = e.submit(callable);
485 assertSame(TEST_STRING, future.get());
486 }
487 }};
488
489 runWithPermissions(r, new RuntimePermission("modifyThread"));
490 }
491
492 /**
493 * A submitted privileged exception action runs to completion
494 */
495 public void testSubmitPrivilegedExceptionAction() throws Exception {
496 final Callable callable =
497 Executors.callable(new PrivilegedExceptionAction() {
498 public Object run() { return TEST_STRING; }});
499 Runnable r = new CheckedRunnable() {
500 public void realRun() throws Exception {
501 ExecutorService e = new ForkJoinPool(1);
502 try (PoolCleaner cleaner = cleaner(e)) {
503 Future future = e.submit(callable);
504 assertSame(TEST_STRING, future.get());
505 }
506 }};
507
508 runWithPermissions(r, new RuntimePermission("modifyThread"));
509 }
510
511 /**
512 * A submitted failed privileged exception action reports exception
513 */
514 public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
515 final Callable callable =
516 Executors.callable(new PrivilegedExceptionAction() {
517 public Object run() { throw new IndexOutOfBoundsException(); }});
518 Runnable r = new CheckedRunnable() {
519 public void realRun() throws Exception {
520 ExecutorService e = new ForkJoinPool(1);
521 try (PoolCleaner cleaner = cleaner(e)) {
522 Future future = e.submit(callable);
523 try {
524 future.get();
525 shouldThrow();
526 } catch (ExecutionException success) {
527 assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
528 }
529 }
530 }};
531
532 runWithPermissions(r, new RuntimePermission("modifyThread"));
533 }
534
535 /**
536 * execute(null runnable) throws NullPointerException
537 */
538 public void testExecuteNullRunnable() {
539 ExecutorService e = new ForkJoinPool(1);
540 try (PoolCleaner cleaner = cleaner(e)) {
541 try {
542 Future<?> future = e.submit((Runnable) null);
543 shouldThrow();
544 } catch (NullPointerException success) {}
545 }
546 }
547
548 /**
549 * submit(null callable) throws NullPointerException
550 */
551 public void testSubmitNullCallable() {
552 ExecutorService e = new ForkJoinPool(1);
553 try (PoolCleaner cleaner = cleaner(e)) {
554 try {
555 Future<String> future = e.submit((Callable) null);
556 shouldThrow();
557 } catch (NullPointerException success) {}
558 }
559 }
560
561 /**
562 * submit(callable).get() throws InterruptedException if interrupted
563 */
564 public void testInterruptedSubmit() throws InterruptedException {
565 final CountDownLatch submitted = new CountDownLatch(1);
566 final CountDownLatch quittingTime = new CountDownLatch(1);
567 final Callable<Void> awaiter = new CheckedCallable<Void>() {
568 public Void realCall() throws InterruptedException {
569 assertTrue(quittingTime.await(2*LONG_DELAY_MS, MILLISECONDS));
570 return null;
571 }};
572 final ExecutorService p = new ForkJoinPool(1);
573 try (PoolCleaner cleaner = cleaner(p, quittingTime)) {
574 Thread t = new Thread(new CheckedInterruptedRunnable() {
575 public void realRun() throws Exception {
576 Future<Void> future = p.submit(awaiter);
577 submitted.countDown();
578 future.get();
579 }});
580 t.start();
581 await(submitted);
582 t.interrupt();
583 awaitTermination(t);
584 }
585 }
586
587 /**
588 * get of submit(callable) throws ExecutionException if callable
589 * throws exception
590 */
591 public void testSubmitEE() throws Throwable {
592 ForkJoinPool p = new ForkJoinPool(1);
593 try (PoolCleaner cleaner = cleaner(p)) {
594 try {
595 p.submit(new Callable() {
596 public Object call() { throw new ArithmeticException(); }})
597 .get();
598 shouldThrow();
599 } catch (ExecutionException success) {
600 assertTrue(success.getCause() instanceof ArithmeticException);
601 }
602 }
603 }
604
605 /**
606 * invokeAny(null) throws NullPointerException
607 */
608 public void testInvokeAny1() throws Throwable {
609 ExecutorService e = new ForkJoinPool(1);
610 try (PoolCleaner cleaner = cleaner(e)) {
611 try {
612 e.invokeAny(null);
613 shouldThrow();
614 } catch (NullPointerException success) {}
615 }
616 }
617
618 /**
619 * invokeAny(empty collection) throws IllegalArgumentException
620 */
621 public void testInvokeAny2() throws Throwable {
622 ExecutorService e = new ForkJoinPool(1);
623 try (PoolCleaner cleaner = cleaner(e)) {
624 try {
625 e.invokeAny(new ArrayList<Callable<String>>());
626 shouldThrow();
627 } catch (IllegalArgumentException success) {}
628 }
629 }
630
631 /**
632 * invokeAny(c) throws NullPointerException if c has a single null element
633 */
634 public void testInvokeAny3() throws Throwable {
635 ExecutorService e = new ForkJoinPool(1);
636 try (PoolCleaner cleaner = cleaner(e)) {
637 List<Callable<String>> l = new ArrayList<Callable<String>>();
638 l.add(null);
639 try {
640 e.invokeAny(l);
641 shouldThrow();
642 } catch (NullPointerException success) {}
643 }
644 }
645
646 /**
647 * invokeAny(c) throws NullPointerException if c has null elements
648 */
649 public void testInvokeAny4() throws Throwable {
650 CountDownLatch latch = new CountDownLatch(1);
651 ExecutorService e = new ForkJoinPool(1);
652 try (PoolCleaner cleaner = cleaner(e)) {
653 List<Callable<String>> l = new ArrayList<Callable<String>>();
654 l.add(latchAwaitingStringTask(latch));
655 l.add(null);
656 try {
657 e.invokeAny(l);
658 shouldThrow();
659 } catch (NullPointerException success) {}
660 latch.countDown();
661 }
662 }
663
664 /**
665 * invokeAny(c) throws ExecutionException if no task in c completes
666 */
667 public void testInvokeAny5() throws Throwable {
668 ExecutorService e = new ForkJoinPool(1);
669 try (PoolCleaner cleaner = cleaner(e)) {
670 List<Callable<String>> l = new ArrayList<Callable<String>>();
671 l.add(new NPETask());
672 try {
673 e.invokeAny(l);
674 shouldThrow();
675 } catch (ExecutionException success) {
676 assertTrue(success.getCause() instanceof NullPointerException);
677 }
678 }
679 }
680
681 /**
682 * invokeAny(c) returns result of some task in c if at least one completes
683 */
684 public void testInvokeAny6() throws Throwable {
685 ExecutorService e = new ForkJoinPool(1);
686 try (PoolCleaner cleaner = cleaner(e)) {
687 List<Callable<String>> l = new ArrayList<Callable<String>>();
688 l.add(new StringTask());
689 l.add(new StringTask());
690 String result = e.invokeAny(l);
691 assertSame(TEST_STRING, result);
692 }
693 }
694
695 /**
696 * invokeAll(null) throws NullPointerException
697 */
698 public void testInvokeAll1() throws Throwable {
699 ExecutorService e = new ForkJoinPool(1);
700 try (PoolCleaner cleaner = cleaner(e)) {
701 try {
702 e.invokeAll(null);
703 shouldThrow();
704 } catch (NullPointerException success) {}
705 }
706 }
707
708 /**
709 * invokeAll(empty collection) returns empty collection
710 */
711 public void testInvokeAll2() throws InterruptedException {
712 ExecutorService e = new ForkJoinPool(1);
713 try (PoolCleaner cleaner = cleaner(e)) {
714 List<Future<String>> r
715 = e.invokeAll(new ArrayList<Callable<String>>());
716 assertTrue(r.isEmpty());
717 }
718 }
719
720 /**
721 * invokeAll(c) throws NullPointerException if c has null elements
722 */
723 public void testInvokeAll3() throws InterruptedException {
724 ExecutorService e = new ForkJoinPool(1);
725 try (PoolCleaner cleaner = cleaner(e)) {
726 List<Callable<String>> l = new ArrayList<Callable<String>>();
727 l.add(new StringTask());
728 l.add(null);
729 try {
730 e.invokeAll(l);
731 shouldThrow();
732 } catch (NullPointerException success) {}
733 }
734 }
735
736 /**
737 * get of returned element of invokeAll(c) throws
738 * ExecutionException on failed task
739 */
740 public void testInvokeAll4() throws Throwable {
741 ExecutorService e = new ForkJoinPool(1);
742 try (PoolCleaner cleaner = cleaner(e)) {
743 List<Callable<String>> l = new ArrayList<Callable<String>>();
744 l.add(new NPETask());
745 List<Future<String>> futures = e.invokeAll(l);
746 assertEquals(1, futures.size());
747 try {
748 futures.get(0).get();
749 shouldThrow();
750 } catch (ExecutionException success) {
751 assertTrue(success.getCause() instanceof NullPointerException);
752 }
753 }
754 }
755
756 /**
757 * invokeAll(c) returns results of all completed tasks in c
758 */
759 public void testInvokeAll5() throws Throwable {
760 ExecutorService e = new ForkJoinPool(1);
761 try (PoolCleaner cleaner = cleaner(e)) {
762 List<Callable<String>> l = new ArrayList<Callable<String>>();
763 l.add(new StringTask());
764 l.add(new StringTask());
765 List<Future<String>> futures = e.invokeAll(l);
766 assertEquals(2, futures.size());
767 for (Future<String> future : futures)
768 assertSame(TEST_STRING, future.get());
769 }
770 }
771
772 /**
773 * timed invokeAny(null) throws NullPointerException
774 */
775 public void testTimedInvokeAny1() throws Throwable {
776 ExecutorService e = new ForkJoinPool(1);
777 try (PoolCleaner cleaner = cleaner(e)) {
778 try {
779 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
780 shouldThrow();
781 } catch (NullPointerException success) {}
782 }
783 }
784
785 /**
786 * timed invokeAny(null time unit) throws NullPointerException
787 */
788 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
789 ExecutorService e = new ForkJoinPool(1);
790 try (PoolCleaner cleaner = cleaner(e)) {
791 List<Callable<String>> l = new ArrayList<Callable<String>>();
792 l.add(new StringTask());
793 try {
794 e.invokeAny(l, MEDIUM_DELAY_MS, null);
795 shouldThrow();
796 } catch (NullPointerException success) {}
797 }
798 }
799
800 /**
801 * timed invokeAny(empty collection) throws IllegalArgumentException
802 */
803 public void testTimedInvokeAny2() throws Throwable {
804 ExecutorService e = new ForkJoinPool(1);
805 try (PoolCleaner cleaner = cleaner(e)) {
806 try {
807 e.invokeAny(new ArrayList<Callable<String>>(),
808 MEDIUM_DELAY_MS, MILLISECONDS);
809 shouldThrow();
810 } catch (IllegalArgumentException success) {}
811 }
812 }
813
814 /**
815 * timed invokeAny(c) throws NullPointerException if c has null elements
816 */
817 public void testTimedInvokeAny3() throws Throwable {
818 CountDownLatch latch = new CountDownLatch(1);
819 ExecutorService e = new ForkJoinPool(1);
820 try (PoolCleaner cleaner = cleaner(e)) {
821 List<Callable<String>> l = new ArrayList<Callable<String>>();
822 l.add(latchAwaitingStringTask(latch));
823 l.add(null);
824 try {
825 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
826 shouldThrow();
827 } catch (NullPointerException success) {}
828 latch.countDown();
829 }
830 }
831
832 /**
833 * timed invokeAny(c) throws ExecutionException if no task completes
834 */
835 public void testTimedInvokeAny4() throws Throwable {
836 ExecutorService e = new ForkJoinPool(1);
837 try (PoolCleaner cleaner = cleaner(e)) {
838 long startTime = System.nanoTime();
839 List<Callable<String>> l = new ArrayList<Callable<String>>();
840 l.add(new NPETask());
841 try {
842 e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
843 shouldThrow();
844 } catch (ExecutionException success) {
845 assertTrue(success.getCause() instanceof NullPointerException);
846 }
847 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
848 }
849 }
850
851 /**
852 * timed invokeAny(c) returns result of some task in c
853 */
854 public void testTimedInvokeAny5() throws Throwable {
855 ExecutorService e = new ForkJoinPool(1);
856 try (PoolCleaner cleaner = cleaner(e)) {
857 long startTime = System.nanoTime();
858 List<Callable<String>> l = new ArrayList<Callable<String>>();
859 l.add(new StringTask());
860 l.add(new StringTask());
861 String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
862 assertSame(TEST_STRING, result);
863 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
864 }
865 }
866
867 /**
868 * timed invokeAll(null) throws NullPointerException
869 */
870 public void testTimedInvokeAll1() throws Throwable {
871 ExecutorService e = new ForkJoinPool(1);
872 try (PoolCleaner cleaner = cleaner(e)) {
873 try {
874 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
875 shouldThrow();
876 } catch (NullPointerException success) {}
877 }
878 }
879
880 /**
881 * timed invokeAll(null time unit) throws NullPointerException
882 */
883 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
884 ExecutorService e = new ForkJoinPool(1);
885 try (PoolCleaner cleaner = cleaner(e)) {
886 List<Callable<String>> l = new ArrayList<Callable<String>>();
887 l.add(new StringTask());
888 try {
889 e.invokeAll(l, MEDIUM_DELAY_MS, null);
890 shouldThrow();
891 } catch (NullPointerException success) {}
892 }
893 }
894
895 /**
896 * timed invokeAll(empty collection) returns empty collection
897 */
898 public void testTimedInvokeAll2() throws InterruptedException {
899 ExecutorService e = new ForkJoinPool(1);
900 try (PoolCleaner cleaner = cleaner(e)) {
901 List<Future<String>> r
902 = e.invokeAll(new ArrayList<Callable<String>>(),
903 MEDIUM_DELAY_MS, MILLISECONDS);
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<Callable<String>>();
915 l.add(new StringTask());
916 l.add(null);
917 try {
918 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
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<Callable<String>>();
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<Callable<String>>();
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 }