ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPoolTest.java
Revision: 1.17
Committed: Tue Jan 5 02:08:37 2010 UTC (14 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.16: +32 -64 lines
Log Message:
Make tests security-manager-aware

File Contents

# User Rev Content
1 dl 1.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 jsr166 1.6 import static java.util.concurrent.TimeUnit.MILLISECONDS;
12 dl 1.1 import java.util.concurrent.locks.*;
13     import java.security.*;
14    
15 jsr166 1.3 public class ForkJoinPoolTest extends JSR166TestCase {
16 dl 1.1 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 jsr166 1.2 *
30 dl 1.1 * 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 jsr166 1.2 *
35 dl 1.1 * 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 jsr166 1.6 static class FailingThreadFactory
55     implements ForkJoinPool.ForkJoinWorkerThreadFactory {
56 dl 1.1 int calls = 0;
57 jsr166 1.2 public ForkJoinWorkerThread newThread(ForkJoinPool p) {
58 dl 1.1 if (++calls > 1) return null;
59     return new FailingFJWSubclass(p);
60 jsr166 1.2 }
61 dl 1.1 }
62    
63 jsr166 1.2 static class SubFJP extends ForkJoinPool { // to expose protected
64 dl 1.1 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 jsr166 1.2 static final class FibTask extends RecursiveTask<Integer> {
89 dl 1.1 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 jsr166 1.2 static final class FailingTask extends ForkJoinTask<Void> {
103 dl 1.1 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 jsr166 1.2 static final class LockingFibTask extends RecursiveTask<Integer> {
111 dl 1.1 final int number;
112     final ManagedLocker locker;
113     final ReentrantLock lock;
114 jsr166 1.2 LockingFibTask(int n, ManagedLocker locker, ReentrantLock lock) {
115     number = n;
116 dl 1.1 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 jsr166 1.2 n = number;
125 dl 1.1 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 jsr166 1.2 /**
140 jsr166 1.5 * Successfully constructed pool reports default factory,
141 dl 1.1 * 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 jsr166 1.6 assertTrue(p.getFactory() ==
149     ForkJoinPool.defaultForkJoinWorkerThreadFactory);
150 dl 1.1 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 jsr166 1.2 /**
167     * Constructor throws if size argument is less than zero
168 dl 1.1 */
169     public void testConstructor1() {
170     try {
171     new ForkJoinPool(-1);
172     shouldThrow();
173 jsr166 1.10 } catch (IllegalArgumentException success) {}
174 dl 1.1 }
175    
176 jsr166 1.2 /**
177     * Constructor throws if factory argument is null
178 dl 1.1 */
179     public void testConstructor2() {
180     try {
181     new ForkJoinPool(1, null);
182     shouldThrow();
183 jsr166 1.10 } catch (NullPointerException success) {}
184 dl 1.1 }
185    
186    
187 jsr166 1.2 /**
188     * getParallelism returns size set in constructor
189 dl 1.1 */
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 jsr166 1.2 /**
201 dl 1.1 * 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 jsr166 1.2 /**
216 dl 1.1 * 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 jsr166 1.2 } catch (IllegalArgumentException success) {
226 dl 1.1 } finally {
227     joinPool(p);
228     }
229     }
230    
231 jsr166 1.2 /**
232 dl 1.1 * 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.getPoolSize() == 0);
239     Future<String> future = p.submit(new StringTask());
240     assertTrue(p.getPoolSize() == 1);
241    
242     } finally {
243     joinPool(p);
244     }
245     }
246    
247 jsr166 1.2 /**
248 dl 1.1 * 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 jsr166 1.2 /**
262 dl 1.1 * 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 jsr166 1.2 } catch (IllegalArgumentException success) {
271 dl 1.1 } finally {
272     joinPool(p);
273     }
274     }
275    
276 jsr166 1.2 /**
277 dl 1.1 * 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 jsr166 1.2
291     /**
292 dl 1.1 * 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 jsr166 1.2 /**
307 dl 1.1 * setUncaughtExceptionHandler changes handler for uncaught exceptions.
308     *
309     * Additionally tests: Overriding ForkJoinWorkerThread.onStart
310     * performs its defined action
311     */
312 jsr166 1.6 public void testSetUncaughtExceptionHandler() throws InterruptedException {
313 dl 1.1 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 jsr166 1.2 /**
328 dl 1.1 * 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 jsr166 1.2 /**
343 dl 1.1 * 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 jsr166 1.6 public void testisQuiescent() throws InterruptedException {
348 dl 1.1 ForkJoinPool p = null;
349     try {
350     p = new ForkJoinPool(2);
351     p.invoke(new FibTask(20));
352 jsr166 1.6 assertTrue(p.getFactory() ==
353     ForkJoinPool.defaultForkJoinWorkerThreadFactory);
354 dl 1.1 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 jsr166 1.6 public void testSubmitForkJoinTask() throws Throwable {
374 dl 1.1 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 jsr166 1.6 public void testBlockingForkJoinTask() throws Throwable {
406 dl 1.1 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 jsr166 1.14 assertTrue(r == 832040);
416 dl 1.1 } finally {
417 dl 1.7 p.shutdownNow(); // don't wait out shutdown
418 dl 1.1 }
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 jsr166 1.2
462 dl 1.1 // FJ Versions of AbstractExecutorService tests
463    
464     /**
465     * execute(runnable) runs it to completion
466     */
467 jsr166 1.6 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 dl 1.1 }
475    
476    
477     /**
478     * Completed submit(callable) returns result
479     */
480 jsr166 1.6 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 dl 1.1 }
486    
487     /**
488     * Completed submit(runnable) returns successfully
489     */
490 jsr166 1.6 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 dl 1.1 }
496    
497     /**
498     * Completed submit(runnable, result) returns result
499     */
500 jsr166 1.6 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 dl 1.1 }
506    
507     /**
508 jsr166 1.17 * A submitted privileged action runs to completion
509 dl 1.1 */
510 jsr166 1.6 public void testSubmitPrivilegedAction() throws Throwable {
511 jsr166 1.17 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 dl 1.1 public Object run() {
516     return TEST_STRING;
517     }}));
518    
519 jsr166 1.17 Object result = future.get();
520     assertSame(TEST_STRING, result);
521     }};
522    
523     runWithPermissions(r, new RuntimePermission("modifyThread"));
524 dl 1.1 }
525    
526     /**
527 jsr166 1.17 * A submitted privileged exception action runs to completion
528 dl 1.1 */
529 jsr166 1.6 public void testSubmitPrivilegedExceptionAction() throws Throwable {
530 jsr166 1.17 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 dl 1.1 public Object run() {
535     return TEST_STRING;
536     }}));
537    
538 jsr166 1.17 Object result = future.get();
539     assertSame(TEST_STRING, result);
540     }};
541    
542     runWithPermissions(r, new RuntimePermission("modifyThread"));
543 dl 1.1 }
544    
545     /**
546     * A submitted failed privileged exception action reports exception
547     */
548 jsr166 1.6 public void testSubmitFailedPrivilegedExceptionAction() throws Throwable {
549 jsr166 1.17 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 dl 1.1 public Object run() throws Exception {
554     throw new IndexOutOfBoundsException();
555     }}));
556    
557 jsr166 1.17 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 dl 1.1 }
566    
567     /**
568 jsr166 1.6 * execute(null runnable) throws NullPointerException
569 dl 1.1 */
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 jsr166 1.10 } catch (NullPointerException success) {}
577 dl 1.1 }
578    
579    
580     /**
581 jsr166 1.6 * submit(null callable) throws NullPointerException
582 dl 1.1 */
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 jsr166 1.10 } catch (NullPointerException success) {}
590 dl 1.1 }
591    
592    
593     /**
594 jsr166 1.4 * Blocking on submit(callable) throws InterruptedException if
595     * caller interrupted.
596 dl 1.1 */
597 jsr166 1.6 public void testInterruptedSubmit() throws InterruptedException {
598 dl 1.1 final ForkJoinPool p = new ForkJoinPool(1);
599    
600 jsr166 1.6 Thread t = new Thread(new CheckedInterruptedRunnable() {
601 jsr166 1.13 public void realRun() throws Throwable {
602 jsr166 1.6 p.submit(new CheckedCallable<Object>() {
603     public Object realCall() throws Throwable {
604 jsr166 1.8 try {
605     Thread.sleep(MEDIUM_DELAY_MS);
606     } catch (InterruptedException ok) {
607     }
608 jsr166 1.6 return null;
609     }}).get();
610     }});
611    
612     t.start();
613 jsr166 1.8 Thread.sleep(SHORT_DELAY_MS);
614 jsr166 1.6 t.interrupt();
615 jsr166 1.8 t.join();
616 dl 1.7 p.shutdownNow();
617 jsr166 1.8 joinPool(p);
618 dl 1.1 }
619    
620     /**
621 jsr166 1.4 * get of submit(callable) throws ExecutionException if callable
622     * throws exception
623 dl 1.1 */
624 jsr166 1.6 public void testSubmitEE() throws Throwable {
625 dl 1.1 ForkJoinPool p = new ForkJoinPool(1);
626     try {
627 jsr166 1.8 p.submit(new Callable() {
628     public Object call() {
629     int i = 5/0;
630     return Boolean.TRUE;
631     }}).get();
632 dl 1.1 shouldThrow();
633 jsr166 1.12 } catch (ExecutionException success) {
634     assertTrue(success.getCause() instanceof ArithmeticException);
635     }
636 jsr166 1.10
637 dl 1.1 joinPool(p);
638     }
639    
640     /**
641 jsr166 1.6 * invokeAny(null) throws NullPointerException
642 dl 1.1 */
643 jsr166 1.6 public void testInvokeAny1() throws Throwable {
644 dl 1.1 ExecutorService e = new ForkJoinPool(1);
645     try {
646     e.invokeAny(null);
647 jsr166 1.6 shouldThrow();
648 dl 1.1 } catch (NullPointerException success) {
649     } finally {
650     joinPool(e);
651     }
652     }
653    
654     /**
655 jsr166 1.6 * invokeAny(empty collection) throws IllegalArgumentException
656 dl 1.1 */
657 jsr166 1.6 public void testInvokeAny2() throws Throwable {
658 dl 1.1 ExecutorService e = new ForkJoinPool(1);
659     try {
660     e.invokeAny(new ArrayList<Callable<String>>());
661 jsr166 1.6 shouldThrow();
662 dl 1.1 } catch (IllegalArgumentException success) {
663     } finally {
664     joinPool(e);
665     }
666     }
667    
668     /**
669 jsr166 1.9 * 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 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
674     l.add(null);
675 jsr166 1.9 try {
676     e.invokeAny(l);
677     shouldThrow();
678     } catch (NullPointerException success) {
679     } finally {
680     joinPool(e);
681     }
682     }
683    
684     /**
685 jsr166 1.6 * invokeAny(c) throws NullPointerException if c has null elements
686 dl 1.1 */
687 jsr166 1.9 public void testInvokeAny4() throws Throwable {
688 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
689 dl 1.1 ExecutorService e = new ForkJoinPool(1);
690 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
691     l.add(latchAwaitingStringTask(latch));
692     l.add(null);
693 dl 1.1 try {
694     e.invokeAny(l);
695 jsr166 1.6 shouldThrow();
696 dl 1.1 } catch (NullPointerException success) {
697     } finally {
698 jsr166 1.16 latch.countDown();
699 dl 1.1 joinPool(e);
700     }
701     }
702    
703     /**
704     * invokeAny(c) throws ExecutionException if no task in c completes
705     */
706 jsr166 1.9 public void testInvokeAny5() throws Throwable {
707 dl 1.1 ExecutorService e = new ForkJoinPool(1);
708 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
709     l.add(new NPETask());
710 dl 1.1 try {
711     e.invokeAny(l);
712 jsr166 1.6 shouldThrow();
713 jsr166 1.2 } catch (ExecutionException success) {
714 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
715 dl 1.1 } 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 jsr166 1.9 public void testInvokeAny6() throws Throwable {
724 dl 1.1 ExecutorService e = new ForkJoinPool(1);
725     try {
726 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
727 dl 1.1 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 jsr166 1.6 * invokeAll(null) throws NullPointerException
738 dl 1.1 */
739 jsr166 1.6 public void testInvokeAll1() throws Throwable {
740 dl 1.1 ExecutorService e = new ForkJoinPool(1);
741     try {
742     e.invokeAll(null);
743 jsr166 1.6 shouldThrow();
744 dl 1.1 } catch (NullPointerException success) {
745     } finally {
746     joinPool(e);
747     }
748     }
749    
750     /**
751     * invokeAll(empty collection) returns empty collection
752     */
753 jsr166 1.6 public void testInvokeAll2() throws InterruptedException {
754 dl 1.1 ExecutorService e = new ForkJoinPool(1);
755     try {
756 jsr166 1.6 List<Future<String>> r
757     = e.invokeAll(new ArrayList<Callable<String>>());
758 dl 1.1 assertTrue(r.isEmpty());
759     } finally {
760     joinPool(e);
761     }
762     }
763    
764     /**
765 jsr166 1.6 * invokeAll(c) throws NullPointerException if c has null elements
766 dl 1.1 */
767 jsr166 1.6 public void testInvokeAll3() throws InterruptedException {
768 dl 1.1 ExecutorService e = new ForkJoinPool(1);
769 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
770     l.add(new StringTask());
771     l.add(null);
772 dl 1.1 try {
773     e.invokeAll(l);
774 jsr166 1.6 shouldThrow();
775 dl 1.1 } catch (NullPointerException success) {
776     } finally {
777     joinPool(e);
778     }
779     }
780    
781     /**
782 jsr166 1.6 * get of returned element of invokeAll(c) throws
783     * ExecutionException on failed task
784 dl 1.1 */
785 jsr166 1.6 public void testInvokeAll4() throws Throwable {
786 dl 1.1 ExecutorService e = new ForkJoinPool(1);
787 jsr166 1.16 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 dl 1.1 try {
792 jsr166 1.16 futures.get(0).get();
793 jsr166 1.6 shouldThrow();
794 jsr166 1.2 } catch (ExecutionException success) {
795 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
796 dl 1.1 } finally {
797     joinPool(e);
798     }
799     }
800    
801     /**
802     * invokeAll(c) returns results of all completed tasks in c
803     */
804 jsr166 1.6 public void testInvokeAll5() throws Throwable {
805 dl 1.1 ExecutorService e = new ForkJoinPool(1);
806     try {
807 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
808 dl 1.1 l.add(new StringTask());
809     l.add(new StringTask());
810 jsr166 1.16 List<Future<String>> futures = e.invokeAll(l);
811     assertEquals(2, futures.size());
812     for (Future<String> future : futures)
813 jsr166 1.6 assertSame(TEST_STRING, future.get());
814 dl 1.1 } finally {
815     joinPool(e);
816     }
817     }
818    
819    
820     /**
821 jsr166 1.6 * timed invokeAny(null) throws NullPointerException
822 dl 1.1 */
823 jsr166 1.6 public void testTimedInvokeAny1() throws Throwable {
824 dl 1.1 ExecutorService e = new ForkJoinPool(1);
825     try {
826 jsr166 1.6 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
827     shouldThrow();
828 dl 1.1 } catch (NullPointerException success) {
829     } finally {
830     joinPool(e);
831     }
832     }
833    
834     /**
835 jsr166 1.6 * timed invokeAny(null time unit) throws NullPointerException
836 dl 1.1 */
837 jsr166 1.6 public void testTimedInvokeAnyNullTimeUnit() throws Throwable {
838 dl 1.1 ExecutorService e = new ForkJoinPool(1);
839 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
840     l.add(new StringTask());
841 dl 1.1 try {
842     e.invokeAny(l, MEDIUM_DELAY_MS, null);
843 jsr166 1.6 shouldThrow();
844 dl 1.1 } catch (NullPointerException success) {
845     } finally {
846     joinPool(e);
847     }
848     }
849    
850     /**
851 jsr166 1.6 * timed invokeAny(empty collection) throws IllegalArgumentException
852 dl 1.1 */
853 jsr166 1.6 public void testTimedInvokeAny2() throws Throwable {
854 dl 1.1 ExecutorService e = new ForkJoinPool(1);
855     try {
856 jsr166 1.6 e.invokeAny(new ArrayList<Callable<String>>(),
857     MEDIUM_DELAY_MS, MILLISECONDS);
858     shouldThrow();
859 dl 1.1 } catch (IllegalArgumentException success) {
860     } finally {
861     joinPool(e);
862     }
863     }
864    
865     /**
866 jsr166 1.6 * timed invokeAny(c) throws NullPointerException if c has null elements
867 dl 1.1 */
868 jsr166 1.6 public void testTimedInvokeAny3() throws Throwable {
869 jsr166 1.16 CountDownLatch latch = new CountDownLatch(1);
870 dl 1.1 ExecutorService e = new ForkJoinPool(1);
871 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
872     l.add(latchAwaitingStringTask(latch));
873     l.add(null);
874 dl 1.1 try {
875 jsr166 1.6 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
876     shouldThrow();
877 dl 1.1 } catch (NullPointerException success) {
878     } finally {
879 jsr166 1.15 latch.countDown();
880 dl 1.1 joinPool(e);
881     }
882     }
883    
884     /**
885     * timed invokeAny(c) throws ExecutionException if no task completes
886     */
887 jsr166 1.6 public void testTimedInvokeAny4() throws Throwable {
888 dl 1.1 ExecutorService e = new ForkJoinPool(1);
889 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
890     l.add(new NPETask());
891 dl 1.1 try {
892 jsr166 1.6 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
893     shouldThrow();
894 jsr166 1.2 } catch (ExecutionException success) {
895 jsr166 1.11 assertTrue(success.getCause() instanceof NullPointerException);
896 dl 1.1 } finally {
897     joinPool(e);
898     }
899     }
900    
901     /**
902     * timed invokeAny(c) returns result of some task in c
903     */
904 jsr166 1.6 public void testTimedInvokeAny5() throws Throwable {
905 dl 1.1 ExecutorService e = new ForkJoinPool(1);
906     try {
907 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
908 dl 1.1 l.add(new StringTask());
909     l.add(new StringTask());
910 jsr166 1.6 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
911 dl 1.1 assertSame(TEST_STRING, result);
912     } finally {
913     joinPool(e);
914     }
915     }
916    
917     /**
918 jsr166 1.6 * timed invokeAll(null) throws NullPointerException
919 dl 1.1 */
920 jsr166 1.6 public void testTimedInvokeAll1() throws Throwable {
921 dl 1.1 ExecutorService e = new ForkJoinPool(1);
922     try {
923 jsr166 1.6 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
924     shouldThrow();
925 dl 1.1 } catch (NullPointerException success) {
926     } finally {
927     joinPool(e);
928     }
929     }
930    
931     /**
932 jsr166 1.6 * timed invokeAll(null time unit) throws NullPointerException
933 dl 1.1 */
934 jsr166 1.6 public void testTimedInvokeAllNullTimeUnit() throws Throwable {
935 dl 1.1 ExecutorService e = new ForkJoinPool(1);
936 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
937     l.add(new StringTask());
938 dl 1.1 try {
939     e.invokeAll(l, MEDIUM_DELAY_MS, null);
940 jsr166 1.6 shouldThrow();
941 dl 1.1 } catch (NullPointerException success) {
942     } finally {
943     joinPool(e);
944     }
945     }
946    
947     /**
948     * timed invokeAll(empty collection) returns empty collection
949     */
950 jsr166 1.6 public void testTimedInvokeAll2() throws InterruptedException {
951 dl 1.1 ExecutorService e = new ForkJoinPool(1);
952     try {
953 jsr166 1.6 List<Future<String>> r
954     = e.invokeAll(new ArrayList<Callable<String>>(),
955     MEDIUM_DELAY_MS, MILLISECONDS);
956 dl 1.1 assertTrue(r.isEmpty());
957     } finally {
958     joinPool(e);
959     }
960     }
961    
962     /**
963 jsr166 1.6 * timed invokeAll(c) throws NullPointerException if c has null elements
964 dl 1.1 */
965 jsr166 1.6 public void testTimedInvokeAll3() throws InterruptedException {
966 dl 1.1 ExecutorService e = new ForkJoinPool(1);
967 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
968     l.add(new StringTask());
969     l.add(null);
970 dl 1.1 try {
971 jsr166 1.6 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
972     shouldThrow();
973 dl 1.1 } 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 jsr166 1.6 public void testTimedInvokeAll4() throws Throwable {
983 dl 1.1 ExecutorService e = new ForkJoinPool(1);
984 jsr166 1.16 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 dl 1.1 try {
990 jsr166 1.16 futures.get(0).get();
991 jsr166 1.6 shouldThrow();
992 jsr166 1.2 } catch (ExecutionException success) {
993 jsr166 1.12 assertTrue(success.getCause() instanceof NullPointerException);
994 dl 1.1 } finally {
995     joinPool(e);
996     }
997     }
998    
999     /**
1000     * timed invokeAll(c) returns results of all completed tasks in c
1001     */
1002 jsr166 1.6 public void testTimedInvokeAll5() throws Throwable {
1003 dl 1.1 ExecutorService e = new ForkJoinPool(1);
1004     try {
1005 jsr166 1.16 List<Callable<String>> l = new ArrayList<Callable<String>>();
1006 dl 1.1 l.add(new StringTask());
1007     l.add(new StringTask());
1008 jsr166 1.16 List<Future<String>> futures
1009 jsr166 1.6 = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1010 jsr166 1.16 assertEquals(2, futures.size());
1011     for (Future<String> future : futures)
1012 jsr166 1.6 assertSame(TEST_STRING, future.get());
1013 dl 1.1 } finally {
1014     joinPool(e);
1015     }
1016     }
1017    
1018     }