ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.30
Committed: Fri Sep 17 17:07:47 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.29: +2 -1 lines
Log Message:
testisQuiescent: use SMALL delay

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(30, locker, lock);
320 p.execute(f);
321 assertEquals(832040, (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 MediumRunnable());
334 ForkJoinTask b = p.submit(new MediumRunnable());
335 ForkJoinTask c = p.submit(new MediumRunnable());
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 MediumRunnable());
351 ForkJoinTask b = p.submit(new MediumRunnable());
352 ForkJoinTask c = p.submit(new MediumRunnable());
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 TrackedShortRunnable task = new TrackedShortRunnable();
375 assertFalse(task.done);
376 Future<?> future = e.submit(task);
377 future.get();
378 assertTrue(task.done);
379 } finally {
380 joinPool(e);
381 }
382 }
383
384
385 /**
386 * Completed submit(callable) returns result
387 */
388 public void testSubmitCallable() throws Throwable {
389 ExecutorService e = new ForkJoinPool(1);
390 try {
391 Future<String> future = e.submit(new StringTask());
392 String result = future.get();
393 assertSame(TEST_STRING, result);
394 } finally {
395 joinPool(e);
396 }
397 }
398
399 /**
400 * Completed submit(runnable) returns successfully
401 */
402 public void testSubmitRunnable() throws Throwable {
403 ExecutorService e = new ForkJoinPool(1);
404 try {
405 Future<?> future = e.submit(new NoOpRunnable());
406 future.get();
407 assertTrue(future.isDone());
408 } finally {
409 joinPool(e);
410 }
411 }
412
413 /**
414 * Completed submit(runnable, result) returns result
415 */
416 public void testSubmitRunnable2() throws Throwable {
417 ExecutorService e = new ForkJoinPool(1);
418 try {
419 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
420 String result = future.get();
421 assertSame(TEST_STRING, result);
422 } finally {
423 joinPool(e);
424 }
425 }
426
427
428 /**
429 * A submitted privileged action to completion
430 */
431 public void testSubmitPrivilegedAction() throws Throwable {
432 Policy savedPolicy = null;
433 try {
434 savedPolicy = Policy.getPolicy();
435 AdjustablePolicy policy = new AdjustablePolicy();
436 policy.addPermission(new RuntimePermission("getContextClassLoader"));
437 policy.addPermission(new RuntimePermission("setContextClassLoader"));
438 Policy.setPolicy(policy);
439 } catch (AccessControlException ok) {
440 return;
441 }
442
443 try {
444 ExecutorService e = new ForkJoinPool(1);
445 try {
446 Future future = e.submit(Executors.callable(new PrivilegedAction() {
447 public Object run() {
448 return TEST_STRING;
449 }}));
450
451 Object result = future.get();
452 assertSame(TEST_STRING, result);
453 } finally {
454 joinPool(e);
455 }
456 } finally {
457 Policy.setPolicy(savedPolicy);
458 }
459 }
460
461 /**
462 * A submitted a privileged exception action runs to completion
463 */
464 public void testSubmitPrivilegedExceptionAction() throws Throwable {
465 Policy savedPolicy = null;
466 try {
467 savedPolicy = Policy.getPolicy();
468 AdjustablePolicy policy = new AdjustablePolicy();
469 policy.addPermission(new RuntimePermission("getContextClassLoader"));
470 policy.addPermission(new RuntimePermission("setContextClassLoader"));
471 Policy.setPolicy(policy);
472 } catch (AccessControlException ok) {
473 return;
474 }
475
476 try {
477 ExecutorService e = new ForkJoinPool(1);
478 try {
479 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
480 public Object run() {
481 return TEST_STRING;
482 }}));
483
484 Object result = future.get();
485 assertSame(TEST_STRING, result);
486 } finally {
487 joinPool(e);
488 }
489 } finally {
490 Policy.setPolicy(savedPolicy);
491 }
492 }
493
494 /**
495 * A submitted failed privileged exception action reports exception
496 */
497 public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
498 Policy savedPolicy = null;
499 try {
500 savedPolicy = Policy.getPolicy();
501 AdjustablePolicy policy = new AdjustablePolicy();
502 policy.addPermission(new RuntimePermission("getContextClassLoader"));
503 policy.addPermission(new RuntimePermission("setContextClassLoader"));
504 Policy.setPolicy(policy);
505 } catch (AccessControlException ok) {
506 return;
507 }
508
509 try {
510 ExecutorService e = new ForkJoinPool(1);
511 try {
512 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
513 public Object run() throws Exception {
514 throw new IndexOutOfBoundsException();
515 }}));
516
517 Object result = future.get();
518 shouldThrow();
519 } catch (ExecutionException success) {
520 assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
521 } finally {
522 joinPool(e);
523 }
524 } finally {
525 Policy.setPolicy(savedPolicy);
526 }
527 }
528
529 /**
530 * execute(null runnable) throws NullPointerException
531 */
532 public void testExecuteNullRunnable() {
533 ExecutorService e = new ForkJoinPool(1);
534 TrackedShortRunnable task = null;
535 try {
536 Future<?> future = e.submit(task);
537 shouldThrow();
538 } catch (NullPointerException success) {
539 } finally {
540 joinPool(e);
541 }
542 }
543
544
545 /**
546 * submit(null callable) throws NullPointerException
547 */
548 public void testSubmitNullCallable() {
549 ExecutorService e = new ForkJoinPool(1);
550 StringTask t = null;
551 try {
552 Future<String> future = e.submit(t);
553 shouldThrow();
554 } catch (NullPointerException success) {
555 } finally {
556 joinPool(e);
557 }
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 ExecutorService p = new ForkJoinPool(1);
568 final Callable<Void> awaiter = new CheckedCallable<Void>() {
569 public Void realCall() throws InterruptedException {
570 assertTrue(quittingTime.await(MEDIUM_DELAY_MS, MILLISECONDS));
571 return null;
572 }};
573 try {
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 assertTrue(submitted.await(MEDIUM_DELAY_MS, MILLISECONDS));
582 t.interrupt();
583 t.join();
584 } finally {
585 quittingTime.countDown();
586 joinPool(p);
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 {
597 p.submit(new Callable() {
598 public Object call() {
599 int i = 5/0;
600 return Boolean.TRUE;
601 }}).get();
602 shouldThrow();
603 } catch (ExecutionException success) {
604 assertTrue(success.getCause() instanceof ArithmeticException);
605 } finally {
606 joinPool(p);
607 }
608 }
609
610 /**
611 * invokeAny(null) throws NullPointerException
612 */
613 public void testInvokeAny1() throws Throwable {
614 ExecutorService e = new ForkJoinPool(1);
615 try {
616 e.invokeAny(null);
617 shouldThrow();
618 } catch (NullPointerException success) {
619 } finally {
620 joinPool(e);
621 }
622 }
623
624 /**
625 * invokeAny(empty collection) throws IllegalArgumentException
626 */
627 public void testInvokeAny2() throws Throwable {
628 ExecutorService e = new ForkJoinPool(1);
629 try {
630 e.invokeAny(new ArrayList<Callable<String>>());
631 shouldThrow();
632 } catch (IllegalArgumentException success) {
633 } finally {
634 joinPool(e);
635 }
636 }
637
638 /**
639 * invokeAny(c) throws NullPointerException if c has a single null element
640 */
641 public void testInvokeAny3() throws Throwable {
642 ExecutorService e = new ForkJoinPool(1);
643 List<Callable<String>> l = new ArrayList<Callable<String>>();
644 l.add(null);
645 try {
646 e.invokeAny(l);
647 shouldThrow();
648 } catch (NullPointerException success) {
649 } finally {
650 joinPool(e);
651 }
652 }
653
654 /**
655 * invokeAny(c) throws NullPointerException if c has null elements
656 */
657 public void testInvokeAny4() throws Throwable {
658 CountDownLatch latch = new CountDownLatch(1);
659 ExecutorService e = new ForkJoinPool(1);
660 List<Callable<String>> l = new ArrayList<Callable<String>>();
661 l.add(latchAwaitingStringTask(latch));
662 l.add(null);
663 try {
664 e.invokeAny(l);
665 shouldThrow();
666 } catch (NullPointerException success) {
667 } finally {
668 latch.countDown();
669 joinPool(e);
670 }
671 }
672
673 /**
674 * invokeAny(c) throws ExecutionException if no task in c completes
675 */
676 public void testInvokeAny5() throws Throwable {
677 ExecutorService e = new ForkJoinPool(1);
678 List<Callable<String>> l = new ArrayList<Callable<String>>();
679 l.add(new NPETask());
680 try {
681 e.invokeAny(l);
682 shouldThrow();
683 } catch (ExecutionException success) {
684 assertTrue(success.getCause() instanceof NullPointerException);
685 } finally {
686 joinPool(e);
687 }
688 }
689
690 /**
691 * invokeAny(c) returns result of some task in c if at least one completes
692 */
693 public void testInvokeAny6() throws Throwable {
694 ExecutorService e = new ForkJoinPool(1);
695 try {
696 List<Callable<String>> l = new ArrayList<Callable<String>>();
697 l.add(new StringTask());
698 l.add(new StringTask());
699 String result = e.invokeAny(l);
700 assertSame(TEST_STRING, result);
701 } finally {
702 joinPool(e);
703 }
704 }
705
706 /**
707 * invokeAll(null) throws NullPointerException
708 */
709 public void testInvokeAll1() throws Throwable {
710 ExecutorService e = new ForkJoinPool(1);
711 try {
712 e.invokeAll(null);
713 shouldThrow();
714 } catch (NullPointerException success) {
715 } finally {
716 joinPool(e);
717 }
718 }
719
720 /**
721 * invokeAll(empty collection) returns empty collection
722 */
723 public void testInvokeAll2() throws InterruptedException {
724 ExecutorService e = new ForkJoinPool(1);
725 try {
726 List<Future<String>> r
727 = e.invokeAll(new ArrayList<Callable<String>>());
728 assertTrue(r.isEmpty());
729 } finally {
730 joinPool(e);
731 }
732 }
733
734 /**
735 * invokeAll(c) throws NullPointerException if c has null elements
736 */
737 public void testInvokeAll3() throws InterruptedException {
738 ExecutorService e = new ForkJoinPool(1);
739 List<Callable<String>> l = new ArrayList<Callable<String>>();
740 l.add(new StringTask());
741 l.add(null);
742 try {
743 e.invokeAll(l);
744 shouldThrow();
745 } catch (NullPointerException success) {
746 } finally {
747 joinPool(e);
748 }
749 }
750
751 /**
752 * get of returned element of invokeAll(c) throws
753 * ExecutionException on failed task
754 */
755 public void testInvokeAll4() throws Throwable {
756 ExecutorService e = new ForkJoinPool(1);
757 List<Callable<String>> l = new ArrayList<Callable<String>>();
758 l.add(new NPETask());
759 List<Future<String>> futures = e.invokeAll(l);
760 assertEquals(1, futures.size());
761 try {
762 futures.get(0).get();
763 shouldThrow();
764 } catch (ExecutionException success) {
765 assertTrue(success.getCause() instanceof NullPointerException);
766 } finally {
767 joinPool(e);
768 }
769 }
770
771 /**
772 * invokeAll(c) returns results of all completed tasks in c
773 */
774 public void testInvokeAll5() throws Throwable {
775 ExecutorService e = new ForkJoinPool(1);
776 try {
777 List<Callable<String>> l = new ArrayList<Callable<String>>();
778 l.add(new StringTask());
779 l.add(new StringTask());
780 List<Future<String>> futures = e.invokeAll(l);
781 assertEquals(2, futures.size());
782 for (Future<String> future : futures)
783 assertSame(TEST_STRING, future.get());
784 } finally {
785 joinPool(e);
786 }
787 }
788
789
790 /**
791 * timed invokeAny(null) throws NullPointerException
792 */
793 public void testTimedInvokeAny1() throws Throwable {
794 ExecutorService e = new ForkJoinPool(1);
795 try {
796 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
797 shouldThrow();
798 } catch (NullPointerException success) {
799 } finally {
800 joinPool(e);
801 }
802 }
803
804 /**
805 * timed invokeAny(null time unit) throws NullPointerException
806 */
807 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
808 ExecutorService e = new ForkJoinPool(1);
809 List<Callable<String>> l = new ArrayList<Callable<String>>();
810 l.add(new StringTask());
811 try {
812 e.invokeAny(l, MEDIUM_DELAY_MS, null);
813 shouldThrow();
814 } catch (NullPointerException success) {
815 } finally {
816 joinPool(e);
817 }
818 }
819
820 /**
821 * timed invokeAny(empty collection) throws IllegalArgumentException
822 */
823 public void testTimedInvokeAny2() throws Throwable {
824 ExecutorService e = new ForkJoinPool(1);
825 try {
826 e.invokeAny(new ArrayList<Callable<String>>(),
827 MEDIUM_DELAY_MS, MILLISECONDS);
828 shouldThrow();
829 } catch (IllegalArgumentException success) {
830 } finally {
831 joinPool(e);
832 }
833 }
834
835 /**
836 * timed invokeAny(c) throws NullPointerException if c has null elements
837 */
838 public void testTimedInvokeAny3() throws Throwable {
839 CountDownLatch latch = new CountDownLatch(1);
840 ExecutorService e = new ForkJoinPool(1);
841 List<Callable<String>> l = new ArrayList<Callable<String>>();
842 l.add(latchAwaitingStringTask(latch));
843 l.add(null);
844 try {
845 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
846 shouldThrow();
847 } catch (NullPointerException success) {
848 } finally {
849 latch.countDown();
850 joinPool(e);
851 }
852 }
853
854 /**
855 * timed invokeAny(c) throws ExecutionException if no task completes
856 */
857 public void testTimedInvokeAny4() throws Throwable {
858 ExecutorService e = new ForkJoinPool(1);
859 List<Callable<String>> l = new ArrayList<Callable<String>>();
860 l.add(new NPETask());
861 try {
862 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
863 shouldThrow();
864 } catch (ExecutionException success) {
865 assertTrue(success.getCause() instanceof NullPointerException);
866 } finally {
867 joinPool(e);
868 }
869 }
870
871 /**
872 * timed invokeAny(c) returns result of some task in c
873 */
874 public void testTimedInvokeAny5() throws Throwable {
875 ExecutorService e = new ForkJoinPool(1);
876 try {
877 List<Callable<String>> l = new ArrayList<Callable<String>>();
878 l.add(new StringTask());
879 l.add(new StringTask());
880 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
881 assertSame(TEST_STRING, result);
882 } finally {
883 joinPool(e);
884 }
885 }
886
887 /**
888 * timed invokeAll(null) throws NullPointerException
889 */
890 public void testTimedInvokeAll1() throws Throwable {
891 ExecutorService e = new ForkJoinPool(1);
892 try {
893 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
894 shouldThrow();
895 } catch (NullPointerException success) {
896 } finally {
897 joinPool(e);
898 }
899 }
900
901 /**
902 * timed invokeAll(null time unit) throws NullPointerException
903 */
904 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
905 ExecutorService e = new ForkJoinPool(1);
906 List<Callable<String>> l = new ArrayList<Callable<String>>();
907 l.add(new StringTask());
908 try {
909 e.invokeAll(l, MEDIUM_DELAY_MS, null);
910 shouldThrow();
911 } catch (NullPointerException success) {
912 } finally {
913 joinPool(e);
914 }
915 }
916
917 /**
918 * timed invokeAll(empty collection) returns empty collection
919 */
920 public void testTimedInvokeAll2() throws InterruptedException {
921 ExecutorService e = new ForkJoinPool(1);
922 try {
923 List<Future<String>> r
924 = e.invokeAll(new ArrayList<Callable<String>>(),
925 MEDIUM_DELAY_MS, MILLISECONDS);
926 assertTrue(r.isEmpty());
927 } finally {
928 joinPool(e);
929 }
930 }
931
932 /**
933 * timed invokeAll(c) throws NullPointerException if c has null elements
934 */
935 public void testTimedInvokeAll3() throws InterruptedException {
936 ExecutorService e = new ForkJoinPool(1);
937 List<Callable<String>> l = new ArrayList<Callable<String>>();
938 l.add(new StringTask());
939 l.add(null);
940 try {
941 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
942 shouldThrow();
943 } catch (NullPointerException success) {
944 } finally {
945 joinPool(e);
946 }
947 }
948
949 /**
950 * get of returned element of invokeAll(c) throws exception on failed task
951 */
952 public void testTimedInvokeAll4() throws Throwable {
953 ExecutorService e = new ForkJoinPool(1);
954 List<Callable<String>> l = new ArrayList<Callable<String>>();
955 l.add(new NPETask());
956 List<Future<String>> futures
957 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
958 assertEquals(1, futures.size());
959 try {
960 futures.get(0).get();
961 shouldThrow();
962 } catch (ExecutionException success) {
963 assertTrue(success.getCause() instanceof NullPointerException);
964 } finally {
965 joinPool(e);
966 }
967 }
968
969 /**
970 * timed invokeAll(c) returns results of all completed tasks in c
971 */
972 public void testTimedInvokeAll5() throws Throwable {
973 ExecutorService e = new ForkJoinPool(1);
974 try {
975 List<Callable<String>> l = new ArrayList<Callable<String>>();
976 l.add(new StringTask());
977 l.add(new StringTask());
978 List<Future<String>> futures
979 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
980 assertEquals(2, futures.size());
981 for (Future<String> future : futures)
982 assertSame(TEST_STRING, future.get());
983 } finally {
984 joinPool(e);
985 }
986 }
987
988 }