ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.18
Committed: Mon Feb 22 11:25:16 2010 UTC (14 years, 2 months ago) by dl
Branch: MAIN
Changes since 1.17: +1 -1 lines
Log Message:
fix wrong accessor call in testGetPoolSize

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