ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.36
Committed: Mon Nov 29 07:42:58 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.35: +12 -6 lines
Log Message:
remove unreliable sleeps from testDrainTasksTo and testPollSubmission

File Contents

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