ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.56
Committed: Mon Sep 28 02:41:29 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.55: +35 -0 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.56 public void testShutdownNow() throws InterruptedException {
660     final int poolSize = 2;
661     final int count = 5;
662     final AtomicInteger ran = new AtomicInteger(0);
663     final ScheduledThreadPoolExecutor p =
664     new ScheduledThreadPoolExecutor(poolSize);
665     CountDownLatch threadsStarted = new CountDownLatch(poolSize);
666     CheckedRunnable waiter = new CheckedRunnable() { public void realRun() {
667     threadsStarted.countDown();
668     try {
669     MILLISECONDS.sleep(2 * LONG_DELAY_MS);
670     } catch (InterruptedException success) {}
671     ran.getAndIncrement();
672     }};
673     for (int i = 0; i < count; i++)
674     p.execute(waiter);
675     assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
676     final List<Runnable> queuedTasks;
677     try {
678     queuedTasks = p.shutdownNow();
679     } catch (SecurityException ok) {
680     return; // Allowed in case test doesn't have privs
681     }
682     assertTrue(p.isShutdown());
683     assertTrue(p.getQueue().isEmpty());
684     assertEquals(count - poolSize, queuedTasks.size());
685     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
686     assertTrue(p.isTerminated());
687     assertEquals(poolSize, ran.get());
688     }
689    
690     /**
691     * shutdownNow returns a list containing tasks that were not run,
692     * and those tasks are drained from the queue
693     */
694 jsr166 1.54 public void testShutdownNow_delayedTasks() throws InterruptedException {
695 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
696 jsr166 1.54 List<ScheduledFuture> tasks = new ArrayList<>();
697     for (int i = 0; i < 3; i++) {
698     Runnable r = new NoOpRunnable();
699     tasks.add(p.schedule(r, 9, SECONDS));
700     tasks.add(p.scheduleAtFixedRate(r, 9, 9, SECONDS));
701     tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS));
702     }
703 jsr166 1.55 if (testImplementationDetails)
704     assertEquals(new HashSet(tasks), new HashSet(p.getQueue()));
705 jsr166 1.54 final List<Runnable> queuedTasks;
706 dl 1.17 try {
707 jsr166 1.54 queuedTasks = p.shutdownNow();
708 jsr166 1.22 } catch (SecurityException ok) {
709 jsr166 1.54 return; // Allowed in case test doesn't have privs
710     }
711     assertTrue(p.isShutdown());
712     assertTrue(p.getQueue().isEmpty());
713 jsr166 1.55 if (testImplementationDetails)
714     assertEquals(new HashSet(tasks), new HashSet(queuedTasks));
715 jsr166 1.54 assertEquals(tasks.size(), queuedTasks.size());
716     for (ScheduledFuture task : tasks) {
717     assertFalse(task.isDone());
718     assertFalse(task.isCancelled());
719 dl 1.17 }
720 jsr166 1.54 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
721     assertTrue(p.isTerminated());
722 dl 1.2 }
723    
724 dl 1.5 /**
725 dl 1.6 * In default setting, shutdown cancels periodic but not delayed
726     * tasks at shutdown
727 dl 1.5 */
728 jsr166 1.41 public void testShutdown1() throws InterruptedException {
729 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
730     assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
731     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
732 jsr166 1.22
733 jsr166 1.25 ScheduledFuture[] tasks = new ScheduledFuture[5];
734 jsr166 1.33 for (int i = 0; i < tasks.length; i++)
735     tasks[i] = p.schedule(new NoOpRunnable(),
736     SHORT_DELAY_MS, MILLISECONDS);
737     try { p.shutdown(); } catch (SecurityException ok) { return; }
738     BlockingQueue<Runnable> q = p.getQueue();
739     for (ScheduledFuture task : tasks) {
740     assertFalse(task.isDone());
741     assertFalse(task.isCancelled());
742     assertTrue(q.contains(task));
743 jsr166 1.25 }
744 jsr166 1.33 assertTrue(p.isShutdown());
745     assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
746     assertTrue(p.isTerminated());
747     for (ScheduledFuture task : tasks) {
748     assertTrue(task.isDone());
749     assertFalse(task.isCancelled());
750 dl 1.2 }
751     }
752    
753 dl 1.5 /**
754 dl 1.6 * If setExecuteExistingDelayedTasksAfterShutdownPolicy is false,
755     * delayed tasks are cancelled at shutdown
756 dl 1.5 */
757 jsr166 1.41 public void testShutdown2() throws InterruptedException {
758 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
759     p.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
760 jsr166 1.34 assertFalse(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
761     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
762 jsr166 1.25 ScheduledFuture[] tasks = new ScheduledFuture[5];
763 jsr166 1.33 for (int i = 0; i < tasks.length; i++)
764     tasks[i] = p.schedule(new NoOpRunnable(),
765     SHORT_DELAY_MS, MILLISECONDS);
766     BlockingQueue q = p.getQueue();
767     assertEquals(tasks.length, q.size());
768     try { p.shutdown(); } catch (SecurityException ok) { return; }
769     assertTrue(p.isShutdown());
770 jsr166 1.25 assertTrue(q.isEmpty());
771 jsr166 1.33 assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
772     assertTrue(p.isTerminated());
773     for (ScheduledFuture task : tasks) {
774     assertTrue(task.isDone());
775     assertTrue(task.isCancelled());
776     }
777 dl 1.2 }
778    
779 dl 1.5 /**
780 dl 1.6 * If setContinueExistingPeriodicTasksAfterShutdownPolicy is set false,
781 jsr166 1.33 * periodic tasks are cancelled at shutdown
782 dl 1.5 */
783 jsr166 1.41 public void testShutdown3() throws InterruptedException {
784 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
785 jsr166 1.34 assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
786     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
787 jsr166 1.33 p.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
788 jsr166 1.34 assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
789     assertFalse(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
790 jsr166 1.42 long initialDelay = LONG_DELAY_MS;
791 jsr166 1.25 ScheduledFuture task =
792 jsr166 1.42 p.scheduleAtFixedRate(new NoOpRunnable(), initialDelay,
793     5, MILLISECONDS);
794 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
795     assertTrue(p.isShutdown());
796     assertTrue(p.getQueue().isEmpty());
797     assertTrue(task.isDone());
798     assertTrue(task.isCancelled());
799 jsr166 1.42 joinPool(p);
800 dl 1.2 }
801    
802 dl 1.5 /**
803 dl 1.6 * if setContinueExistingPeriodicTasksAfterShutdownPolicy is true,
804 jsr166 1.33 * periodic tasks are not cancelled at shutdown
805 dl 1.5 */
806 jsr166 1.41 public void testShutdown4() throws InterruptedException {
807 jsr166 1.33 ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
808     final CountDownLatch counter = new CountDownLatch(2);
809 dl 1.2 try {
810 jsr166 1.34 p.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
811     assertTrue(p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
812     assertTrue(p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
813 jsr166 1.33 final Runnable r = new CheckedRunnable() {
814     public void realRun() {
815     counter.countDown();
816     }};
817 dl 1.9 ScheduledFuture task =
818 jsr166 1.33 p.scheduleAtFixedRate(r, 1, 1, MILLISECONDS);
819     assertFalse(task.isDone());
820 dl 1.2 assertFalse(task.isCancelled());
821 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
822 dl 1.2 assertFalse(task.isCancelled());
823 jsr166 1.33 assertFalse(p.isTerminated());
824     assertTrue(p.isShutdown());
825     assertTrue(counter.await(SMALL_DELAY_MS, MILLISECONDS));
826 dl 1.2 assertFalse(task.isCancelled());
827 jsr166 1.33 assertTrue(task.cancel(false));
828 dl 1.15 assertTrue(task.isDone());
829 jsr166 1.33 assertTrue(task.isCancelled());
830     assertTrue(p.awaitTermination(SMALL_DELAY_MS, MILLISECONDS));
831     assertTrue(p.isTerminated());
832 dl 1.2 }
833 jsr166 1.22 finally {
834 jsr166 1.33 joinPool(p);
835 dl 1.2 }
836 dl 1.1 }
837    
838 dl 1.10 /**
839     * completed submit of callable returns result
840     */
841 jsr166 1.25 public void testSubmitCallable() throws Exception {
842 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
843     try {
844     Future<String> future = e.submit(new StringTask());
845     String result = future.get();
846     assertSame(TEST_STRING, result);
847     } finally {
848     joinPool(e);
849     }
850     }
851    
852     /**
853     * completed submit of runnable returns successfully
854     */
855 jsr166 1.25 public void testSubmitRunnable() throws Exception {
856 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
857     try {
858     Future<?> future = e.submit(new NoOpRunnable());
859     future.get();
860     assertTrue(future.isDone());
861     } finally {
862     joinPool(e);
863     }
864     }
865    
866     /**
867     * completed submit of (runnable, result) returns result
868     */
869 jsr166 1.25 public void testSubmitRunnable2() throws Exception {
870 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
871     try {
872     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
873     String result = future.get();
874     assertSame(TEST_STRING, result);
875     } finally {
876     joinPool(e);
877     }
878     }
879    
880     /**
881     * invokeAny(null) throws NPE
882     */
883 jsr166 1.25 public void testInvokeAny1() throws Exception {
884 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
885     try {
886     e.invokeAny(null);
887 jsr166 1.25 shouldThrow();
888 dl 1.10 } catch (NullPointerException success) {
889     } finally {
890     joinPool(e);
891     }
892     }
893    
894     /**
895     * invokeAny(empty collection) throws IAE
896     */
897 jsr166 1.25 public void testInvokeAny2() throws Exception {
898 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
899     try {
900     e.invokeAny(new ArrayList<Callable<String>>());
901 jsr166 1.25 shouldThrow();
902 dl 1.10 } catch (IllegalArgumentException success) {
903     } finally {
904     joinPool(e);
905     }
906     }
907    
908     /**
909     * invokeAny(c) throws NPE if c has null elements
910     */
911 jsr166 1.25 public void testInvokeAny3() throws Exception {
912 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
913 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
914 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
915     l.add(latchAwaitingStringTask(latch));
916     l.add(null);
917 dl 1.10 try {
918     e.invokeAny(l);
919 jsr166 1.25 shouldThrow();
920 dl 1.10 } catch (NullPointerException success) {
921     } finally {
922 jsr166 1.25 latch.countDown();
923 dl 1.10 joinPool(e);
924     }
925     }
926    
927     /**
928     * invokeAny(c) throws ExecutionException if no task completes
929     */
930 jsr166 1.25 public void testInvokeAny4() throws Exception {
931 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
932 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
933     l.add(new NPETask());
934 dl 1.10 try {
935     e.invokeAny(l);
936 jsr166 1.25 shouldThrow();
937 dl 1.10 } catch (ExecutionException success) {
938 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
939 dl 1.10 } finally {
940     joinPool(e);
941     }
942     }
943    
944     /**
945     * invokeAny(c) returns result of some task
946     */
947 jsr166 1.25 public void testInvokeAny5() throws Exception {
948 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
949     try {
950 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
951 dl 1.10 l.add(new StringTask());
952     l.add(new StringTask());
953     String result = e.invokeAny(l);
954     assertSame(TEST_STRING, result);
955     } finally {
956     joinPool(e);
957     }
958     }
959    
960     /**
961     * invokeAll(null) throws NPE
962     */
963 jsr166 1.25 public void testInvokeAll1() throws Exception {
964 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
965     try {
966     e.invokeAll(null);
967 jsr166 1.25 shouldThrow();
968 dl 1.10 } catch (NullPointerException success) {
969     } finally {
970     joinPool(e);
971     }
972     }
973    
974     /**
975     * invokeAll(empty collection) returns empty collection
976     */
977 jsr166 1.25 public void testInvokeAll2() throws Exception {
978 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
979     try {
980     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
981     assertTrue(r.isEmpty());
982     } finally {
983     joinPool(e);
984     }
985     }
986    
987     /**
988     * invokeAll(c) throws NPE if c has null elements
989     */
990 jsr166 1.25 public void testInvokeAll3() throws Exception {
991 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
992 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
993     l.add(new StringTask());
994     l.add(null);
995 dl 1.10 try {
996     e.invokeAll(l);
997 jsr166 1.25 shouldThrow();
998 dl 1.10 } catch (NullPointerException success) {
999     } finally {
1000     joinPool(e);
1001     }
1002     }
1003    
1004     /**
1005     * get of invokeAll(c) throws exception on failed task
1006     */
1007 jsr166 1.25 public void testInvokeAll4() throws Exception {
1008 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1009 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1010     l.add(new NPETask());
1011     List<Future<String>> futures = e.invokeAll(l);
1012     assertEquals(1, futures.size());
1013 dl 1.10 try {
1014 jsr166 1.29 futures.get(0).get();
1015 jsr166 1.25 shouldThrow();
1016 jsr166 1.23 } catch (ExecutionException success) {
1017 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
1018 dl 1.10 } finally {
1019     joinPool(e);
1020     }
1021     }
1022    
1023     /**
1024     * invokeAll(c) returns results of all completed tasks
1025     */
1026 jsr166 1.25 public void testInvokeAll5() throws Exception {
1027 dl 1.10 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1028     try {
1029 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1030 dl 1.10 l.add(new StringTask());
1031     l.add(new StringTask());
1032 jsr166 1.29 List<Future<String>> futures = e.invokeAll(l);
1033     assertEquals(2, futures.size());
1034     for (Future<String> future : futures)
1035 jsr166 1.25 assertSame(TEST_STRING, future.get());
1036 dl 1.10 } finally {
1037     joinPool(e);
1038     }
1039     }
1040    
1041 dl 1.11 /**
1042     * timed invokeAny(null) throws NPE
1043     */
1044 jsr166 1.25 public void testTimedInvokeAny1() throws Exception {
1045 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1046     try {
1047 jsr166 1.25 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1048     shouldThrow();
1049 dl 1.11 } catch (NullPointerException success) {
1050     } finally {
1051     joinPool(e);
1052     }
1053     }
1054    
1055     /**
1056     * timed invokeAny(,,null) throws NPE
1057     */
1058 jsr166 1.25 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1059 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1060 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1061     l.add(new StringTask());
1062 dl 1.11 try {
1063     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1064 jsr166 1.25 shouldThrow();
1065 dl 1.11 } catch (NullPointerException success) {
1066     } finally {
1067     joinPool(e);
1068     }
1069     }
1070    
1071     /**
1072     * timed invokeAny(empty collection) throws IAE
1073     */
1074 jsr166 1.25 public void testTimedInvokeAny2() throws Exception {
1075 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1076     try {
1077 jsr166 1.25 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1078     shouldThrow();
1079 dl 1.11 } catch (IllegalArgumentException success) {
1080     } finally {
1081     joinPool(e);
1082     }
1083     }
1084    
1085     /**
1086     * timed invokeAny(c) throws NPE if c has null elements
1087     */
1088 jsr166 1.25 public void testTimedInvokeAny3() throws Exception {
1089 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
1090 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1091 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1092     l.add(latchAwaitingStringTask(latch));
1093     l.add(null);
1094 dl 1.11 try {
1095 jsr166 1.25 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1096     shouldThrow();
1097 dl 1.11 } catch (NullPointerException success) {
1098     } finally {
1099 jsr166 1.25 latch.countDown();
1100 dl 1.11 joinPool(e);
1101     }
1102     }
1103    
1104     /**
1105     * timed invokeAny(c) throws ExecutionException if no task completes
1106     */
1107 jsr166 1.25 public void testTimedInvokeAny4() throws Exception {
1108 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1109 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1110     l.add(new NPETask());
1111 dl 1.11 try {
1112 jsr166 1.25 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1113     shouldThrow();
1114 jsr166 1.23 } catch (ExecutionException success) {
1115 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
1116 dl 1.11 } finally {
1117     joinPool(e);
1118     }
1119     }
1120    
1121     /**
1122     * timed invokeAny(c) returns result of some task
1123     */
1124 jsr166 1.25 public void testTimedInvokeAny5() throws Exception {
1125 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1126     try {
1127 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1128 dl 1.11 l.add(new StringTask());
1129     l.add(new StringTask());
1130 jsr166 1.25 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1131 dl 1.11 assertSame(TEST_STRING, result);
1132     } finally {
1133     joinPool(e);
1134     }
1135     }
1136    
1137     /**
1138     * timed invokeAll(null) throws NPE
1139     */
1140 jsr166 1.25 public void testTimedInvokeAll1() throws Exception {
1141 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1142     try {
1143 jsr166 1.25 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1144     shouldThrow();
1145 dl 1.11 } catch (NullPointerException success) {
1146     } finally {
1147     joinPool(e);
1148     }
1149     }
1150    
1151     /**
1152     * timed invokeAll(,,null) throws NPE
1153     */
1154 jsr166 1.25 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1155 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1156 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1157     l.add(new StringTask());
1158 dl 1.11 try {
1159     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1160 jsr166 1.25 shouldThrow();
1161 dl 1.11 } catch (NullPointerException success) {
1162     } finally {
1163     joinPool(e);
1164     }
1165     }
1166    
1167     /**
1168     * timed invokeAll(empty collection) returns empty collection
1169     */
1170 jsr166 1.25 public void testTimedInvokeAll2() throws Exception {
1171 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1172     try {
1173 jsr166 1.25 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1174 dl 1.11 assertTrue(r.isEmpty());
1175     } finally {
1176     joinPool(e);
1177     }
1178     }
1179    
1180     /**
1181     * timed invokeAll(c) throws NPE if c has null elements
1182     */
1183 jsr166 1.25 public void testTimedInvokeAll3() throws Exception {
1184 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1185 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1186     l.add(new StringTask());
1187     l.add(null);
1188 dl 1.11 try {
1189 jsr166 1.25 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1190     shouldThrow();
1191 dl 1.11 } catch (NullPointerException success) {
1192     } finally {
1193     joinPool(e);
1194     }
1195     }
1196    
1197     /**
1198     * get of element of invokeAll(c) throws exception on failed task
1199     */
1200 jsr166 1.25 public void testTimedInvokeAll4() throws Exception {
1201 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1202 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1203     l.add(new NPETask());
1204     List<Future<String>> futures =
1205     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1206     assertEquals(1, futures.size());
1207 dl 1.11 try {
1208 jsr166 1.29 futures.get(0).get();
1209 jsr166 1.25 shouldThrow();
1210 jsr166 1.23 } catch (ExecutionException success) {
1211 jsr166 1.25 assertTrue(success.getCause() instanceof NullPointerException);
1212 dl 1.11 } finally {
1213     joinPool(e);
1214     }
1215     }
1216    
1217     /**
1218     * timed invokeAll(c) returns results of all completed tasks
1219     */
1220 jsr166 1.25 public void testTimedInvokeAll5() throws Exception {
1221 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1222     try {
1223 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1224 dl 1.11 l.add(new StringTask());
1225     l.add(new StringTask());
1226 jsr166 1.29 List<Future<String>> futures =
1227     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1228     assertEquals(2, futures.size());
1229     for (Future<String> future : futures)
1230 jsr166 1.25 assertSame(TEST_STRING, future.get());
1231 dl 1.11 } finally {
1232     joinPool(e);
1233     }
1234     }
1235    
1236     /**
1237     * timed invokeAll(c) cancels tasks not completed by timeout
1238     */
1239 jsr166 1.25 public void testTimedInvokeAll6() throws Exception {
1240 dl 1.11 ExecutorService e = new ScheduledThreadPoolExecutor(2);
1241     try {
1242 jsr166 1.52 for (long timeout = timeoutMillis();;) {
1243     List<Callable<String>> tasks = new ArrayList<>();
1244     tasks.add(new StringTask("0"));
1245     tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1246     tasks.add(new StringTask("2"));
1247     long startTime = System.nanoTime();
1248     List<Future<String>> futures =
1249     e.invokeAll(tasks, timeout, MILLISECONDS);
1250     assertEquals(tasks.size(), futures.size());
1251     assertTrue(millisElapsedSince(startTime) >= timeout);
1252     for (Future future : futures)
1253     assertTrue(future.isDone());
1254     assertTrue(futures.get(1).isCancelled());
1255     try {
1256     assertEquals("0", futures.get(0).get());
1257     assertEquals("2", futures.get(2).get());
1258     break;
1259     } catch (CancellationException retryWithLongerTimeout) {
1260     timeout *= 2;
1261     if (timeout >= LONG_DELAY_MS / 2)
1262     fail("expected exactly one task to be cancelled");
1263     }
1264     }
1265 dl 1.11 } finally {
1266     joinPool(e);
1267     }
1268     }
1269    
1270 dl 1.1 }