ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.6
Committed: Mon Aug 3 22:08:07 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +135 -270 lines
Log Message:
cleanup exception handling

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