ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractExecutorServiceTest.java
Revision: 1.42
Committed: Tue Oct 6 00:41:47 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.41: +1 -1 lines
Log Message:
bump up timeout

File Contents

# User Rev Content
1 tim 1.1 /*
2 dl 1.10 * 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 jsr166 1.30 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.16 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 tim 1.1 */
8    
9 jsr166 1.35 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.security.PrivilegedAction;
12     import java.security.PrivilegedExceptionAction;
13     import java.util.ArrayList;
14     import java.util.Collections;
15     import java.util.List;
16     import java.util.concurrent.AbstractExecutorService;
17     import java.util.concurrent.ArrayBlockingQueue;
18     import java.util.concurrent.Callable;
19 jsr166 1.38 import java.util.concurrent.CancellationException;
20 jsr166 1.35 import java.util.concurrent.CountDownLatch;
21     import java.util.concurrent.ExecutionException;
22     import java.util.concurrent.Executors;
23     import java.util.concurrent.ExecutorService;
24     import java.util.concurrent.Future;
25     import java.util.concurrent.ThreadPoolExecutor;
26     import java.util.concurrent.TimeUnit;
27 jsr166 1.32 import java.util.concurrent.atomic.AtomicBoolean;
28 jsr166 1.35
29     import junit.framework.Test;
30     import junit.framework.TestSuite;
31 tim 1.1
32 jsr166 1.18 public class AbstractExecutorServiceTest extends JSR166TestCase {
33 tim 1.1 public static void main(String[] args) {
34 jsr166 1.37 main(suite(), args);
35 tim 1.1 }
36     public static Test suite() {
37 dl 1.6 return new TestSuite(AbstractExecutorServiceTest.class);
38 tim 1.1 }
39    
40 jsr166 1.16 /**
41 tim 1.1 * A no-frills implementation of AbstractExecutorService, designed
42 dl 1.6 * to test the submit methods only.
43 tim 1.1 */
44     static class DirectExecutorService extends AbstractExecutorService {
45     public void execute(Runnable r) { r.run(); }
46     public void shutdown() { shutdown = true; }
47 jsr166 1.26 public List<Runnable> shutdownNow() {
48     shutdown = true;
49     return Collections.EMPTY_LIST;
50     }
51 tim 1.1 public boolean isShutdown() { return shutdown; }
52     public boolean isTerminated() { return isShutdown(); }
53 jsr166 1.26 public boolean awaitTermination(long timeout, TimeUnit unit) {
54     return isShutdown();
55     }
56 tim 1.1 private volatile boolean shutdown = false;
57     }
58    
59     /**
60 dl 1.12 * execute(runnable) runs it to completion
61 tim 1.1 */
62 jsr166 1.19 public void testExecuteRunnable() throws Exception {
63     ExecutorService e = new DirectExecutorService();
64 jsr166 1.32 final AtomicBoolean done = new AtomicBoolean(false);
65 jsr166 1.34 Future<?> future = e.submit(new CheckedRunnable() {
66 jsr166 1.32 public void realRun() {
67     done.set(true);
68 jsr166 1.34 }});
69 jsr166 1.32 assertNull(future.get());
70     assertNull(future.get(0, MILLISECONDS));
71     assertTrue(done.get());
72     assertTrue(future.isDone());
73     assertFalse(future.isCancelled());
74 tim 1.1 }
75    
76     /**
77 dl 1.12 * Completed submit(callable) returns result
78 tim 1.1 */
79 jsr166 1.19 public void testSubmitCallable() throws Exception {
80     ExecutorService e = new DirectExecutorService();
81     Future<String> future = e.submit(new StringTask());
82     String result = future.get();
83     assertSame(TEST_STRING, result);
84 tim 1.1 }
85    
86 dl 1.6 /**
87 dl 1.12 * Completed submit(runnable) returns successfully
88 dl 1.6 */
89 jsr166 1.19 public void testSubmitRunnable() throws Exception {
90     ExecutorService e = new DirectExecutorService();
91     Future<?> future = e.submit(new NoOpRunnable());
92     future.get();
93     assertTrue(future.isDone());
94 dl 1.6 }
95    
96     /**
97 dl 1.12 * Completed submit(runnable, result) returns result
98 dl 1.6 */
99 jsr166 1.19 public void testSubmitRunnable2() throws Exception {
100     ExecutorService e = new DirectExecutorService();
101     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
102     String result = future.get();
103     assertSame(TEST_STRING, result);
104 dl 1.6 }
105    
106 tim 1.1 /**
107 jsr166 1.23 * A submitted privileged action runs to completion
108 tim 1.1 */
109 jsr166 1.19 public void testSubmitPrivilegedAction() throws Exception {
110 jsr166 1.23 Runnable r = new CheckedRunnable() {
111     public void realRun() throws Exception {
112     ExecutorService e = new DirectExecutorService();
113     Future future = e.submit(Executors.callable(new PrivilegedAction() {
114 tim 1.1 public Object run() {
115     return TEST_STRING;
116 dl 1.5 }}));
117 tim 1.1
118 jsr166 1.23 assertSame(TEST_STRING, future.get());
119     }};
120    
121     runWithPermissions(r,
122     new RuntimePermission("getClassLoader"),
123     new RuntimePermission("setContextClassLoader"),
124     new RuntimePermission("modifyThread"));
125 tim 1.1 }
126    
127     /**
128 jsr166 1.23 * A submitted privileged exception action runs to completion
129 tim 1.1 */
130 jsr166 1.19 public void testSubmitPrivilegedExceptionAction() throws Exception {
131 jsr166 1.23 Runnable r = new CheckedRunnable() {
132     public void realRun() throws Exception {
133     ExecutorService e = new DirectExecutorService();
134     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
135 tim 1.1 public Object run() {
136     return TEST_STRING;
137 dl 1.5 }}));
138 tim 1.1
139 jsr166 1.23 assertSame(TEST_STRING, future.get());
140     }};
141    
142     runWithPermissions(r);
143 tim 1.1 }
144    
145     /**
146 dl 1.12 * A submitted failed privileged exception action reports exception
147 tim 1.1 */
148 jsr166 1.19 public void testSubmitFailedPrivilegedExceptionAction() throws Exception {
149 jsr166 1.23 Runnable r = new CheckedRunnable() {
150     public void realRun() throws Exception {
151     ExecutorService e = new DirectExecutorService();
152     Future future = e.submit(Executors.callable(new PrivilegedExceptionAction() {
153 tim 1.1 public Object run() throws Exception {
154     throw new IndexOutOfBoundsException();
155 dl 1.5 }}));
156 tim 1.1
157 jsr166 1.23 try {
158     future.get();
159     shouldThrow();
160     } catch (ExecutionException success) {
161     assertTrue(success.getCause() instanceof IndexOutOfBoundsException);
162     }}};
163    
164     runWithPermissions(r);
165 tim 1.1 }
166    
167     /**
168 dl 1.12 * execute(null runnable) throws NPE
169 tim 1.1 */
170     public void testExecuteNullRunnable() {
171 jsr166 1.36 ExecutorService e = new DirectExecutorService();
172 tim 1.1 try {
173 jsr166 1.19 e.submit((Runnable) null);
174 tim 1.1 shouldThrow();
175 jsr166 1.19 } catch (NullPointerException success) {}
176 tim 1.1 }
177    
178     /**
179 dl 1.12 * submit(null callable) throws NPE
180 tim 1.1 */
181 dl 1.6 public void testSubmitNullCallable() {
182 jsr166 1.36 ExecutorService e = new DirectExecutorService();
183 tim 1.1 try {
184 jsr166 1.19 e.submit((Callable) null);
185 tim 1.1 shouldThrow();
186 jsr166 1.19 } catch (NullPointerException success) {}
187 tim 1.1 }
188    
189     /**
190 jsr166 1.25 * submit(callable).get() throws InterruptedException if interrupted
191 tim 1.1 */
192 jsr166 1.19 public void testInterruptedSubmit() throws InterruptedException {
193 jsr166 1.25 final CountDownLatch submitted = new CountDownLatch(1);
194     final CountDownLatch quittingTime = new CountDownLatch(1);
195     final Callable<Void> awaiter = new CheckedCallable<Void>() {
196     public Void realCall() throws InterruptedException {
197 jsr166 1.41 assertTrue(quittingTime.await(2*LONG_DELAY_MS, MILLISECONDS));
198 jsr166 1.25 return null;
199     }};
200 jsr166 1.40 final ExecutorService p
201     = new ThreadPoolExecutor(1,1,60, TimeUnit.SECONDS,
202     new ArrayBlockingQueue<Runnable>(10));
203 jsr166 1.41 try (PoolCleaner cleaner = cleaner(p, quittingTime)) {
204     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
205 jsr166 1.25 public void realRun() throws Exception {
206     Future<Void> future = p.submit(awaiter);
207     submitted.countDown();
208     future.get();
209     }});
210 jsr166 1.41
211     await(submitted);
212 jsr166 1.25 t.interrupt();
213 jsr166 1.41 awaitTermination(t);
214 jsr166 1.25 }
215 tim 1.1 }
216    
217     /**
218 jsr166 1.27 * get of submit(callable) throws ExecutionException if callable
219     * throws exception
220 tim 1.1 */
221 jsr166 1.19 public void testSubmitEE() throws InterruptedException {
222 jsr166 1.40 final ThreadPoolExecutor p =
223 jsr166 1.19 new ThreadPoolExecutor(1, 1,
224     60, TimeUnit.SECONDS,
225     new ArrayBlockingQueue<Runnable>(10));
226 jsr166 1.40 try (PoolCleaner cleaner = cleaner(p)) {
227     Callable c = new Callable() {
228     public Object call() { throw new ArithmeticException(); }};
229     try {
230     p.submit(c).get();
231     shouldThrow();
232     } catch (ExecutionException success) {
233     assertTrue(success.getCause() instanceof ArithmeticException);
234     }
235 tim 1.1 }
236 dl 1.6 }
237    
238     /**
239     * invokeAny(null) throws NPE
240     */
241 jsr166 1.28 public void testInvokeAny1() throws Exception {
242 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
243     try (PoolCleaner cleaner = cleaner(e)) {
244     try {
245     e.invokeAny(null);
246     shouldThrow();
247     } catch (NullPointerException success) {}
248 dl 1.6 }
249     }
250    
251     /**
252     * invokeAny(empty collection) throws IAE
253     */
254 jsr166 1.28 public void testInvokeAny2() throws Exception {
255 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
256     try (PoolCleaner cleaner = cleaner(e)) {
257     try {
258     e.invokeAny(new ArrayList<Callable<String>>());
259     shouldThrow();
260     } catch (IllegalArgumentException success) {}
261 dl 1.6 }
262     }
263    
264     /**
265     * invokeAny(c) throws NPE if c has null elements
266     */
267 jsr166 1.19 public void testInvokeAny3() throws Exception {
268 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
269     try (PoolCleaner cleaner = cleaner(e)) {
270     List<Callable<Long>> l = new ArrayList<Callable<Long>>();
271     l.add(new Callable<Long>() {
272     public Long call() { throw new ArithmeticException(); }});
273     l.add(null);
274     try {
275     e.invokeAny(l);
276     shouldThrow();
277     } catch (NullPointerException success) {}
278 dl 1.6 }
279     }
280    
281     /**
282 dl 1.12 * invokeAny(c) throws ExecutionException if no task in c completes
283 dl 1.6 */
284 jsr166 1.19 public void testInvokeAny4() throws InterruptedException {
285 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
286     try (PoolCleaner cleaner = cleaner(e)) {
287     List<Callable<String>> l = new ArrayList<Callable<String>>();
288     l.add(new NPETask());
289     try {
290     e.invokeAny(l);
291     shouldThrow();
292     } catch (ExecutionException success) {
293     assertTrue(success.getCause() instanceof NullPointerException);
294     }
295 dl 1.6 }
296     }
297    
298     /**
299 dl 1.12 * invokeAny(c) returns result of some task in c if at least one completes
300 dl 1.6 */
301 jsr166 1.19 public void testInvokeAny5() throws Exception {
302 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
303     try (PoolCleaner cleaner = cleaner(e)) {
304 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
305 dl 1.6 l.add(new StringTask());
306     l.add(new StringTask());
307     String result = e.invokeAny(l);
308     assertSame(TEST_STRING, result);
309     }
310     }
311    
312     /**
313     * invokeAll(null) throws NPE
314     */
315 jsr166 1.19 public void testInvokeAll1() throws InterruptedException {
316 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
317     try (PoolCleaner cleaner = cleaner(e)) {
318     try {
319     e.invokeAll(null);
320     shouldThrow();
321     } catch (NullPointerException success) {}
322 dl 1.6 }
323     }
324    
325     /**
326     * invokeAll(empty collection) returns empty collection
327     */
328 jsr166 1.19 public void testInvokeAll2() throws InterruptedException {
329 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
330     try (PoolCleaner cleaner = cleaner(e)) {
331 dl 1.6 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
332     assertTrue(r.isEmpty());
333     }
334     }
335    
336     /**
337     * invokeAll(c) throws NPE if c has null elements
338     */
339 jsr166 1.19 public void testInvokeAll3() throws InterruptedException {
340 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
341     try (PoolCleaner cleaner = cleaner(e)) {
342     List<Callable<String>> l = new ArrayList<Callable<String>>();
343     l.add(new StringTask());
344     l.add(null);
345     try {
346     e.invokeAll(l);
347     shouldThrow();
348     } catch (NullPointerException success) {}
349 dl 1.6 }
350     }
351    
352     /**
353 dl 1.12 * get of returned element of invokeAll(c) throws exception on failed task
354 dl 1.6 */
355 jsr166 1.19 public void testInvokeAll4() throws Exception {
356 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
357     try (PoolCleaner cleaner = cleaner(e)) {
358 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
359 dl 1.6 l.add(new NPETask());
360 jsr166 1.22 List<Future<String>> futures = e.invokeAll(l);
361     assertEquals(1, futures.size());
362     try {
363     futures.get(0).get();
364     shouldThrow();
365     } catch (ExecutionException success) {
366     assertTrue(success.getCause() instanceof NullPointerException);
367 jsr166 1.19 }
368 dl 1.6 }
369     }
370    
371     /**
372 dl 1.12 * invokeAll(c) returns results of all completed tasks in c
373 dl 1.6 */
374 jsr166 1.19 public void testInvokeAll5() throws Exception {
375 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
376     try (PoolCleaner cleaner = cleaner(e)) {
377 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
378 dl 1.6 l.add(new StringTask());
379     l.add(new StringTask());
380 jsr166 1.22 List<Future<String>> futures = e.invokeAll(l);
381     assertEquals(2, futures.size());
382     for (Future<String> future : futures)
383 jsr166 1.19 assertSame(TEST_STRING, future.get());
384 dl 1.8 }
385     }
386    
387     /**
388     * timed invokeAny(null) throws NPE
389     */
390 jsr166 1.19 public void testTimedInvokeAny1() throws Exception {
391 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
392     try (PoolCleaner cleaner = cleaner(e)) {
393     try {
394     e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
395     shouldThrow();
396     } catch (NullPointerException success) {}
397 dl 1.8 }
398     }
399    
400     /**
401 dl 1.12 * timed invokeAny(null time unit) throws NPE
402 dl 1.8 */
403 jsr166 1.19 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
404 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
405     try (PoolCleaner cleaner = cleaner(e)) {
406     List<Callable<String>> l = new ArrayList<Callable<String>>();
407     l.add(new StringTask());
408     try {
409     e.invokeAny(l, MEDIUM_DELAY_MS, null);
410     shouldThrow();
411     } catch (NullPointerException success) {}
412 dl 1.8 }
413     }
414    
415     /**
416     * timed invokeAny(empty collection) throws IAE
417     */
418 jsr166 1.19 public void testTimedInvokeAny2() throws Exception {
419 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
420     try (PoolCleaner cleaner = cleaner(e)) {
421     try {
422     e.invokeAny(new ArrayList<Callable<String>>(),
423     MEDIUM_DELAY_MS, MILLISECONDS);
424     shouldThrow();
425     } catch (IllegalArgumentException success) {}
426 dl 1.8 }
427     }
428    
429     /**
430     * timed invokeAny(c) throws NPE if c has null elements
431     */
432 jsr166 1.19 public void testTimedInvokeAny3() throws Exception {
433 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
434     try (PoolCleaner cleaner = cleaner(e)) {
435     List<Callable<Long>> l = new ArrayList<Callable<Long>>();
436     l.add(new Callable<Long>() {
437     public Long call() { throw new ArithmeticException(); }});
438     l.add(null);
439     try {
440     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
441     shouldThrow();
442     } catch (NullPointerException success) {}
443 dl 1.8 }
444     }
445    
446     /**
447     * timed invokeAny(c) throws ExecutionException if no task completes
448     */
449 jsr166 1.19 public void testTimedInvokeAny4() throws Exception {
450 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
451     try (PoolCleaner cleaner = cleaner(e)) {
452     List<Callable<String>> l = new ArrayList<Callable<String>>();
453     l.add(new NPETask());
454     try {
455     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
456     shouldThrow();
457     } catch (ExecutionException success) {
458     assertTrue(success.getCause() instanceof NullPointerException);
459     }
460 dl 1.8 }
461     }
462    
463     /**
464 dl 1.12 * timed invokeAny(c) returns result of some task in c
465 dl 1.8 */
466 jsr166 1.19 public void testTimedInvokeAny5() throws Exception {
467 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
468     try (PoolCleaner cleaner = cleaner(e)) {
469 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
470 dl 1.8 l.add(new StringTask());
471     l.add(new StringTask());
472 jsr166 1.20 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
473 dl 1.8 assertSame(TEST_STRING, result);
474     }
475     }
476    
477     /**
478     * timed invokeAll(null) throws NPE
479     */
480 jsr166 1.19 public void testTimedInvokeAll1() throws InterruptedException {
481 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
482     try (PoolCleaner cleaner = cleaner(e)) {
483     try {
484     e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
485     shouldThrow();
486     } catch (NullPointerException success) {}
487 dl 1.8 }
488     }
489    
490     /**
491 dl 1.12 * timed invokeAll(null time unit) throws NPE
492 dl 1.8 */
493 jsr166 1.19 public void testTimedInvokeAllNullTimeUnit() throws InterruptedException {
494 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
495     try (PoolCleaner cleaner = cleaner(e)) {
496     List<Callable<String>> l = new ArrayList<Callable<String>>();
497     l.add(new StringTask());
498     try {
499     e.invokeAll(l, MEDIUM_DELAY_MS, null);
500     shouldThrow();
501     } catch (NullPointerException success) {}
502 dl 1.8 }
503     }
504    
505     /**
506     * timed invokeAll(empty collection) returns empty collection
507     */
508 jsr166 1.19 public void testTimedInvokeAll2() throws InterruptedException {
509 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
510     try (PoolCleaner cleaner = cleaner(e)) {
511 jsr166 1.20 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
512 dl 1.8 assertTrue(r.isEmpty());
513     }
514     }
515    
516     /**
517     * timed invokeAll(c) throws NPE if c has null elements
518     */
519 jsr166 1.19 public void testTimedInvokeAll3() throws InterruptedException {
520 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
521     try (PoolCleaner cleaner = cleaner(e)) {
522     List<Callable<String>> l = new ArrayList<Callable<String>>();
523     l.add(new StringTask());
524     l.add(null);
525     try {
526     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
527     shouldThrow();
528     } catch (NullPointerException success) {}
529 dl 1.8 }
530     }
531    
532     /**
533 dl 1.12 * get of returned element of invokeAll(c) throws exception on failed task
534 dl 1.8 */
535 jsr166 1.19 public void testTimedInvokeAll4() throws Exception {
536 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
537     try (PoolCleaner cleaner = cleaner(e)) {
538 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
539 dl 1.8 l.add(new NPETask());
540 jsr166 1.22 List<Future<String>> futures =
541 jsr166 1.42 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
542 jsr166 1.22 assertEquals(1, futures.size());
543     try {
544     futures.get(0).get();
545     shouldThrow();
546     } catch (ExecutionException success) {
547     assertTrue(success.getCause() instanceof NullPointerException);
548 jsr166 1.19 }
549 dl 1.8 }
550     }
551    
552     /**
553 dl 1.12 * timed invokeAll(c) returns results of all completed tasks in c
554 dl 1.8 */
555 jsr166 1.19 public void testTimedInvokeAll5() throws Exception {
556 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
557     try (PoolCleaner cleaner = cleaner(e)) {
558 jsr166 1.22 List<Callable<String>> l = new ArrayList<Callable<String>>();
559 dl 1.8 l.add(new StringTask());
560     l.add(new StringTask());
561 jsr166 1.22 List<Future<String>> futures =
562 jsr166 1.38 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
563 jsr166 1.22 assertEquals(2, futures.size());
564     for (Future<String> future : futures)
565 jsr166 1.19 assertSame(TEST_STRING, future.get());
566 dl 1.8 }
567     }
568    
569     /**
570 dl 1.12 * timed invokeAll cancels tasks not completed by timeout
571 dl 1.8 */
572 jsr166 1.38 public void testTimedInvokeAll6() throws Exception {
573 jsr166 1.40 final ExecutorService e = new DirectExecutorService();
574     try (PoolCleaner cleaner = cleaner(e)) {
575 jsr166 1.39 for (long timeout = timeoutMillis();;) {
576     List<Callable<String>> tasks = new ArrayList<>();
577     tasks.add(new StringTask("0"));
578     tasks.add(Executors.callable(possiblyInterruptedRunnable(timeout),
579     TEST_STRING));
580     tasks.add(new StringTask("2"));
581     long startTime = System.nanoTime();
582     List<Future<String>> futures =
583     e.invokeAll(tasks, timeout, MILLISECONDS);
584     assertEquals(tasks.size(), futures.size());
585     assertTrue(millisElapsedSince(startTime) >= timeout);
586     for (Future future : futures)
587     assertTrue(future.isDone());
588     try {
589     assertEquals("0", futures.get(0).get());
590     assertEquals(TEST_STRING, futures.get(1).get());
591     } catch (CancellationException retryWithLongerTimeout) {
592     // unusual delay before starting second task
593     timeout *= 2;
594     if (timeout >= LONG_DELAY_MS / 2)
595     fail("expected exactly one task to be cancelled");
596     continue;
597     }
598     assertTrue(futures.get(2).isCancelled());
599     break;
600     }
601 dl 1.6 }
602 tim 1.1 }
603    
604 dl 1.3 }