ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.68
Committed: Thu Oct 8 03:08:37 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.67: +3 -1 lines
Log Message:
improve testTimedInvokeAny5

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