ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.41
Committed: Fri May 27 19:42:42 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.40: +0 -6 lines
Log Message:
whitespace

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