ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.25
Committed: Mon Sep 13 20:48:58 2010 UTC (13 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.24: +3 -1 lines
Log Message:
fix imports

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