ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.55
Committed: Mon Sep 28 02:32:57 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.54: +4 -2 lines
Log Message:
use testImplementationDetails

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