ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.54
Committed: Sun Sep 27 20:17:39 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.53: +24 -11 lines
Log Message:
improve tests for shutdownNow

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.13 * 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.37 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.22 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.25 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 jsr166 1.54 import static java.util.concurrent.TimeUnit.SECONDS;
11 jsr166 1.50
12     import java.util.ArrayList;
13 jsr166 1.54 import java.util.HashSet;
14 jsr166 1.50 import java.util.List;
15     import java.util.concurrent.BlockingQueue;
16     import java.util.concurrent.Callable;
17 jsr166 1.52 import java.util.concurrent.CancellationException;
18 jsr166 1.50 import java.util.concurrent.CountDownLatch;
19     import java.util.concurrent.ExecutionException;
20     import java.util.concurrent.Executors;
21     import java.util.concurrent.ExecutorService;
22     import java.util.concurrent.Future;
23     import java.util.concurrent.RejectedExecutionException;
24     import java.util.concurrent.ScheduledFuture;
25     import java.util.concurrent.ScheduledThreadPoolExecutor;
26     import java.util.concurrent.ThreadFactory;
27     import java.util.concurrent.ThreadPoolExecutor;
28 jsr166 1.46 import java.util.concurrent.atomic.AtomicInteger;
29 dl 1.1
30 jsr166 1.50 import junit.framework.Test;
31     import junit.framework.TestSuite;
32    
33 dl 1.4 public class ScheduledExecutorTest extends JSR166TestCase {
34 dl 1.1 public static void main(String[] args) {
35 jsr166 1.51 main(suite(), args);
36 dl 1.1 }
37     public static Test suite() {
38 jsr166 1.26 return new TestSuite(ScheduledExecutorTest.class);
39 dl 1.1 }
40    
41 dl 1.5 /**
42 dl 1.6 * execute successfully executes a runnable
43 dl 1.5 */
44 jsr166 1.25 public void testExecute() throws InterruptedException {
45 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
46     final CountDownLatch done = new CountDownLatch(1);
47     final Runnable task = new CheckedRunnable() {
48     public void realRun() {
49     done.countDown();
50     }};
51     try {
52     p.execute(task);
53     assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
54     } finally {
55     joinPool(p);
56     }
57 dl 1.1 }
58    
59 dl 1.5 /**
60 dl 1.6 * delayed schedule of callable successfully executes after delay
61 dl 1.5 */
62 jsr166 1.25 public void testSchedule1() throws Exception {
63 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
64 jsr166 1.44 final long startTime = System.nanoTime();
65 jsr166 1.33 final CountDownLatch done = new CountDownLatch(1);
66     try {
67     Callable task = new CheckedCallable<Boolean>() {
68     public Boolean realCall() {
69     done.countDown();
70 jsr166 1.44 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
71 jsr166 1.33 return Boolean.TRUE;
72     }};
73 jsr166 1.44 Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
74     assertSame(Boolean.TRUE, f.get());
75     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
76 jsr166 1.33 assertTrue(done.await(0L, MILLISECONDS));
77     } finally {
78     joinPool(p);
79     }
80 dl 1.1 }
81    
82     /**
83 jsr166 1.32 * delayed schedule of runnable successfully executes after delay
84 dl 1.1 */
85 jsr166 1.33 public void testSchedule3() throws Exception {
86     ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
87 jsr166 1.44 final long startTime = System.nanoTime();
88 jsr166 1.33 final CountDownLatch done = new CountDownLatch(1);
89     try {
90     Runnable task = new CheckedRunnable() {
91     public void realRun() {
92     done.countDown();
93 jsr166 1.44 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
94 jsr166 1.33 }};
95 jsr166 1.44 Future f = p.schedule(task, timeoutMillis(), MILLISECONDS);
96     await(done);
97     assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
98     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
99 jsr166 1.33 } finally {
100     joinPool(p);
101     }
102 dl 1.1 }
103 jsr166 1.22
104 dl 1.1 /**
105 dl 1.6 * scheduleAtFixedRate executes runnable after given initial delay
106 dl 1.1 */
107 jsr166 1.33 public void testSchedule4() throws Exception {
108     ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
109 jsr166 1.44 final long startTime = System.nanoTime();
110 jsr166 1.33 final CountDownLatch done = new CountDownLatch(1);
111     try {
112     Runnable task = new CheckedRunnable() {
113     public void realRun() {
114     done.countDown();
115 jsr166 1.44 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
116 jsr166 1.33 }};
117     ScheduledFuture f =
118 jsr166 1.44 p.scheduleAtFixedRate(task, timeoutMillis(),
119     LONG_DELAY_MS, MILLISECONDS);
120     await(done);
121     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
122 jsr166 1.33 f.cancel(true);
123     } finally {
124     joinPool(p);
125     }
126 dl 1.18 }
127    
128 dl 1.6 /**
129     * scheduleWithFixedDelay executes runnable after given initial delay
130     */
131 jsr166 1.44 public void testSchedule5() throws Exception {
132 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
133 jsr166 1.44 final long startTime = System.nanoTime();
134 jsr166 1.33 final CountDownLatch done = new CountDownLatch(1);
135     try {
136     Runnable task = new CheckedRunnable() {
137     public void realRun() {
138     done.countDown();
139 jsr166 1.44 assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
140 jsr166 1.33 }};
141     ScheduledFuture f =
142 jsr166 1.44 p.scheduleWithFixedDelay(task, timeoutMillis(),
143     LONG_DELAY_MS, MILLISECONDS);
144     await(done);
145     assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
146 jsr166 1.33 f.cancel(true);
147     } finally {
148     joinPool(p);
149     }
150     }
151    
152     static class RunnableCounter implements Runnable {
153     AtomicInteger count = new AtomicInteger(0);
154     public void run() { count.getAndIncrement(); }
155 dl 1.1 }
156 jsr166 1.22
157 dl 1.6 /**
158 dl 1.18 * scheduleAtFixedRate executes series of tasks at given rate
159     */
160 jsr166 1.25 public void testFixedRateSequence() throws InterruptedException {
161 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
162 jsr166 1.47 try {
163     for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
164     long startTime = System.nanoTime();
165     int cycles = 10;
166     final CountDownLatch done = new CountDownLatch(cycles);
167 jsr166 1.49 Runnable task = new CheckedRunnable() {
168 jsr166 1.47 public void realRun() { done.countDown(); }};
169     ScheduledFuture h =
170     p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS);
171     done.await();
172     h.cancel(true);
173     double normalizedTime =
174     (double) millisElapsedSince(startTime) / delay;
175     if (normalizedTime >= cycles - 1 &&
176     normalizedTime <= cycles)
177     return;
178     }
179     throw new AssertionError("unexpected execution rate");
180     } finally {
181     joinPool(p);
182     }
183 dl 1.18 }
184    
185     /**
186     * scheduleWithFixedDelay executes series of tasks with given period
187     */
188 jsr166 1.25 public void testFixedDelaySequence() throws InterruptedException {
189 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
190 jsr166 1.47 try {
191     for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) {
192     long startTime = System.nanoTime();
193     int cycles = 10;
194     final CountDownLatch done = new CountDownLatch(cycles);
195 jsr166 1.49 Runnable task = new CheckedRunnable() {
196 jsr166 1.47 public void realRun() { done.countDown(); }};
197     ScheduledFuture h =
198     p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS);
199     done.await();
200     h.cancel(true);
201     double normalizedTime =
202     (double) millisElapsedSince(startTime) / delay;
203     if (normalizedTime >= cycles - 1 &&
204     normalizedTime <= cycles)
205     return;
206     }
207     throw new AssertionError("unexpected execution rate");
208     } finally {
209     joinPool(p);
210     }
211 dl 1.18 }
212    
213     /**
214 jsr166 1.32 * execute(null) throws NPE
215 dl 1.6 */
216 jsr166 1.25 public void testExecuteNull() throws InterruptedException {
217 dl 1.9 ScheduledThreadPoolExecutor se = null;
218 dl 1.6 try {
219 jsr166 1.26 se = new ScheduledThreadPoolExecutor(1);
220     se.execute(null);
221 dl 1.6 shouldThrow();
222 jsr166 1.26 } catch (NullPointerException success) {}
223 jsr166 1.22
224 jsr166 1.26 joinPool(se);
225 dl 1.6 }
226    
227     /**
228 jsr166 1.30 * schedule(null) throws NPE
229 dl 1.6 */
230 jsr166 1.25 public void testScheduleNull() throws InterruptedException {
231 dl 1.9 ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
232 jsr166 1.26 try {
233 dl 1.7 TrackedCallable callable = null;
234 jsr166 1.26 Future f = se.schedule(callable, SHORT_DELAY_MS, MILLISECONDS);
235 dl 1.6 shouldThrow();
236 jsr166 1.26 } catch (NullPointerException success) {}
237     joinPool(se);
238 dl 1.6 }
239 jsr166 1.22
240 dl 1.1 /**
241 dl 1.6 * execute throws RejectedExecutionException if shutdown
242 dl 1.1 */
243 jsr166 1.25 public void testSchedule1_RejectedExecutionException() throws InterruptedException {
244 dl 1.9 ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
245 dl 1.5 try {
246 dl 1.1 se.shutdown();
247 dl 1.4 se.schedule(new NoOpRunnable(),
248 jsr166 1.25 MEDIUM_DELAY_MS, MILLISECONDS);
249 dl 1.5 shouldThrow();
250 jsr166 1.24 } catch (RejectedExecutionException success) {
251 dl 1.17 } catch (SecurityException ok) {
252 dl 1.4 }
253 jsr166 1.22
254 dl 1.4 joinPool(se);
255 dl 1.1 }
256    
257     /**
258 dl 1.6 * schedule throws RejectedExecutionException if shutdown
259 dl 1.1 */
260 jsr166 1.25 public void testSchedule2_RejectedExecutionException() throws InterruptedException {
261 dl 1.9 ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
262 dl 1.5 try {
263 dl 1.1 se.shutdown();
264 dl 1.4 se.schedule(new NoOpCallable(),
265 jsr166 1.25 MEDIUM_DELAY_MS, MILLISECONDS);
266 dl 1.5 shouldThrow();
267 jsr166 1.24 } catch (RejectedExecutionException success) {
268 dl 1.17 } catch (SecurityException ok) {
269 dl 1.4 }
270     joinPool(se);
271 dl 1.1 }
272    
273     /**
274 dl 1.6 * schedule callable throws RejectedExecutionException if shutdown
275 dl 1.1 */
276 jsr166 1.38 public void testSchedule3_RejectedExecutionException() throws InterruptedException {
277     ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
278     try {
279 dl 1.1 se.shutdown();
280 dl 1.4 se.schedule(new NoOpCallable(),
281 jsr166 1.25 MEDIUM_DELAY_MS, MILLISECONDS);
282 dl 1.5 shouldThrow();
283 jsr166 1.24 } catch (RejectedExecutionException success) {
284 dl 1.17 } catch (SecurityException ok) {
285     }
286 jsr166 1.38 joinPool(se);
287 dl 1.1 }
288    
289     /**
290 jsr166 1.32 * scheduleAtFixedRate throws RejectedExecutionException if shutdown
291 dl 1.1 */
292 jsr166 1.25 public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException {
293 dl 1.9 ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
294 dl 1.5 try {
295 dl 1.1 se.shutdown();
296 dl 1.4 se.scheduleAtFixedRate(new NoOpRunnable(),
297 jsr166 1.25 MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
298 dl 1.5 shouldThrow();
299 jsr166 1.24 } catch (RejectedExecutionException success) {
300 dl 1.17 } catch (SecurityException ok) {
301 jsr166 1.22 }
302 dl 1.4 joinPool(se);
303 dl 1.1 }
304 jsr166 1.22
305 dl 1.1 /**
306 dl 1.6 * scheduleWithFixedDelay throws RejectedExecutionException if shutdown
307 dl 1.1 */
308 jsr166 1.25 public void testScheduleWithFixedDelay1_RejectedExecutionException() throws InterruptedException {
309 dl 1.9 ScheduledThreadPoolExecutor se = new ScheduledThreadPoolExecutor(1);
310 dl 1.5 try {
311 dl 1.1 se.shutdown();
312 dl 1.4 se.scheduleWithFixedDelay(new NoOpRunnable(),
313 jsr166 1.25 MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS);
314 dl 1.5 shouldThrow();
315 jsr166 1.24 } catch (RejectedExecutionException success) {
316 dl 1.17 } catch (SecurityException ok) {
317 jsr166 1.22 }
318 dl 1.4 joinPool(se);
319 dl 1.1 }
320    
321     /**
322 jsr166 1.32 * getActiveCount increases but doesn't overestimate, when a
323     * thread becomes active
324 dl 1.2 */
325 jsr166 1.25 public void testGetActiveCount() throws InterruptedException {
326 jsr166 1.33 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
327     final CountDownLatch threadStarted = new CountDownLatch(1);
328     final CountDownLatch done = new CountDownLatch(1);
329     try {
330     assertEquals(0, p.getActiveCount());
331     p.execute(new CheckedRunnable() {
332     public void realRun() throws InterruptedException {
333     threadStarted.countDown();
334     assertEquals(1, p.getActiveCount());
335     done.await();
336     }});
337     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
338     assertEquals(1, p.getActiveCount());
339     } finally {
340     done.countDown();
341     joinPool(p);
342     }
343 dl 1.2 }
344 jsr166 1.22
345 dl 1.2 /**
346 jsr166 1.32 * getCompletedTaskCount increases, but doesn't overestimate,
347     * when tasks complete
348 dl 1.2 */
349 jsr166 1.25 public void testGetCompletedTaskCount() throws InterruptedException {
350 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
351     final CountDownLatch threadStarted = new CountDownLatch(1);
352     final CountDownLatch threadProceed = new CountDownLatch(1);
353     final CountDownLatch threadDone = new CountDownLatch(1);
354     try {
355     assertEquals(0, p.getCompletedTaskCount());
356     p.execute(new CheckedRunnable() {
357     public void realRun() throws InterruptedException {
358     threadStarted.countDown();
359     assertEquals(0, p.getCompletedTaskCount());
360     threadProceed.await();
361     threadDone.countDown();
362     }});
363 jsr166 1.45 await(threadStarted);
364 jsr166 1.33 assertEquals(0, p.getCompletedTaskCount());
365     threadProceed.countDown();
366     threadDone.await();
367 jsr166 1.44 long startTime = System.nanoTime();
368     while (p.getCompletedTaskCount() != 1) {
369     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
370     fail("timed out");
371     Thread.yield();
372     }
373 jsr166 1.33 } finally {
374     joinPool(p);
375     }
376 dl 1.2 }
377 jsr166 1.22
378 dl 1.2 /**
379 jsr166 1.32 * getCorePoolSize returns size given in constructor if not otherwise set
380 dl 1.2 */
381 jsr166 1.25 public void testGetCorePoolSize() throws InterruptedException {
382 jsr166 1.33 ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
383     assertEquals(1, p.getCorePoolSize());
384     joinPool(p);
385 dl 1.2 }
386 jsr166 1.22
387 dl 1.2 /**
388 jsr166 1.32 * getLargestPoolSize increases, but doesn't overestimate, when
389     * multiple threads active
390 dl 1.2 */
391 jsr166 1.25 public void testGetLargestPoolSize() throws InterruptedException {
392 jsr166 1.33 final int THREADS = 3;
393     final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
394     final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
395     final CountDownLatch done = new CountDownLatch(1);
396     try {
397     assertEquals(0, p.getLargestPoolSize());
398     for (int i = 0; i < THREADS; i++)
399     p.execute(new CheckedRunnable() {
400     public void realRun() throws InterruptedException {
401     threadsStarted.countDown();
402     done.await();
403     assertEquals(THREADS, p.getLargestPoolSize());
404     }});
405     assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
406     assertEquals(THREADS, p.getLargestPoolSize());
407     } finally {
408     done.countDown();
409     joinPool(p);
410     assertEquals(THREADS, p.getLargestPoolSize());
411     }
412 dl 1.2 }
413 jsr166 1.22
414 dl 1.2 /**
415 jsr166 1.32 * getPoolSize increases, but doesn't overestimate, when threads
416     * become active
417 dl 1.2 */
418 jsr166 1.25 public void testGetPoolSize() throws InterruptedException {
419 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
420     final CountDownLatch threadStarted = new CountDownLatch(1);
421     final CountDownLatch done = new CountDownLatch(1);
422     try {
423     assertEquals(0, p.getPoolSize());
424     p.execute(new CheckedRunnable() {
425     public void realRun() throws InterruptedException {
426     threadStarted.countDown();
427     assertEquals(1, p.getPoolSize());
428     done.await();
429     }});
430     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
431     assertEquals(1, p.getPoolSize());
432     } finally {
433     done.countDown();
434     joinPool(p);
435     }
436 dl 1.2 }
437 jsr166 1.22
438 dl 1.2 /**
439 jsr166 1.32 * getTaskCount increases, but doesn't overestimate, when tasks
440     * submitted
441 dl 1.2 */
442 jsr166 1.25 public void testGetTaskCount() throws InterruptedException {
443 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
444     final CountDownLatch threadStarted = new CountDownLatch(1);
445     final CountDownLatch done = new CountDownLatch(1);
446     final int TASKS = 5;
447     try {
448     assertEquals(0, p.getTaskCount());
449     for (int i = 0; i < TASKS; i++)
450     p.execute(new CheckedRunnable() {
451     public void realRun() throws InterruptedException {
452     threadStarted.countDown();
453     done.await();
454     }});
455     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
456     assertEquals(TASKS, p.getTaskCount());
457     } finally {
458     done.countDown();
459     joinPool(p);
460     }
461 dl 1.2 }
462 dl 1.8
463 jsr166 1.22 /**
464 dl 1.8 * getThreadFactory returns factory in constructor if not set
465     */
466 jsr166 1.25 public void testGetThreadFactory() throws InterruptedException {
467 dl 1.8 ThreadFactory tf = new SimpleThreadFactory();
468 jsr166 1.26 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1, tf);
469 dl 1.8 assertSame(tf, p.getThreadFactory());
470     joinPool(p);
471     }
472    
473 jsr166 1.22 /**
474 dl 1.8 * setThreadFactory sets the thread factory returned by getThreadFactory
475     */
476 jsr166 1.25 public void testSetThreadFactory() throws InterruptedException {
477 dl 1.8 ThreadFactory tf = new SimpleThreadFactory();
478 jsr166 1.26 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
479 dl 1.8 p.setThreadFactory(tf);
480     assertSame(tf, p.getThreadFactory());
481     joinPool(p);
482     }
483    
484 jsr166 1.22 /**
485 dl 1.8 * setThreadFactory(null) throws NPE
486     */
487 jsr166 1.25 public void testSetThreadFactoryNull() throws InterruptedException {
488 jsr166 1.26 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
489 dl 1.8 try {
490     p.setThreadFactory(null);
491     shouldThrow();
492     } catch (NullPointerException success) {
493     } finally {
494     joinPool(p);
495     }
496     }
497 jsr166 1.22
498 dl 1.2 /**
499 jsr166 1.41 * isShutdown is false before shutdown, true after
500 dl 1.2 */
501 dl 1.5 public void testIsShutdown() {
502 jsr166 1.22
503 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
504 dl 1.2 try {
505 jsr166 1.33 assertFalse(p.isShutdown());
506 dl 1.2 }
507     finally {
508 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
509 dl 1.2 }
510 jsr166 1.33 assertTrue(p.isShutdown());
511 dl 1.2 }
512    
513     /**
514 jsr166 1.32 * isTerminated is false before termination, true after
515 dl 1.2 */
516 jsr166 1.25 public void testIsTerminated() throws InterruptedException {
517 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
518     final CountDownLatch threadStarted = new CountDownLatch(1);
519     final CountDownLatch done = new CountDownLatch(1);
520     assertFalse(p.isTerminated());
521     try {
522     p.execute(new CheckedRunnable() {
523     public void realRun() throws InterruptedException {
524 jsr166 1.36 assertFalse(p.isTerminated());
525 jsr166 1.33 threadStarted.countDown();
526     done.await();
527     }});
528     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
529 jsr166 1.36 assertFalse(p.isTerminating());
530 jsr166 1.33 done.countDown();
531 dl 1.2 } finally {
532 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
533 dl 1.2 }
534 jsr166 1.33 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
535     assertTrue(p.isTerminated());
536 dl 1.5 }
537    
538     /**
539 jsr166 1.32 * isTerminating is not true when running or when terminated
540 dl 1.5 */
541 jsr166 1.25 public void testIsTerminating() throws InterruptedException {
542 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
543     final CountDownLatch threadStarted = new CountDownLatch(1);
544     final CountDownLatch done = new CountDownLatch(1);
545     try {
546     assertFalse(p.isTerminating());
547     p.execute(new CheckedRunnable() {
548     public void realRun() throws InterruptedException {
549 jsr166 1.35 assertFalse(p.isTerminating());
550 jsr166 1.33 threadStarted.countDown();
551     done.await();
552     }});
553     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
554     assertFalse(p.isTerminating());
555     done.countDown();
556     } finally {
557     try { p.shutdown(); } catch (SecurityException ok) { return; }
558     }
559     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
560     assertTrue(p.isTerminated());
561     assertFalse(p.isTerminating());
562 dl 1.2 }
563    
564     /**
565 dl 1.8 * getQueue returns the work queue, which contains queued tasks
566     */
567 jsr166 1.25 public void testGetQueue() throws InterruptedException {
568 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
569     final CountDownLatch threadStarted = new CountDownLatch(1);
570     final CountDownLatch done = new CountDownLatch(1);
571 dl 1.8 try {
572 jsr166 1.33 ScheduledFuture[] tasks = new ScheduledFuture[5];
573     for (int i = 0; i < tasks.length; i++) {
574     Runnable r = new CheckedRunnable() {
575     public void realRun() throws InterruptedException {
576     threadStarted.countDown();
577     done.await();
578     }};
579     tasks[i] = p.schedule(r, 1, MILLISECONDS);
580     }
581     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
582     BlockingQueue<Runnable> q = p.getQueue();
583     assertTrue(q.contains(tasks[tasks.length - 1]));
584 dl 1.8 assertFalse(q.contains(tasks[0]));
585     } finally {
586 jsr166 1.33 done.countDown();
587     joinPool(p);
588 dl 1.8 }
589     }
590    
591     /**
592     * remove(task) removes queued task, and fails to remove active task
593     */
594 jsr166 1.25 public void testRemove() throws InterruptedException {
595 jsr166 1.33 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
596 dl 1.9 ScheduledFuture[] tasks = new ScheduledFuture[5];
597 jsr166 1.33 final CountDownLatch threadStarted = new CountDownLatch(1);
598     final CountDownLatch done = new CountDownLatch(1);
599 dl 1.8 try {
600 jsr166 1.33 for (int i = 0; i < tasks.length; i++) {
601     Runnable r = new CheckedRunnable() {
602     public void realRun() throws InterruptedException {
603     threadStarted.countDown();
604     done.await();
605     }};
606     tasks[i] = p.schedule(r, 1, MILLISECONDS);
607     }
608     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
609     BlockingQueue<Runnable> q = p.getQueue();
610     assertFalse(p.remove((Runnable)tasks[0]));
611 dl 1.8 assertTrue(q.contains((Runnable)tasks[4]));
612     assertTrue(q.contains((Runnable)tasks[3]));
613 jsr166 1.33 assertTrue(p.remove((Runnable)tasks[4]));
614     assertFalse(p.remove((Runnable)tasks[4]));
615 dl 1.8 assertFalse(q.contains((Runnable)tasks[4]));
616     assertTrue(q.contains((Runnable)tasks[3]));
617 jsr166 1.33 assertTrue(p.remove((Runnable)tasks[3]));
618 dl 1.8 assertFalse(q.contains((Runnable)tasks[3]));
619     } finally {
620 jsr166 1.33 done.countDown();
621     joinPool(p);
622 dl 1.8 }
623     }
624    
625     /**
626 jsr166 1.40 * purge eventually removes cancelled tasks from the queue
627 dl 1.2 */
628 jsr166 1.25 public void testPurge() throws InterruptedException {
629 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
630 dl 1.9 ScheduledFuture[] tasks = new ScheduledFuture[5];
631 jsr166 1.40 for (int i = 0; i < tasks.length; i++)
632     tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
633     LONG_DELAY_MS, MILLISECONDS);
634 dl 1.19 try {
635 jsr166 1.33 int max = tasks.length;
636 dl 1.19 if (tasks[4].cancel(true)) --max;
637     if (tasks[3].cancel(true)) --max;
638     // There must eventually be an interference-free point at
639     // which purge will not fail. (At worst, when queue is empty.)
640 jsr166 1.40 long startTime = System.nanoTime();
641     do {
642 jsr166 1.33 p.purge();
643     long count = p.getTaskCount();
644 jsr166 1.40 if (count == max)
645     return;
646     } while (millisElapsedSince(startTime) < MEDIUM_DELAY_MS);
647     fail("Purge failed to remove cancelled tasks");
648 dl 1.19 } finally {
649 jsr166 1.33 for (ScheduledFuture task : tasks)
650     task.cancel(true);
651     joinPool(p);
652 dl 1.2 }
653     }
654    
655     /**
656 jsr166 1.53 * shutdownNow returns a list containing tasks that were not run,
657     * and those tasks are drained from the queue
658 dl 1.2 */
659 jsr166 1.54 public void testShutdownNow_delayedTasks() throws InterruptedException {
660 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
661 jsr166 1.54 List<ScheduledFuture> tasks = new ArrayList<>();
662     for (int i = 0; i < 3; i++) {
663     Runnable r = new NoOpRunnable();
664     tasks.add(p.schedule(r, 9, SECONDS));
665     tasks.add(p.scheduleAtFixedRate(r, 9, 9, SECONDS));
666     tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS));
667     }
668     assertEquals(new HashSet(tasks), new HashSet(p.getQueue()));
669     final List<Runnable> queuedTasks;
670 dl 1.17 try {
671 jsr166 1.54 queuedTasks = p.shutdownNow();
672 jsr166 1.22 } catch (SecurityException ok) {
673 jsr166 1.54 return; // Allowed in case test doesn't have privs
674     }
675     assertTrue(p.isShutdown());
676     assertTrue(p.getQueue().isEmpty());
677     assertEquals(new HashSet(tasks), new HashSet(queuedTasks));
678     assertEquals(tasks.size(), queuedTasks.size());
679     for (ScheduledFuture task : tasks) {
680     assertFalse(task.isDone());
681     assertFalse(task.isCancelled());
682 dl 1.17 }
683 jsr166 1.54 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
684     assertTrue(p.isTerminated());
685 dl 1.2 }
686    
687 dl 1.5 /**
688 dl 1.6 * In default setting, shutdown cancels periodic but not delayed
689     * tasks at shutdown
690 dl 1.5 */
691 jsr166 1.41 public void testShutdown1() throws InterruptedException {
692 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
693     assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
694     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
695 jsr166 1.22
696 jsr166 1.25 ScheduledFuture[] tasks = new ScheduledFuture[5];
697 jsr166 1.33 for (int i = 0; i < tasks.length; i++)
698     tasks[i] = p.schedule(new NoOpRunnable(),
699     SHORT_DELAY_MS, MILLISECONDS);
700     try { p.shutdown(); } catch (SecurityException ok) { return; }
701     BlockingQueue<Runnable> q = p.getQueue();
702     for (ScheduledFuture task : tasks) {
703     assertFalse(task.isDone());
704     assertFalse(task.isCancelled());
705     assertTrue(q.contains(task));
706 jsr166 1.25 }
707 jsr166 1.33 assertTrue(p.isShutdown());
708     assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
709     assertTrue(p.isTerminated());
710     for (ScheduledFuture task : tasks) {
711     assertTrue(task.isDone());
712     assertFalse(task.isCancelled());
713 dl 1.2 }
714     }
715    
716 dl 1.5 /**
717 dl 1.6 * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
718     * delayed tasks are cancelled at shutdown
719 dl 1.5 */
720 jsr166 1.41 public void testShutdown2() throws InterruptedException {
721 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
722     p.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
723 jsr166 1.34 assertFalse(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
724     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
725 jsr166 1.25 ScheduledFuture[] tasks = new ScheduledFuture[5];
726 jsr166 1.33 for (int i = 0; i < tasks.length; i++)
727     tasks[i] = p.schedule(new NoOpRunnable(),
728     SHORT_DELAY_MS, MILLISECONDS);
729     BlockingQueue q = p.getQueue();
730     assertEquals(tasks.length, q.size());
731     try { p.shutdown(); } catch (SecurityException ok) { return; }
732     assertTrue(p.isShutdown());
733 jsr166 1.25 assertTrue(q.isEmpty());
734 jsr166 1.33 assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
735     assertTrue(p.isTerminated());
736     for (ScheduledFuture task : tasks) {
737     assertTrue(task.isDone());
738     assertTrue(task.isCancelled());
739     }
740 dl 1.2 }
741    
742 dl 1.5 /**
743 dl 1.6 * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
744 jsr166 1.33 * periodic tasks are cancelled at shutdown
745 dl 1.5 */
746 jsr166 1.41 public void testShutdown3() throws InterruptedException {
747 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
748 jsr166 1.34 assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
749     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
750 jsr166 1.33 p.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
751 jsr166 1.34 assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
752     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
753 jsr166 1.42 long initialDelay = LONG_DELAY_MS;
754 jsr166 1.25 ScheduledFuture task =
755 jsr166 1.42 p.scheduleAtFixedRate(new NoOpRunnable(), initialDelay,
756     5, MILLISECONDS);
757 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
758     assertTrue(p.isShutdown());
759     assertTrue(p.getQueue().isEmpty());
760     assertTrue(task.isDone());
761     assertTrue(task.isCancelled());
762 jsr166 1.42 joinPool(p);
763 dl 1.2 }
764    
765 dl 1.5 /**
766 dl 1.6 * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
767 jsr166 1.33 * periodic tasks are not cancelled at shutdown
768 dl 1.5 */
769 jsr166 1.41 public void testShutdown4() throws InterruptedException {
770 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
771     final CountDownLatch counter = new CountDownLatch(2);
772 dl 1.2 try {
773 jsr166 1.34 p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
774     assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
775     assertTrue(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
776 jsr166 1.33 final Runnable r = new CheckedRunnable() {
777     public void realRun() {
778     counter.countDown();
779     }};
780 dl 1.9 ScheduledFuture task =
781 jsr166 1.33 p.scheduleAtFixedRate(r, 1, 1, MILLISECONDS);
782     assertFalse(task.isDone());
783 dl 1.2 assertFalse(task.isCancelled());
784 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
785 dl 1.2 assertFalse(task.isCancelled());
786 jsr166 1.33 assertFalse(p.isTerminated());
787     assertTrue(p.isShutdown());
788     assertTrue(counter.await(SMALL_DELAY_MS, MILLISECONDS));
789 dl 1.2 assertFalse(task.isCancelled());
790 jsr166 1.33 assertTrue(task.cancel(false));
791 dl 1.15 assertTrue(task.isDone());
792 jsr166 1.33 assertTrue(task.isCancelled());
793     assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
794     assertTrue(p.isTerminated());
795 dl 1.2 }
796 jsr166 1.22 finally {
797 jsr166 1.33 joinPool(p);
798 dl 1.2 }
799 dl 1.1 }
800    
801 dl 1.10 /**
802     * completed submit of callable returns result
803     */
804 jsr166 1.25 public void testSubmitCallable() throws Exception {
805 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
806     try {
807     Future<String> future = e.submit(new StringTask());
808     String result = future.get();
809     assertSame(TEST_STRING, result);
810     } finally {
811     joinPool(e);
812     }
813     }
814    
815     /**
816     * completed submit of runnable returns successfully
817     */
818 jsr166 1.25 public void testSubmitRunnable() throws Exception {
819 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
820     try {
821     Future<?> future = e.submit(new NoOpRunnable());
822     future.get();
823     assertTrue(future.isDone());
824     } finally {
825     joinPool(e);
826     }
827     }
828    
829     /**
830     * completed submit of (runnable, result) returns result
831     */
832 jsr166 1.25 public void testSubmitRunnable2() throws Exception {
833 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
834     try {
835     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
836     String result = future.get();
837     assertSame(TEST_STRING, result);
838     } finally {
839     joinPool(e);
840     }
841     }
842    
843     /**
844     * invokeAny(null) throws NPE
845     */
846 jsr166 1.25 public void testInvokeAny1() throws Exception {
847 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
848     try {
849     e.invokeAny(null);
850 jsr166 1.25 shouldThrow();
851 dl 1.10 } catch (NullPointerException success) {
852     } finally {
853     joinPool(e);
854     }
855     }
856    
857     /**
858     * invokeAny(empty collection) throws IAE
859     */
860 jsr166 1.25 public void testInvokeAny2() throws Exception {
861 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
862     try {
863     e.invokeAny(new ArrayList<Callable<String>>());
864 jsr166 1.25 shouldThrow();
865 dl 1.10 } catch (IllegalArgumentException success) {
866     } finally {
867     joinPool(e);
868     }
869     }
870    
871     /**
872     * invokeAny(c) throws NPE if c has null elements
873     */
874 jsr166 1.25 public void testInvokeAny3() throws Exception {
875 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
876 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
877 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
878     l.add(latchAwaitingStringTask(latch));
879     l.add(null);
880 dl 1.10 try {
881     e.invokeAny(l);
882 jsr166 1.25 shouldThrow();
883 dl 1.10 } catch (NullPointerException success) {
884     } finally {
885 jsr166 1.25 latch.countDown();
886 dl 1.10 joinPool(e);
887     }
888     }
889    
890     /**
891     * invokeAny(c) throws ExecutionException if no task completes
892     */
893 jsr166 1.25 public void testInvokeAny4() throws Exception {
894 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
895 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
896     l.add(new NPETask());
897 dl 1.10 try {
898     e.invokeAny(l);
899 jsr166 1.25 shouldThrow();
900 dl 1.10 } catch (ExecutionException success) {
901 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
902 dl 1.10 } finally {
903     joinPool(e);
904     }
905     }
906    
907     /**
908     * invokeAny(c) returns result of some task
909     */
910 jsr166 1.25 public void testInvokeAny5() throws Exception {
911 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
912     try {
913 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
914 dl 1.10 l.add(new StringTask());
915     l.add(new StringTask());
916     String result = e.invokeAny(l);
917     assertSame(TEST_STRING, result);
918     } finally {
919     joinPool(e);
920     }
921     }
922    
923     /**
924     * invokeAll(null) throws NPE
925     */
926 jsr166 1.25 public void testInvokeAll1() throws Exception {
927 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
928     try {
929     e.invokeAll(null);
930 jsr166 1.25 shouldThrow();
931 dl 1.10 } catch (NullPointerException success) {
932     } finally {
933     joinPool(e);
934     }
935     }
936    
937     /**
938     * invokeAll(empty collection) returns empty collection
939     */
940 jsr166 1.25 public void testInvokeAll2() throws Exception {
941 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
942     try {
943     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
944     assertTrue(r.isEmpty());
945     } finally {
946     joinPool(e);
947     }
948     }
949    
950     /**
951     * invokeAll(c) throws NPE if c has null elements
952     */
953 jsr166 1.25 public void testInvokeAll3() throws Exception {
954 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
955 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
956     l.add(new StringTask());
957     l.add(null);
958 dl 1.10 try {
959     e.invokeAll(l);
960 jsr166 1.25 shouldThrow();
961 dl 1.10 } catch (NullPointerException success) {
962     } finally {
963     joinPool(e);
964     }
965     }
966    
967     /**
968     * get of invokeAll(c) throws exception on failed task
969     */
970 jsr166 1.25 public void testInvokeAll4() throws Exception {
971 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
972 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
973     l.add(new NPETask());
974     List<Future<String>> futures = e.invokeAll(l);
975     assertEquals(1, futures.size());
976 dl 1.10 try {
977 jsr166 1.29 futures.get(0).get();
978 jsr166 1.25 shouldThrow();
979 jsr166 1.23 } catch (ExecutionException success) {
980 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
981 dl 1.10 } finally {
982     joinPool(e);
983     }
984     }
985    
986     /**
987     * invokeAll(c) returns results of all completed tasks
988     */
989 jsr166 1.25 public void testInvokeAll5() throws Exception {
990 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
991     try {
992 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
993 dl 1.10 l.add(new StringTask());
994     l.add(new StringTask());
995 jsr166 1.29 List<Future<String>> futures = e.invokeAll(l);
996     assertEquals(2, futures.size());
997     for (Future<String> future : futures)
998 jsr166 1.25 assertSame(TEST_STRING, future.get());
999 dl 1.10 } finally {
1000     joinPool(e);
1001     }
1002     }
1003    
1004 dl 1.11 /**
1005     * timed invokeAny(null) throws NPE
1006     */
1007 jsr166 1.25 public void testTimedInvokeAny1() throws Exception {
1008 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1009     try {
1010 jsr166 1.25 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1011     shouldThrow();
1012 dl 1.11 } catch (NullPointerException success) {
1013     } finally {
1014     joinPool(e);
1015     }
1016     }
1017    
1018     /**
1019     * timed invokeAny(,,null) throws NPE
1020     */
1021 jsr166 1.25 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1022 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1023 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1024     l.add(new StringTask());
1025 dl 1.11 try {
1026     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1027 jsr166 1.25 shouldThrow();
1028 dl 1.11 } catch (NullPointerException success) {
1029     } finally {
1030     joinPool(e);
1031     }
1032     }
1033    
1034     /**
1035     * timed invokeAny(empty collection) throws IAE
1036     */
1037 jsr166 1.25 public void testTimedInvokeAny2() throws Exception {
1038 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1039     try {
1040 jsr166 1.25 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1041     shouldThrow();
1042 dl 1.11 } catch (IllegalArgumentException success) {
1043     } finally {
1044     joinPool(e);
1045     }
1046     }
1047    
1048     /**
1049     * timed invokeAny(c) throws NPE if c has null elements
1050     */
1051 jsr166 1.25 public void testTimedInvokeAny3() throws Exception {
1052 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
1053 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1054 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1055     l.add(latchAwaitingStringTask(latch));
1056     l.add(null);
1057 dl 1.11 try {
1058 jsr166 1.25 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1059     shouldThrow();
1060 dl 1.11 } catch (NullPointerException success) {
1061     } finally {
1062 jsr166 1.25 latch.countDown();
1063 dl 1.11 joinPool(e);
1064     }
1065     }
1066    
1067     /**
1068     * timed invokeAny(c) throws ExecutionException if no task completes
1069     */
1070 jsr166 1.25 public void testTimedInvokeAny4() throws Exception {
1071 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1072 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1073     l.add(new NPETask());
1074 dl 1.11 try {
1075 jsr166 1.25 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1076     shouldThrow();
1077 jsr166 1.23 } catch (ExecutionException success) {
1078 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
1079 dl 1.11 } finally {
1080     joinPool(e);
1081     }
1082     }
1083    
1084     /**
1085     * timed invokeAny(c) returns result of some task
1086     */
1087 jsr166 1.25 public void testTimedInvokeAny5() throws Exception {
1088 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1089     try {
1090 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1091 dl 1.11 l.add(new StringTask());
1092     l.add(new StringTask());
1093 jsr166 1.25 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1094 dl 1.11 assertSame(TEST_STRING, result);
1095     } finally {
1096     joinPool(e);
1097     }
1098     }
1099    
1100     /**
1101     * timed invokeAll(null) throws NPE
1102     */
1103 jsr166 1.25 public void testTimedInvokeAll1() throws Exception {
1104 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1105     try {
1106 jsr166 1.25 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1107     shouldThrow();
1108 dl 1.11 } catch (NullPointerException success) {
1109     } finally {
1110     joinPool(e);
1111     }
1112     }
1113    
1114     /**
1115     * timed invokeAll(,,null) throws NPE
1116     */
1117 jsr166 1.25 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1118 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1119 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1120     l.add(new StringTask());
1121 dl 1.11 try {
1122     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1123 jsr166 1.25 shouldThrow();
1124 dl 1.11 } catch (NullPointerException success) {
1125     } finally {
1126     joinPool(e);
1127     }
1128     }
1129    
1130     /**
1131     * timed invokeAll(empty collection) returns empty collection
1132     */
1133 jsr166 1.25 public void testTimedInvokeAll2() throws Exception {
1134 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1135     try {
1136 jsr166 1.25 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1137 dl 1.11 assertTrue(r.isEmpty());
1138     } finally {
1139     joinPool(e);
1140     }
1141     }
1142    
1143     /**
1144     * timed invokeAll(c) throws NPE if c has null elements
1145     */
1146 jsr166 1.25 public void testTimedInvokeAll3() throws Exception {
1147 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1148 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1149     l.add(new StringTask());
1150     l.add(null);
1151 dl 1.11 try {
1152 jsr166 1.25 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1153     shouldThrow();
1154 dl 1.11 } catch (NullPointerException success) {
1155     } finally {
1156     joinPool(e);
1157     }
1158     }
1159    
1160     /**
1161     * get of element of invokeAll(c) throws exception on failed task
1162     */
1163 jsr166 1.25 public void testTimedInvokeAll4() throws Exception {
1164 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1165 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1166     l.add(new NPETask());
1167     List<Future<String>> futures =
1168     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1169     assertEquals(1, futures.size());
1170 dl 1.11 try {
1171 jsr166 1.29 futures.get(0).get();
1172 jsr166 1.25 shouldThrow();
1173 jsr166 1.23 } catch (ExecutionException success) {
1174 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
1175 dl 1.11 } finally {
1176     joinPool(e);
1177     }
1178     }
1179    
1180     /**
1181     * timed invokeAll(c) returns results of all completed tasks
1182     */
1183 jsr166 1.25 public void testTimedInvokeAll5() throws Exception {
1184 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1185     try {
1186 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1187 dl 1.11 l.add(new StringTask());
1188     l.add(new StringTask());
1189 jsr166 1.29 List<Future<String>> futures =
1190     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1191     assertEquals(2, futures.size());
1192     for (Future<String> future : futures)
1193 jsr166 1.25 assertSame(TEST_STRING, future.get());
1194 dl 1.11 } finally {
1195     joinPool(e);
1196     }
1197     }
1198    
1199     /**
1200     * timed invokeAll(c) cancels tasks not completed by timeout
1201     */
1202 jsr166 1.25 public void testTimedInvokeAll6() throws Exception {
1203 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1204     try {
1205 jsr166 1.52 for (long timeout = timeoutMillis();;) {
1206     List<Callable<String>> tasks = new ArrayList<>();
1207     tasks.add(new StringTask("0"));
1208     tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1209     tasks.add(new StringTask("2"));
1210     long startTime = System.nanoTime();
1211     List<Future<String>> futures =
1212     e.invokeAll(tasks, timeout, MILLISECONDS);
1213     assertEquals(tasks.size(), futures.size());
1214     assertTrue(millisElapsedSince(startTime) >= timeout);
1215     for (Future future : futures)
1216     assertTrue(future.isDone());
1217     assertTrue(futures.get(1).isCancelled());
1218     try {
1219     assertEquals("0", futures.get(0).get());
1220     assertEquals("2", futures.get(2).get());
1221     break;
1222     } catch (CancellationException retryWithLongerTimeout) {
1223     timeout *= 2;
1224     if (timeout >= LONG_DELAY_MS / 2)
1225     fail("expected exactly one task to be cancelled");
1226     }
1227     }
1228 dl 1.11 } finally {
1229     joinPool(e);
1230     }
1231     }
1232    
1233 dl 1.1 }