ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.34
Committed: Thu Nov 18 19:14:34 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.33: +10 -6 lines
Log Message:
add a few assertions

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