ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.28
Committed: Fri Sep 17 14:19:52 2010 UTC (13 years, 8 months ago) by dl
Branch: MAIN
Changes since 1.27: +1 -1 lines
Log Message:
testSetUncaughtExceptionHandler needs shutdownNow

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 uncaughtExceptionHappened = new CountDownLatch(1);
237 final Thread.UncaughtExceptionHandler eh =
238 new Thread.UncaughtExceptionHandler() {
239 public void uncaughtException(Thread t, Throwable e) {
240 uncaughtExceptionHappened.countDown();
241 }};
242 ForkJoinPool p = new ForkJoinPool(1, new FailingThreadFactory(),
243 eh, false);
244 try {
245 assertSame(eh, p.getUncaughtExceptionHandler());
246 p.execute(new FailingTask());
247 uncaughtExceptionHappened.await();
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 p.invoke(new FibTask(20));
263 assertSame(ForkJoinPool.defaultForkJoinWorkerThreadFactory,
264 p.getFactory());
265 Thread.sleep(MEDIUM_DELAY_MS);
266 assertTrue(p.isQuiescent());
267 assertFalse(p.getAsyncMode());
268 assertEquals(0, p.getActiveThreadCount());
269 assertEquals(0, p.getQueuedTaskCount());
270 assertEquals(0, p.getQueuedSubmissionCount());
271 assertFalse(p.hasQueuedSubmissions());
272 assertFalse(p.isShutdown());
273 assertFalse(p.isTerminating());
274 assertFalse(p.isTerminated());
275 } finally {
276 joinPool(p);
277 }
278 }
279
280 /**
281 * Completed submit(ForkJoinTask) returns result
282 */
283 public void testSubmitForkJoinTask() throws Throwable {
284 ForkJoinPool p = new ForkJoinPool(1);
285 try {
286 ForkJoinTask<Integer> f = p.submit(new FibTask(8));
287 assertEquals(21, (int) f.get());
288 } finally {
289 joinPool(p);
290 }
291 }
292
293 /**
294 * A task submitted after shutdown is rejected
295 */
296 public void testSubmitAfterShutdown() {
297 ForkJoinPool p = new ForkJoinPool(1);
298 try {
299 p.shutdown();
300 assertTrue(p.isShutdown());
301 try {
302 ForkJoinTask<Integer> f = p.submit(new FibTask(8));
303 shouldThrow();
304 } catch (RejectedExecutionException success) {}
305 } finally {
306 joinPool(p);
307 }
308 }
309
310 /**
311 * Pool maintains parallelism when using ManagedBlocker
312 */
313 public void testBlockingForkJoinTask() throws Throwable {
314 ForkJoinPool p = new ForkJoinPool(4);
315 try {
316 ReentrantLock lock = new ReentrantLock();
317 ManagedLocker locker = new ManagedLocker(lock);
318 ForkJoinTask<Integer> f = new LockingFibTask(30, locker, lock);
319 p.execute(f);
320 assertEquals(832040, (int) f.get());
321 } finally {
322 p.shutdownNow(); // don't wait out shutdown
323 }
324 }
325
326 /**
327 * pollSubmission returns unexecuted submitted task, if present
328 */
329 public void testPollSubmission() {
330 SubFJP p = new SubFJP();
331 try {
332 ForkJoinTask a = p.submit(new MediumRunnable());
333 ForkJoinTask b = p.submit(new MediumRunnable());
334 ForkJoinTask c = p.submit(new MediumRunnable());
335 ForkJoinTask r = p.pollSubmission();
336 assertTrue(r == a || r == b || r == c);
337 assertFalse(r.isDone());
338 } finally {
339 joinPool(p);
340 }
341 }
342
343 /**
344 * drainTasksTo transfers unexecuted submitted tasks, if present
345 */
346 public void testDrainTasksTo() {
347 SubFJP p = new SubFJP();
348 try {
349 ForkJoinTask a = p.submit(new MediumRunnable());
350 ForkJoinTask b = p.submit(new MediumRunnable());
351 ForkJoinTask c = p.submit(new MediumRunnable());
352 ArrayList<ForkJoinTask> al = new ArrayList();
353 p.drainTasksTo(al);
354 assertTrue(al.size() > 0);
355 for (ForkJoinTask r : al) {
356 assertTrue(r == a || r == b || r == c);
357 assertFalse(r.isDone());
358 }
359 } finally {
360 joinPool(p);
361 }
362 }
363
364
365 // FJ Versions of AbstractExecutorService tests
366
367 /**
368 * execute(runnable) runs it to completion
369 */
370 public void testExecuteRunnable() throws Throwable {
371 ExecutorService e = new ForkJoinPool(1);
372 try {
373 TrackedShortRunnable task = new TrackedShortRunnable();
374 assertFalse(task.done);
375 Future<?> future = e.submit(task);
376 future.get();
377 assertTrue(task.done);
378 } finally {
379 joinPool(e);
380 }
381 }
382
383
384 /**
385 * Completed submit(callable) returns result
386 */
387 public void testSubmitCallable() throws Throwable {
388 ExecutorService e = new ForkJoinPool(1);
389 try {
390 Future<String> future = e.submit(new StringTask());
391 String result = future.get();
392 assertSame(TEST_STRING, result);
393 } finally {
394 joinPool(e);
395 }
396 }
397
398 /**
399 * Completed submit(runnable) returns successfully
400 */
401 public void testSubmitRunnable() throws Throwable {
402 ExecutorService e = new ForkJoinPool(1);
403 try {
404 Future<?> future = e.submit(new NoOpRunnable());
405 future.get();
406 assertTrue(future.isDone());
407 } finally {
408 joinPool(e);
409 }
410 }
411
412 /**
413 * Completed submit(runnable, result) returns result
414 */
415 public void testSubmitRunnable2() throws Throwable {
416 ExecutorService e = new ForkJoinPool(1);
417 try {
418 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
419 String result = future.get();
420 assertSame(TEST_STRING, result);
421 } finally {
422 joinPool(e);
423 }
424 }
425
426
427 /**
428 * A submitted privileged action to completion
429 */
430 public void testSubmitPrivilegedAction() throws Throwable {
431 Policy savedPolicy = null;
432 try {
433 savedPolicy = Policy.getPolicy();
434 AdjustablePolicy policy = new AdjustablePolicy();
435 policy.addPermission(new RuntimePermission("getContextClassLoader"));
436 policy.addPermission(new RuntimePermission("setContextClassLoader"));
437 Policy.setPolicy(policy);
438 } catch (AccessControlException ok) {
439 return;
440 }
441
442 try {
443 ExecutorService e = new ForkJoinPool(1);
444 try {
445 Future future = e.submit(Executors.callable(new PrivilegedAction() {
446 public Object run() {
447 return TEST_STRING;
448 }}));
449
450 Object result = future.get();
451 assertSame(TEST_STRING, result);
452 } finally {
453 joinPool(e);
454 }
455 } finally {
456 Policy.setPolicy(savedPolicy);
457 }
458 }
459
460 /**
461 * A submitted a privileged exception action runs to completion
462 */
463 public void testSubmitPrivilegedExceptionAction() throws Throwable {
464 Policy savedPolicy = null;
465 try {
466 savedPolicy = Policy.getPolicy();
467 AdjustablePolicy policy = new AdjustablePolicy();
468 policy.addPermission(new RuntimePermission("getContextClassLoader"));
469 policy.addPermission(new RuntimePermission("setContextClassLoader"));
470 Policy.setPolicy(policy);
471 } catch (AccessControlException ok) {
472 return;
473 }
474
475 try {
476 ExecutorService e = new ForkJoinPool(1);
477 try {
478 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
479 public Object run() {
480 return TEST_STRING;
481 }}));
482
483 Object result = future.get();
484 assertSame(TEST_STRING, result);
485 } finally {
486 joinPool(e);
487 }
488 } finally {
489 Policy.setPolicy(savedPolicy);
490 }
491 }
492
493 /**
494 * A submitted failed privileged exception action reports exception
495 */
496 public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
497 Policy savedPolicy = null;
498 try {
499 savedPolicy = Policy.getPolicy();
500 AdjustablePolicy policy = new AdjustablePolicy();
501 policy.addPermission(new RuntimePermission("getContextClassLoader"));
502 policy.addPermission(new RuntimePermission("setContextClassLoader"));
503 Policy.setPolicy(policy);
504 } catch (AccessControlException ok) {
505 return;
506 }
507
508 try {
509 ExecutorService e = new ForkJoinPool(1);
510 try {
511 Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
512 public Object run() throws Exception {
513 throw new IndexOutOfBoundsException();
514 }}));
515
516 Object result = future.get();
517 shouldThrow();
518 } catch (ExecutionException success) {
519 assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
520 } finally {
521 joinPool(e);
522 }
523 } finally {
524 Policy.setPolicy(savedPolicy);
525 }
526 }
527
528 /**
529 * execute(null runnable) throws NullPointerException
530 */
531 public void testExecuteNullRunnable() {
532 ExecutorService e = new ForkJoinPool(1);
533 TrackedShortRunnable task = null;
534 try {
535 Future<?> future = e.submit(task);
536 shouldThrow();
537 } catch (NullPointerException success) {
538 } finally {
539 joinPool(e);
540 }
541 }
542
543
544 /**
545 * submit(null callable) throws NullPointerException
546 */
547 public void testSubmitNullCallable() {
548 ExecutorService e = new ForkJoinPool(1);
549 StringTask t = null;
550 try {
551 Future<String> future = e.submit(t);
552 shouldThrow();
553 } catch (NullPointerException success) {
554 } finally {
555 joinPool(e);
556 }
557 }
558
559
560 /**
561 * submit(callable).get() throws InterruptedException if interrupted
562 */
563 public void testInterruptedSubmit() throws InterruptedException {
564 final CountDownLatch submitted = new CountDownLatch(1);
565 final CountDownLatch quittingTime = new CountDownLatch(1);
566 final ExecutorService p = new ForkJoinPool(1);
567 final Callable<Void> awaiter = new CheckedCallable<Void>() {
568 public Void realCall() throws InterruptedException {
569 assertTrue(quittingTime.await(MEDIUM_DELAY_MS, MILLISECONDS));
570 return null;
571 }};
572 try {
573 Thread t = new Thread(new CheckedInterruptedRunnable() {
574 public void realRun() throws Exception {
575 Future<Void> future = p.submit(awaiter);
576 submitted.countDown();
577 future.get();
578 }});
579 t.start();
580 assertTrue(submitted.await(MEDIUM_DELAY_MS, MILLISECONDS));
581 t.interrupt();
582 t.join();
583 } finally {
584 quittingTime.countDown();
585 joinPool(p);
586 }
587 }
588
589 /**
590 * get of submit(callable) throws ExecutionException if callable
591 * throws exception
592 */
593 public void testSubmitEE() throws Throwable {
594 ForkJoinPool p = new ForkJoinPool(1);
595 try {
596 p.submit(new Callable() {
597 public Object call() {
598 int i = 5/0;
599 return Boolean.TRUE;
600 }}).get();
601 shouldThrow();
602 } catch (ExecutionException success) {
603 assertTrue(success.getCause() instanceof ArithmeticException);
604 } finally {
605 joinPool(p);
606 }
607 }
608
609 /**
610 * invokeAny(null) throws NullPointerException
611 */
612 public void testInvokeAny1() throws Throwable {
613 ExecutorService e = new ForkJoinPool(1);
614 try {
615 e.invokeAny(null);
616 shouldThrow();
617 } catch (NullPointerException success) {
618 } finally {
619 joinPool(e);
620 }
621 }
622
623 /**
624 * invokeAny(empty collection) throws IllegalArgumentException
625 */
626 public void testInvokeAny2() throws Throwable {
627 ExecutorService e = new ForkJoinPool(1);
628 try {
629 e.invokeAny(new ArrayList<Callable<String>>());
630 shouldThrow();
631 } catch (IllegalArgumentException success) {
632 } finally {
633 joinPool(e);
634 }
635 }
636
637 /**
638 * invokeAny(c) throws NullPointerException if c has a single null element
639 */
640 public void testInvokeAny3() throws Throwable {
641 ExecutorService e = new ForkJoinPool(1);
642 List<Callable<String>> l = new ArrayList<Callable<String>>();
643 l.add(null);
644 try {
645 e.invokeAny(l);
646 shouldThrow();
647 } catch (NullPointerException success) {
648 } finally {
649 joinPool(e);
650 }
651 }
652
653 /**
654 * invokeAny(c) throws NullPointerException if c has null elements
655 */
656 public void testInvokeAny4() throws Throwable {
657 CountDownLatch latch = new CountDownLatch(1);
658 ExecutorService e = new ForkJoinPool(1);
659 List<Callable<String>> l = new ArrayList<Callable<String>>();
660 l.add(latchAwaitingStringTask(latch));
661 l.add(null);
662 try {
663 e.invokeAny(l);
664 shouldThrow();
665 } catch (NullPointerException success) {
666 } finally {
667 latch.countDown();
668 joinPool(e);
669 }
670 }
671
672 /**
673 * invokeAny(c) throws ExecutionException if no task in c completes
674 */
675 public void testInvokeAny5() throws Throwable {
676 ExecutorService e = new ForkJoinPool(1);
677 List<Callable<String>> l = new ArrayList<Callable<String>>();
678 l.add(new NPETask());
679 try {
680 e.invokeAny(l);
681 shouldThrow();
682 } catch (ExecutionException success) {
683 assertTrue(success.getCause() instanceof NullPointerException);
684 } finally {
685 joinPool(e);
686 }
687 }
688
689 /**
690 * invokeAny(c) returns result of some task in c if at least one completes
691 */
692 public void testInvokeAny6() throws Throwable {
693 ExecutorService e = new ForkJoinPool(1);
694 try {
695 List<Callable<String>> l = new ArrayList<Callable<String>>();
696 l.add(new StringTask());
697 l.add(new StringTask());
698 String result = e.invokeAny(l);
699 assertSame(TEST_STRING, result);
700 } finally {
701 joinPool(e);
702 }
703 }
704
705 /**
706 * invokeAll(null) throws NullPointerException
707 */
708 public void testInvokeAll1() throws Throwable {
709 ExecutorService e = new ForkJoinPool(1);
710 try {
711 e.invokeAll(null);
712 shouldThrow();
713 } catch (NullPointerException success) {
714 } finally {
715 joinPool(e);
716 }
717 }
718
719 /**
720 * invokeAll(empty collection) returns empty collection
721 */
722 public void testInvokeAll2() throws InterruptedException {
723 ExecutorService e = new ForkJoinPool(1);
724 try {
725 List<Future<String>> r
726 = e.invokeAll(new ArrayList<Callable<String>>());
727 assertTrue(r.isEmpty());
728 } finally {
729 joinPool(e);
730 }
731 }
732
733 /**
734 * invokeAll(c) throws NullPointerException if c has null elements
735 */
736 public void testInvokeAll3() throws InterruptedException {
737 ExecutorService e = new ForkJoinPool(1);
738 List<Callable<String>> l = new ArrayList<Callable<String>>();
739 l.add(new StringTask());
740 l.add(null);
741 try {
742 e.invokeAll(l);
743 shouldThrow();
744 } catch (NullPointerException success) {
745 } finally {
746 joinPool(e);
747 }
748 }
749
750 /**
751 * get of returned element of invokeAll(c) throws
752 * ExecutionException on failed task
753 */
754 public void testInvokeAll4() throws Throwable {
755 ExecutorService e = new ForkJoinPool(1);
756 List<Callable<String>> l = new ArrayList<Callable<String>>();
757 l.add(new NPETask());
758 List<Future<String>> futures = e.invokeAll(l);
759 assertEquals(1, futures.size());
760 try {
761 futures.get(0).get();
762 shouldThrow();
763 } catch (ExecutionException success) {
764 assertTrue(success.getCause() instanceof NullPointerException);
765 } finally {
766 joinPool(e);
767 }
768 }
769
770 /**
771 * invokeAll(c) returns results of all completed tasks in c
772 */
773 public void testInvokeAll5() throws Throwable {
774 ExecutorService e = new ForkJoinPool(1);
775 try {
776 List<Callable<String>> l = new ArrayList<Callable<String>>();
777 l.add(new StringTask());
778 l.add(new StringTask());
779 List<Future<String>> futures = e.invokeAll(l);
780 assertEquals(2, futures.size());
781 for (Future<String> future : futures)
782 assertSame(TEST_STRING, future.get());
783 } finally {
784 joinPool(e);
785 }
786 }
787
788
789 /**
790 * timed invokeAny(null) throws NullPointerException
791 */
792 public void testTimedInvokeAny1() throws Throwable {
793 ExecutorService e = new ForkJoinPool(1);
794 try {
795 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
796 shouldThrow();
797 } catch (NullPointerException success) {
798 } finally {
799 joinPool(e);
800 }
801 }
802
803 /**
804 * timed invokeAny(null time unit) throws NullPointerException
805 */
806 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
807 ExecutorService e = new ForkJoinPool(1);
808 List<Callable<String>> l = new ArrayList<Callable<String>>();
809 l.add(new StringTask());
810 try {
811 e.invokeAny(l, MEDIUM_DELAY_MS, null);
812 shouldThrow();
813 } catch (NullPointerException success) {
814 } finally {
815 joinPool(e);
816 }
817 }
818
819 /**
820 * timed invokeAny(empty collection) throws IllegalArgumentException
821 */
822 public void testTimedInvokeAny2() throws Throwable {
823 ExecutorService e = new ForkJoinPool(1);
824 try {
825 e.invokeAny(new ArrayList<Callable<String>>(),
826 MEDIUM_DELAY_MS, MILLISECONDS);
827 shouldThrow();
828 } catch (IllegalArgumentException success) {
829 } finally {
830 joinPool(e);
831 }
832 }
833
834 /**
835 * timed invokeAny(c) throws NullPointerException if c has null elements
836 */
837 public void testTimedInvokeAny3() throws Throwable {
838 CountDownLatch latch = new CountDownLatch(1);
839 ExecutorService e = new ForkJoinPool(1);
840 List<Callable<String>> l = new ArrayList<Callable<String>>();
841 l.add(latchAwaitingStringTask(latch));
842 l.add(null);
843 try {
844 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
845 shouldThrow();
846 } catch (NullPointerException success) {
847 } finally {
848 latch.countDown();
849 joinPool(e);
850 }
851 }
852
853 /**
854 * timed invokeAny(c) throws ExecutionException if no task completes
855 */
856 public void testTimedInvokeAny4() throws Throwable {
857 ExecutorService e = new ForkJoinPool(1);
858 List<Callable<String>> l = new ArrayList<Callable<String>>();
859 l.add(new NPETask());
860 try {
861 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
862 shouldThrow();
863 } catch (ExecutionException success) {
864 assertTrue(success.getCause() instanceof NullPointerException);
865 } finally {
866 joinPool(e);
867 }
868 }
869
870 /**
871 * timed invokeAny(c) returns result of some task in c
872 */
873 public void testTimedInvokeAny5() throws Throwable {
874 ExecutorService e = new ForkJoinPool(1);
875 try {
876 List<Callable<String>> l = new ArrayList<Callable<String>>();
877 l.add(new StringTask());
878 l.add(new StringTask());
879 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
880 assertSame(TEST_STRING, result);
881 } finally {
882 joinPool(e);
883 }
884 }
885
886 /**
887 * timed invokeAll(null) throws NullPointerException
888 */
889 public void testTimedInvokeAll1() throws Throwable {
890 ExecutorService e = new ForkJoinPool(1);
891 try {
892 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
893 shouldThrow();
894 } catch (NullPointerException success) {
895 } finally {
896 joinPool(e);
897 }
898 }
899
900 /**
901 * timed invokeAll(null time unit) throws NullPointerException
902 */
903 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
904 ExecutorService e = new ForkJoinPool(1);
905 List<Callable<String>> l = new ArrayList<Callable<String>>();
906 l.add(new StringTask());
907 try {
908 e.invokeAll(l, MEDIUM_DELAY_MS, null);
909 shouldThrow();
910 } catch (NullPointerException success) {
911 } finally {
912 joinPool(e);
913 }
914 }
915
916 /**
917 * timed invokeAll(empty collection) returns empty collection
918 */
919 public void testTimedInvokeAll2() throws InterruptedException {
920 ExecutorService e = new ForkJoinPool(1);
921 try {
922 List<Future<String>> r
923 = e.invokeAll(new ArrayList<Callable<String>>(),
924 MEDIUM_DELAY_MS, MILLISECONDS);
925 assertTrue(r.isEmpty());
926 } finally {
927 joinPool(e);
928 }
929 }
930
931 /**
932 * timed invokeAll(c) throws NullPointerException if c has null elements
933 */
934 public void testTimedInvokeAll3() throws InterruptedException {
935 ExecutorService e = new ForkJoinPool(1);
936 List<Callable<String>> l = new ArrayList<Callable<String>>();
937 l.add(new StringTask());
938 l.add(null);
939 try {
940 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
941 shouldThrow();
942 } catch (NullPointerException success) {
943 } finally {
944 joinPool(e);
945 }
946 }
947
948 /**
949 * get of returned element of invokeAll(c) throws exception on failed task
950 */
951 public void testTimedInvokeAll4() throws Throwable {
952 ExecutorService e = new ForkJoinPool(1);
953 List<Callable<String>> l = new ArrayList<Callable<String>>();
954 l.add(new NPETask());
955 List<Future<String>> futures
956 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
957 assertEquals(1, futures.size());
958 try {
959 futures.get(0).get();
960 shouldThrow();
961 } catch (ExecutionException success) {
962 assertTrue(success.getCause() instanceof NullPointerException);
963 } finally {
964 joinPool(e);
965 }
966 }
967
968 /**
969 * timed invokeAll(c) returns results of all completed tasks in c
970 */
971 public void testTimedInvokeAll5() throws Throwable {
972 ExecutorService e = new ForkJoinPool(1);
973 try {
974 List<Callable<String>> l = new ArrayList<Callable<String>>();
975 l.add(new StringTask());
976 l.add(new StringTask());
977 List<Future<String>> futures
978 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
979 assertEquals(2, futures.size());
980 for (Future<String> future : futures)
981 assertSame(TEST_STRING, future.get());
982 } finally {
983 joinPool(e);
984 }
985 }
986
987 }