ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.7
Committed: Tue Aug 4 00:23:18 2009 UTC (14 years, 9 months ago) by dl
Branch: MAIN
Changes since 1.6: +2 -3 lines
Log Message:
fix 2 tests

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 p.shutdownNow(); // don't wait out shutdown
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 t.interrupt();
646 p.shutdownNow();
647 }
648
649 /**
650 * get of submit(callable) throws ExecutionException if callable
651 * throws exception
652 */
653 public void testSubmitEE() throws Throwable {
654 ForkJoinPool p = new ForkJoinPool(1);
655
656 try {
657 Callable c = new Callable() {
658 public Object call() {
659 int i = 5/0;
660 return Boolean.TRUE;
661 }
662 };
663
664 for (int i = 0; i < 5; i++) {
665 p.submit(c).get();
666 }
667 shouldThrow();
668 } catch (ExecutionException success) {
669 }
670 joinPool(p);
671 }
672
673 /**
674 * invokeAny(null) throws NullPointerException
675 */
676 public void testInvokeAny1() throws Throwable {
677 ExecutorService e = new ForkJoinPool(1);
678 try {
679 e.invokeAny(null);
680 shouldThrow();
681 } catch (NullPointerException success) {
682 } finally {
683 joinPool(e);
684 }
685 }
686
687 /**
688 * invokeAny(empty collection) throws IllegalArgumentException
689 */
690 public void testInvokeAny2() throws Throwable {
691 ExecutorService e = new ForkJoinPool(1);
692 try {
693 e.invokeAny(new ArrayList<Callable<String>>());
694 shouldThrow();
695 } catch (IllegalArgumentException success) {
696 } finally {
697 joinPool(e);
698 }
699 }
700
701 /**
702 * invokeAny(c) throws NullPointerException if c has null elements
703 */
704 public void testInvokeAny3() throws Throwable {
705 ExecutorService e = new ForkJoinPool(1);
706 try {
707 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
708 l.add(new StringTask());
709 l.add(null);
710 e.invokeAny(l);
711 shouldThrow();
712 } catch (NullPointerException success) {
713 } finally {
714 joinPool(e);
715 }
716 }
717
718 /**
719 * invokeAny(c) throws ExecutionException if no task in c completes
720 */
721 public void testInvokeAny4() throws Throwable {
722 ExecutorService e = new ForkJoinPool(1);
723 try {
724 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
725 l.add(new NPETask());
726 e.invokeAny(l);
727 shouldThrow();
728 } catch (ExecutionException success) {
729 } finally {
730 joinPool(e);
731 }
732 }
733
734 /**
735 * invokeAny(c) returns result of some task in c if at least one completes
736 */
737 public void testInvokeAny5() throws Throwable {
738 ExecutorService e = new ForkJoinPool(1);
739 try {
740 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
741 l.add(new StringTask());
742 l.add(new StringTask());
743 String result = e.invokeAny(l);
744 assertSame(TEST_STRING, result);
745 } finally {
746 joinPool(e);
747 }
748 }
749
750 /**
751 * invokeAll(null) throws NullPointerException
752 */
753 public void testInvokeAll1() throws Throwable {
754 ExecutorService e = new ForkJoinPool(1);
755 try {
756 e.invokeAll(null);
757 shouldThrow();
758 } catch (NullPointerException success) {
759 } finally {
760 joinPool(e);
761 }
762 }
763
764 /**
765 * invokeAll(empty collection) returns empty collection
766 */
767 public void testInvokeAll2() throws InterruptedException {
768 ExecutorService e = new ForkJoinPool(1);
769 try {
770 List<Future<String>> r
771 = e.invokeAll(new ArrayList<Callable<String>>());
772 assertTrue(r.isEmpty());
773 } finally {
774 joinPool(e);
775 }
776 }
777
778 /**
779 * invokeAll(c) throws NullPointerException if c has null elements
780 */
781 public void testInvokeAll3() throws InterruptedException {
782 ExecutorService e = new ForkJoinPool(1);
783 try {
784 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
785 l.add(new StringTask());
786 l.add(null);
787 e.invokeAll(l);
788 shouldThrow();
789 } catch (NullPointerException success) {
790 } finally {
791 joinPool(e);
792 }
793 }
794
795 /**
796 * get of returned element of invokeAll(c) throws
797 * ExecutionException on failed task
798 */
799 public void testInvokeAll4() throws Throwable {
800 ExecutorService e = new ForkJoinPool(1);
801 try {
802 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
803 l.add(new NPETask());
804 List<Future<String>> result = e.invokeAll(l);
805 assertEquals(1, result.size());
806 for (Future<String> future : result)
807 future.get();
808 shouldThrow();
809 } catch (ExecutionException success) {
810 } finally {
811 joinPool(e);
812 }
813 }
814
815 /**
816 * invokeAll(c) returns results of all completed tasks in c
817 */
818 public void testInvokeAll5() throws Throwable {
819 ExecutorService e = new ForkJoinPool(1);
820 try {
821 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
822 l.add(new StringTask());
823 l.add(new StringTask());
824 List<Future<String>> result = e.invokeAll(l);
825 assertEquals(2, result.size());
826 for (Future<String> future : result)
827 assertSame(TEST_STRING, future.get());
828 } finally {
829 joinPool(e);
830 }
831 }
832
833
834 /**
835 * timed invokeAny(null) throws NullPointerException
836 */
837 public void testTimedInvokeAny1() throws Throwable {
838 ExecutorService e = new ForkJoinPool(1);
839 try {
840 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
841 shouldThrow();
842 } catch (NullPointerException success) {
843 } finally {
844 joinPool(e);
845 }
846 }
847
848 /**
849 * timed invokeAny(null time unit) throws NullPointerException
850 */
851 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
852 ExecutorService e = new ForkJoinPool(1);
853 try {
854 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
855 l.add(new StringTask());
856 e.invokeAny(l, MEDIUM_DELAY_MS, null);
857 shouldThrow();
858 } catch (NullPointerException success) {
859 } finally {
860 joinPool(e);
861 }
862 }
863
864 /**
865 * timed invokeAny(empty collection) throws IllegalArgumentException
866 */
867 public void testTimedInvokeAny2() throws Throwable {
868 ExecutorService e = new ForkJoinPool(1);
869 try {
870 e.invokeAny(new ArrayList<Callable<String>>(),
871 MEDIUM_DELAY_MS, MILLISECONDS);
872 shouldThrow();
873 } catch (IllegalArgumentException success) {
874 } finally {
875 joinPool(e);
876 }
877 }
878
879 /**
880 * timed invokeAny(c) throws NullPointerException if c has null elements
881 */
882 public void testTimedInvokeAny3() throws Throwable {
883 ExecutorService e = new ForkJoinPool(1);
884 try {
885 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
886 l.add(new StringTask());
887 l.add(null);
888 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
889 shouldThrow();
890 } catch (NullPointerException success) {
891 } finally {
892 joinPool(e);
893 }
894 }
895
896 /**
897 * timed invokeAny(c) throws ExecutionException if no task completes
898 */
899 public void testTimedInvokeAny4() throws Throwable {
900 ExecutorService e = new ForkJoinPool(1);
901 try {
902 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
903 l.add(new NPETask());
904 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
905 shouldThrow();
906 } catch (ExecutionException success) {
907 } finally {
908 joinPool(e);
909 }
910 }
911
912 /**
913 * timed invokeAny(c) returns result of some task in c
914 */
915 public void testTimedInvokeAny5() throws Throwable {
916 ExecutorService e = new ForkJoinPool(1);
917 try {
918 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
919 l.add(new StringTask());
920 l.add(new StringTask());
921 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
922 assertSame(TEST_STRING, result);
923 } finally {
924 joinPool(e);
925 }
926 }
927
928 /**
929 * timed invokeAll(null) throws NullPointerException
930 */
931 public void testTimedInvokeAll1() throws Throwable {
932 ExecutorService e = new ForkJoinPool(1);
933 try {
934 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
935 shouldThrow();
936 } catch (NullPointerException success) {
937 } finally {
938 joinPool(e);
939 }
940 }
941
942 /**
943 * timed invokeAll(null time unit) throws NullPointerException
944 */
945 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
946 ExecutorService e = new ForkJoinPool(1);
947 try {
948 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
949 l.add(new StringTask());
950 e.invokeAll(l, MEDIUM_DELAY_MS, null);
951 shouldThrow();
952 } catch (NullPointerException success) {
953 } finally {
954 joinPool(e);
955 }
956 }
957
958 /**
959 * timed invokeAll(empty collection) returns empty collection
960 */
961 public void testTimedInvokeAll2() throws InterruptedException {
962 ExecutorService e = new ForkJoinPool(1);
963 try {
964 List<Future<String>> r
965 = e.invokeAll(new ArrayList<Callable<String>>(),
966 MEDIUM_DELAY_MS, MILLISECONDS);
967 assertTrue(r.isEmpty());
968 } finally {
969 joinPool(e);
970 }
971 }
972
973 /**
974 * timed invokeAll(c) throws NullPointerException if c has null elements
975 */
976 public void testTimedInvokeAll3() throws InterruptedException {
977 ExecutorService e = new ForkJoinPool(1);
978 try {
979 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
980 l.add(new StringTask());
981 l.add(null);
982 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
983 shouldThrow();
984 } catch (NullPointerException success) {
985 } finally {
986 joinPool(e);
987 }
988 }
989
990 /**
991 * get of returned element of invokeAll(c) throws exception on failed task
992 */
993 public void testTimedInvokeAll4() throws Throwable {
994 ExecutorService e = new ForkJoinPool(1);
995 try {
996 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
997 l.add(new NPETask());
998 List<Future<String>> result
999 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1000 assertEquals(1, result.size());
1001 for (Future<String> future : result)
1002 future.get();
1003 shouldThrow();
1004 } catch (ExecutionException success) {
1005 } finally {
1006 joinPool(e);
1007 }
1008 }
1009
1010 /**
1011 * timed invokeAll(c) returns results of all completed tasks in c
1012 */
1013 public void testTimedInvokeAll5() throws Throwable {
1014 ExecutorService e = new ForkJoinPool(1);
1015 try {
1016 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1017 l.add(new StringTask());
1018 l.add(new StringTask());
1019 List<Future<String>> result
1020 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1021 assertEquals(2, result.size());
1022 for (Future<String> future : result)
1023 assertSame(TEST_STRING, future.get());
1024 } finally {
1025 joinPool(e);
1026 }
1027 }
1028
1029 }