ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.68
Committed: Mon Oct 5 22:38:38 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.67: +1 -1 lines
Log Message:
bump up timeout

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