ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ScheduledExecutorTest.java
Revision: 1.73
Committed: Tue Oct 6 06:02:53 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.72: +24 -27 lines
Log Message:
improve test diagnosability

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.73 final 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.73 final 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 jsr166 1.73 final 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 jsr166 1.73 final 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.73 final 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.73 final 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 jsr166 1.70 await(done);
160 jsr166 1.47 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.73 final 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 jsr166 1.70 await(done);
186 jsr166 1.47 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
202 jsr166 1.62 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
229 jsr166 1.62 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
245 jsr166 1.62 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
261 jsr166 1.62 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
277 jsr166 1.62 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.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
293 jsr166 1.62 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.73 final CountDownLatch done = new CountDownLatch(1);
310 jsr166 1.33 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
311 jsr166 1.73 try (PoolCleaner cleaner = cleaner(p, done)) {
312 jsr166 1.62 final CountDownLatch threadStarted = 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 jsr166 1.70 await(done);
319 jsr166 1.33 }});
320 jsr166 1.72 await(threadStarted);
321 jsr166 1.33 assertEquals(1, p.getActiveCount());
322     }
323 dl 1.2 }
324 jsr166 1.22
325 dl 1.2 /**
326 jsr166 1.32 * getCompletedTaskCount increases, but doesn't overestimate,
327     * when tasks complete
328 dl 1.2 */
329 jsr166 1.25 public void testGetCompletedTaskCount() throws InterruptedException {
330 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2);
331 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
332     final CountDownLatch threadStarted = new CountDownLatch(1);
333     final CountDownLatch threadProceed = new CountDownLatch(1);
334     final CountDownLatch threadDone = new CountDownLatch(1);
335 jsr166 1.33 assertEquals(0, p.getCompletedTaskCount());
336     p.execute(new CheckedRunnable() {
337     public void realRun() throws InterruptedException {
338     threadStarted.countDown();
339     assertEquals(0, p.getCompletedTaskCount());
340     threadProceed.await();
341     threadDone.countDown();
342     }});
343 jsr166 1.45 await(threadStarted);
344 jsr166 1.33 assertEquals(0, p.getCompletedTaskCount());
345     threadProceed.countDown();
346     threadDone.await();
347 jsr166 1.44 long startTime = System.nanoTime();
348     while (p.getCompletedTaskCount() != 1) {
349     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
350     fail("timed out");
351     Thread.yield();
352     }
353 jsr166 1.33 }
354 dl 1.2 }
355 jsr166 1.22
356 dl 1.2 /**
357 jsr166 1.32 * getCorePoolSize returns size given in constructor if not otherwise set
358 dl 1.2 */
359 jsr166 1.25 public void testGetCorePoolSize() throws InterruptedException {
360 jsr166 1.33 ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
361 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
362     assertEquals(1, p.getCorePoolSize());
363     }
364 dl 1.2 }
365 jsr166 1.22
366 dl 1.2 /**
367 jsr166 1.32 * getLargestPoolSize increases, but doesn't overestimate, when
368     * multiple threads active
369 dl 1.2 */
370 jsr166 1.25 public void testGetLargestPoolSize() throws InterruptedException {
371 jsr166 1.33 final int THREADS = 3;
372     final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS);
373     final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
374     final CountDownLatch done = new CountDownLatch(1);
375 jsr166 1.71 try (PoolCleaner cleaner = cleaner(p, done)) {
376 jsr166 1.33 assertEquals(0, p.getLargestPoolSize());
377     for (int i = 0; i < THREADS; i++)
378     p.execute(new CheckedRunnable() {
379     public void realRun() throws InterruptedException {
380     threadsStarted.countDown();
381 jsr166 1.70 await(done);
382 jsr166 1.33 assertEquals(THREADS, p.getLargestPoolSize());
383     }});
384 jsr166 1.71 await(threadsStarted);
385 jsr166 1.33 assertEquals(THREADS, p.getLargestPoolSize());
386     }
387 jsr166 1.62 assertEquals(THREADS, p.getLargestPoolSize());
388 dl 1.2 }
389 jsr166 1.22
390 dl 1.2 /**
391 jsr166 1.32 * getPoolSize increases, but doesn't overestimate, when threads
392     * become active
393 dl 1.2 */
394 jsr166 1.25 public void testGetPoolSize() throws InterruptedException {
395 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
396     final CountDownLatch threadStarted = new CountDownLatch(1);
397     final CountDownLatch done = new CountDownLatch(1);
398 jsr166 1.71 try (PoolCleaner cleaner = cleaner(p, done)) {
399 jsr166 1.33 assertEquals(0, p.getPoolSize());
400     p.execute(new CheckedRunnable() {
401     public void realRun() throws InterruptedException {
402     threadStarted.countDown();
403     assertEquals(1, p.getPoolSize());
404 jsr166 1.70 await(done);
405 jsr166 1.33 }});
406 jsr166 1.71 await(threadStarted);
407 jsr166 1.33 assertEquals(1, p.getPoolSize());
408     }
409 dl 1.2 }
410 jsr166 1.22
411 dl 1.2 /**
412 jsr166 1.32 * getTaskCount increases, but doesn't overestimate, when tasks
413     * submitted
414 dl 1.2 */
415 jsr166 1.25 public void testGetTaskCount() throws InterruptedException {
416 jsr166 1.65 final int TASKS = 3;
417     final CountDownLatch done = new CountDownLatch(1);
418 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
419 jsr166 1.65 try (PoolCleaner cleaner = cleaner(p, done)) {
420 jsr166 1.62 final CountDownLatch threadStarted = new CountDownLatch(1);
421 jsr166 1.33 assertEquals(0, p.getTaskCount());
422 jsr166 1.65 assertEquals(0, p.getCompletedTaskCount());
423     p.execute(new CheckedRunnable() {
424     public void realRun() throws InterruptedException {
425     threadStarted.countDown();
426 jsr166 1.70 await(done);
427 jsr166 1.65 }});
428 jsr166 1.72 await(threadStarted);
429 jsr166 1.65 assertEquals(1, p.getTaskCount());
430     assertEquals(0, p.getCompletedTaskCount());
431     for (int i = 0; i < TASKS; i++) {
432     assertEquals(1 + i, p.getTaskCount());
433 jsr166 1.33 p.execute(new CheckedRunnable() {
434     public void realRun() throws InterruptedException {
435     threadStarted.countDown();
436 jsr166 1.65 assertEquals(1 + TASKS, p.getTaskCount());
437 jsr166 1.70 await(done);
438 jsr166 1.33 }});
439 jsr166 1.65 }
440     assertEquals(1 + TASKS, p.getTaskCount());
441     assertEquals(0, p.getCompletedTaskCount());
442 jsr166 1.33 }
443 jsr166 1.65 assertEquals(1 + TASKS, p.getTaskCount());
444     assertEquals(1 + TASKS, p.getCompletedTaskCount());
445 dl 1.2 }
446 dl 1.8
447 jsr166 1.22 /**
448 dl 1.8 * getThreadFactory returns factory in constructor if not set
449     */
450 jsr166 1.25 public void testGetThreadFactory() throws InterruptedException {
451 jsr166 1.63 final ThreadFactory threadFactory = new SimpleThreadFactory();
452     final ScheduledThreadPoolExecutor p =
453     new ScheduledThreadPoolExecutor(1, threadFactory);
454     try (PoolCleaner cleaner = cleaner(p)) {
455     assertSame(threadFactory, p.getThreadFactory());
456     }
457 dl 1.8 }
458    
459 jsr166 1.22 /**
460 dl 1.8 * setThreadFactory sets the thread factory returned by getThreadFactory
461     */
462 jsr166 1.25 public void testSetThreadFactory() throws InterruptedException {
463 jsr166 1.62 ThreadFactory threadFactory = new SimpleThreadFactory();
464 jsr166 1.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
465 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
466     p.setThreadFactory(threadFactory);
467     assertSame(threadFactory, p.getThreadFactory());
468     }
469 dl 1.8 }
470    
471 jsr166 1.22 /**
472 dl 1.8 * setThreadFactory(null) throws NPE
473     */
474 jsr166 1.25 public void testSetThreadFactoryNull() throws InterruptedException {
475 jsr166 1.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
476 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
477     try {
478     p.setThreadFactory(null);
479     shouldThrow();
480     } catch (NullPointerException success) {}
481 dl 1.8 }
482     }
483 jsr166 1.22
484 dl 1.2 /**
485 jsr166 1.41 * isShutdown is false before shutdown, true after
486 dl 1.2 */
487 dl 1.5 public void testIsShutdown() {
488 jsr166 1.22
489 jsr166 1.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
490 dl 1.2 try {
491 jsr166 1.33 assertFalse(p.isShutdown());
492 dl 1.2 }
493     finally {
494 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
495 dl 1.2 }
496 jsr166 1.33 assertTrue(p.isShutdown());
497 dl 1.2 }
498    
499     /**
500 jsr166 1.32 * isTerminated is false before termination, true after
501 dl 1.2 */
502 jsr166 1.25 public void testIsTerminated() throws InterruptedException {
503 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
504 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
505     final CountDownLatch threadStarted = new CountDownLatch(1);
506     final CountDownLatch done = new CountDownLatch(1);
507     assertFalse(p.isTerminated());
508 jsr166 1.33 p.execute(new CheckedRunnable() {
509     public void realRun() throws InterruptedException {
510 jsr166 1.36 assertFalse(p.isTerminated());
511 jsr166 1.33 threadStarted.countDown();
512 jsr166 1.70 await(done);
513 jsr166 1.33 }});
514 jsr166 1.72 await(threadStarted);
515 jsr166 1.36 assertFalse(p.isTerminating());
516 jsr166 1.33 done.countDown();
517     try { p.shutdown(); } catch (SecurityException ok) { return; }
518 jsr166 1.62 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
519     assertTrue(p.isTerminated());
520 dl 1.2 }
521 dl 1.5 }
522    
523     /**
524 jsr166 1.32 * isTerminating is not true when running or when terminated
525 dl 1.5 */
526 jsr166 1.25 public void testIsTerminating() throws InterruptedException {
527 jsr166 1.33 final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
528     final CountDownLatch threadStarted = new CountDownLatch(1);
529     final CountDownLatch done = new CountDownLatch(1);
530 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
531 jsr166 1.33 assertFalse(p.isTerminating());
532     p.execute(new CheckedRunnable() {
533     public void realRun() throws InterruptedException {
534 jsr166 1.35 assertFalse(p.isTerminating());
535 jsr166 1.33 threadStarted.countDown();
536 jsr166 1.70 await(done);
537 jsr166 1.33 }});
538 jsr166 1.72 await(threadStarted);
539 jsr166 1.33 assertFalse(p.isTerminating());
540     done.countDown();
541     try { p.shutdown(); } catch (SecurityException ok) { return; }
542 jsr166 1.62 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
543     assertTrue(p.isTerminated());
544     assertFalse(p.isTerminating());
545 jsr166 1.33 }
546 dl 1.2 }
547    
548     /**
549 dl 1.8 * getQueue returns the work queue, which contains queued tasks
550     */
551 jsr166 1.25 public void testGetQueue() throws InterruptedException {
552 jsr166 1.73 final CountDownLatch done = new CountDownLatch(1);
553     final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
554     try (PoolCleaner cleaner = cleaner(p, done)) {
555 jsr166 1.62 final CountDownLatch threadStarted = new CountDownLatch(1);
556 jsr166 1.33 ScheduledFuture[] tasks = new ScheduledFuture[5];
557     for (int i = 0; i < tasks.length; i++) {
558     Runnable r = new CheckedRunnable() {
559     public void realRun() throws InterruptedException {
560     threadStarted.countDown();
561 jsr166 1.70 await(done);
562 jsr166 1.33 }};
563     tasks[i] = p.schedule(r, 1, MILLISECONDS);
564     }
565 jsr166 1.72 await(threadStarted);
566 jsr166 1.33 BlockingQueue<Runnable> q = p.getQueue();
567     assertTrue(q.contains(tasks[tasks.length - 1]));
568 dl 1.8 assertFalse(q.contains(tasks[0]));
569     }
570     }
571    
572     /**
573     * remove(task) removes queued task, and fails to remove active task
574     */
575 jsr166 1.25 public void testRemove() throws InterruptedException {
576 jsr166 1.73 final CountDownLatch done = new CountDownLatch(1);
577 jsr166 1.33 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
578 jsr166 1.73 try (PoolCleaner cleaner = cleaner(p, done)) {
579 jsr166 1.62 ScheduledFuture[] tasks = new ScheduledFuture[5];
580     final CountDownLatch threadStarted = new CountDownLatch(1);
581 jsr166 1.33 for (int i = 0; i < tasks.length; i++) {
582     Runnable r = new CheckedRunnable() {
583     public void realRun() throws InterruptedException {
584     threadStarted.countDown();
585 jsr166 1.70 await(done);
586 jsr166 1.33 }};
587     tasks[i] = p.schedule(r, 1, MILLISECONDS);
588     }
589 jsr166 1.72 await(threadStarted);
590 jsr166 1.33 BlockingQueue<Runnable> q = p.getQueue();
591     assertFalse(p.remove((Runnable)tasks[0]));
592 dl 1.8 assertTrue(q.contains((Runnable)tasks[4]));
593     assertTrue(q.contains((Runnable)tasks[3]));
594 jsr166 1.33 assertTrue(p.remove((Runnable)tasks[4]));
595     assertFalse(p.remove((Runnable)tasks[4]));
596 dl 1.8 assertFalse(q.contains((Runnable)tasks[4]));
597     assertTrue(q.contains((Runnable)tasks[3]));
598 jsr166 1.33 assertTrue(p.remove((Runnable)tasks[3]));
599 dl 1.8 assertFalse(q.contains((Runnable)tasks[3]));
600     }
601     }
602    
603     /**
604 jsr166 1.40 * purge eventually removes cancelled tasks from the queue
605 dl 1.2 */
606 jsr166 1.25 public void testPurge() throws InterruptedException {
607 jsr166 1.66 final ScheduledFuture[] tasks = new ScheduledFuture[5];
608     final Runnable releaser = new Runnable() { public void run() {
609     for (ScheduledFuture task : tasks)
610     if (task != null) task.cancel(true); }};
611     final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
612     try (PoolCleaner cleaner = cleaner(p, releaser)) {
613     for (int i = 0; i < tasks.length; i++)
614     tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(),
615     LONG_DELAY_MS, MILLISECONDS);
616 jsr166 1.33 int max = tasks.length;
617 dl 1.19 if (tasks[4].cancel(true)) --max;
618     if (tasks[3].cancel(true)) --max;
619     // There must eventually be an interference-free point at
620     // which purge will not fail. (At worst, when queue is empty.)
621 jsr166 1.40 long startTime = System.nanoTime();
622     do {
623 jsr166 1.33 p.purge();
624     long count = p.getTaskCount();
625 jsr166 1.40 if (count == max)
626     return;
627 jsr166 1.66 } while (millisElapsedSince(startTime) < LONG_DELAY_MS);
628 jsr166 1.40 fail("Purge failed to remove cancelled tasks");
629 dl 1.2 }
630     }
631    
632     /**
633 jsr166 1.53 * shutdownNow returns a list containing tasks that were not run,
634     * and those tasks are drained from the queue
635 dl 1.2 */
636 jsr166 1.56 public void testShutdownNow() throws InterruptedException {
637     final int poolSize = 2;
638     final int count = 5;
639     final AtomicInteger ran = new AtomicInteger(0);
640     final ScheduledThreadPoolExecutor p =
641     new ScheduledThreadPoolExecutor(poolSize);
642 jsr166 1.64 final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
643 jsr166 1.58 Runnable waiter = new CheckedRunnable() { public void realRun() {
644 jsr166 1.56 threadsStarted.countDown();
645     try {
646     MILLISECONDS.sleep(2 * LONG_DELAY_MS);
647     } catch (InterruptedException success) {}
648     ran.getAndIncrement();
649     }};
650     for (int i = 0; i < count; i++)
651     p.execute(waiter);
652 jsr166 1.71 await(threadsStarted);
653 jsr166 1.57 assertEquals(poolSize, p.getActiveCount());
654     assertEquals(0, p.getCompletedTaskCount());
655 jsr166 1.56 final List<Runnable> queuedTasks;
656     try {
657     queuedTasks = p.shutdownNow();
658     } catch (SecurityException ok) {
659     return; // Allowed in case test doesn't have privs
660     }
661     assertTrue(p.isShutdown());
662     assertTrue(p.getQueue().isEmpty());
663     assertEquals(count - poolSize, queuedTasks.size());
664     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
665     assertTrue(p.isTerminated());
666     assertEquals(poolSize, ran.get());
667 jsr166 1.57 assertEquals(poolSize, p.getCompletedTaskCount());
668 jsr166 1.56 }
669    
670     /**
671     * shutdownNow returns a list containing tasks that were not run,
672     * and those tasks are drained from the queue
673     */
674 jsr166 1.54 public void testShutdownNow_delayedTasks() throws InterruptedException {
675 jsr166 1.73 final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1);
676 jsr166 1.54 List<ScheduledFuture> tasks = new ArrayList<>();
677     for (int i = 0; i < 3; i++) {
678     Runnable r = new NoOpRunnable();
679     tasks.add(p.schedule(r, 9, SECONDS));
680     tasks.add(p.scheduleAtFixedRate(r, 9, 9, SECONDS));
681     tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS));
682     }
683 jsr166 1.55 if (testImplementationDetails)
684     assertEquals(new HashSet(tasks), new HashSet(p.getQueue()));
685 jsr166 1.54 final List<Runnable> queuedTasks;
686 dl 1.17 try {
687 jsr166 1.54 queuedTasks = p.shutdownNow();
688 jsr166 1.22 } catch (SecurityException ok) {
689 jsr166 1.54 return; // Allowed in case test doesn't have privs
690     }
691     assertTrue(p.isShutdown());
692     assertTrue(p.getQueue().isEmpty());
693 jsr166 1.55 if (testImplementationDetails)
694     assertEquals(new HashSet(tasks), new HashSet(queuedTasks));
695 jsr166 1.54 assertEquals(tasks.size(), queuedTasks.size());
696     for (ScheduledFuture task : tasks) {
697     assertFalse(task.isDone());
698     assertFalse(task.isCancelled());
699 dl 1.17 }
700 jsr166 1.54 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
701     assertTrue(p.isTerminated());
702 dl 1.2 }
703    
704 dl 1.5 /**
705 jsr166 1.58 * By default, periodic tasks are cancelled at shutdown.
706     * By default, delayed tasks keep running after shutdown.
707     * Check that changing the default values work:
708     * - setExecuteExistingDelayedTasksAfterShutdownPolicy
709     * - setContinueExistingPeriodicTasksAfterShutdownPolicy
710     */
711     public void testShutdown_cancellation() throws Exception {
712     Boolean[] allBooleans = { null, Boolean.FALSE, Boolean.TRUE };
713     for (Boolean policy : allBooleans)
714     {
715     final int poolSize = 2;
716     final ScheduledThreadPoolExecutor p
717     = new ScheduledThreadPoolExecutor(poolSize);
718     final boolean effectiveDelayedPolicy = (policy != Boolean.FALSE);
719     final boolean effectivePeriodicPolicy = (policy == Boolean.TRUE);
720     final boolean effectiveRemovePolicy = (policy == Boolean.TRUE);
721     if (policy != null) {
722     p.setExecuteExistingDelayedTasksAfterShutdownPolicy(policy);
723     p.setContinueExistingPeriodicTasksAfterShutdownPolicy(policy);
724     p.setRemoveOnCancelPolicy(policy);
725     }
726     assertEquals(effectiveDelayedPolicy,
727     p.getExecuteExistingDelayedTasksAfterShutdownPolicy());
728     assertEquals(effectivePeriodicPolicy,
729     p.getContinueExistingPeriodicTasksAfterShutdownPolicy());
730     assertEquals(effectiveRemovePolicy,
731     p.getRemoveOnCancelPolicy());
732     // Strategy: Wedge the pool with poolSize "blocker" threads
733     final AtomicInteger ran = new AtomicInteger(0);
734     final CountDownLatch poolBlocked = new CountDownLatch(poolSize);
735     final CountDownLatch unblock = new CountDownLatch(1);
736     final CountDownLatch periodicLatch1 = new CountDownLatch(2);
737     final CountDownLatch periodicLatch2 = new CountDownLatch(2);
738     Runnable task = new CheckedRunnable() { public void realRun()
739     throws InterruptedException {
740     poolBlocked.countDown();
741     assertTrue(unblock.await(LONG_DELAY_MS, MILLISECONDS));
742     ran.getAndIncrement();
743     }};
744     List<Future<?>> blockers = new ArrayList<>();
745     List<Future<?>> periodics = new ArrayList<>();
746     List<Future<?>> delayeds = new ArrayList<>();
747     for (int i = 0; i < poolSize; i++)
748     blockers.add(p.submit(task));
749     assertTrue(poolBlocked.await(LONG_DELAY_MS, MILLISECONDS));
750    
751     periodics.add(p.scheduleAtFixedRate(countDowner(periodicLatch1),
752     1, 1, MILLISECONDS));
753     periodics.add(p.scheduleWithFixedDelay(countDowner(periodicLatch2),
754     1, 1, MILLISECONDS));
755     delayeds.add(p.schedule(task, 1, MILLISECONDS));
756 jsr166 1.22
757 jsr166 1.58 assertTrue(p.getQueue().containsAll(periodics));
758     assertTrue(p.getQueue().containsAll(delayeds));
759 jsr166 1.33 try { p.shutdown(); } catch (SecurityException ok) { return; }
760 jsr166 1.58 assertTrue(p.isShutdown());
761     assertFalse(p.isTerminated());
762     for (Future<?> periodic : periodics) {
763     assertTrue(effectivePeriodicPolicy ^ periodic.isCancelled());
764     assertTrue(effectivePeriodicPolicy ^ periodic.isDone());
765     }
766     for (Future<?> delayed : delayeds) {
767     assertTrue(effectiveDelayedPolicy ^ delayed.isCancelled());
768     assertTrue(effectiveDelayedPolicy ^ delayed.isDone());
769     }
770     if (testImplementationDetails) {
771     assertEquals(effectivePeriodicPolicy,
772     p.getQueue().containsAll(periodics));
773     assertEquals(effectiveDelayedPolicy,
774     p.getQueue().containsAll(delayeds));
775     }
776     // Release all pool threads
777     unblock.countDown();
778    
779     for (Future<?> delayed : delayeds) {
780     if (effectiveDelayedPolicy) {
781     assertNull(delayed.get());
782     }
783 jsr166 1.25 }
784 jsr166 1.58 if (effectivePeriodicPolicy) {
785     assertTrue(periodicLatch1.await(LONG_DELAY_MS, MILLISECONDS));
786     assertTrue(periodicLatch2.await(LONG_DELAY_MS, MILLISECONDS));
787     for (Future<?> periodic : periodics) {
788     assertTrue(periodic.cancel(false));
789     assertTrue(periodic.isCancelled());
790     assertTrue(periodic.isDone());
791     }
792 dl 1.2 }
793 jsr166 1.58 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
794 jsr166 1.33 assertTrue(p.isTerminated());
795 jsr166 1.58 assertEquals(2 + (effectiveDelayedPolicy ? 1 : 0), ran.get());
796     }}
797 dl 1.1
798 dl 1.10 /**
799     * completed submit of callable returns result
800     */
801 jsr166 1.25 public void testSubmitCallable() throws Exception {
802 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
803     try (PoolCleaner cleaner = cleaner(e)) {
804 dl 1.10 Future<String> future = e.submit(new StringTask());
805     String result = future.get();
806     assertSame(TEST_STRING, result);
807     }
808     }
809    
810     /**
811     * completed submit of runnable returns successfully
812     */
813 jsr166 1.25 public void testSubmitRunnable() throws Exception {
814 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
815     try (PoolCleaner cleaner = cleaner(e)) {
816 dl 1.10 Future<?> future = e.submit(new NoOpRunnable());
817     future.get();
818     assertTrue(future.isDone());
819     }
820     }
821    
822     /**
823     * completed submit of (runnable, result) returns result
824     */
825 jsr166 1.25 public void testSubmitRunnable2() throws Exception {
826 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
827     try (PoolCleaner cleaner = cleaner(e)) {
828 dl 1.10 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
829     String result = future.get();
830     assertSame(TEST_STRING, result);
831     }
832     }
833    
834     /**
835     * invokeAny(null) throws NPE
836     */
837 jsr166 1.25 public void testInvokeAny1() throws Exception {
838 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
839     try (PoolCleaner cleaner = cleaner(e)) {
840     try {
841     e.invokeAny(null);
842     shouldThrow();
843     } catch (NullPointerException success) {}
844 dl 1.10 }
845     }
846    
847     /**
848     * invokeAny(empty collection) throws IAE
849     */
850 jsr166 1.25 public void testInvokeAny2() throws Exception {
851 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
852     try (PoolCleaner cleaner = cleaner(e)) {
853     try {
854     e.invokeAny(new ArrayList<Callable<String>>());
855     shouldThrow();
856     } catch (IllegalArgumentException success) {}
857 dl 1.10 }
858     }
859    
860     /**
861     * invokeAny(c) throws NPE if c has null elements
862     */
863 jsr166 1.25 public void testInvokeAny3() throws Exception {
864 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
865 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
866     try (PoolCleaner cleaner = cleaner(e)) {
867     List<Callable<String>> l = new ArrayList<Callable<String>>();
868     l.add(latchAwaitingStringTask(latch));
869     l.add(null);
870     try {
871     e.invokeAny(l);
872     shouldThrow();
873     } catch (NullPointerException success) {}
874 jsr166 1.25 latch.countDown();
875 dl 1.10 }
876     }
877    
878     /**
879     * invokeAny(c) throws ExecutionException if no task completes
880     */
881 jsr166 1.25 public void testInvokeAny4() throws Exception {
882 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
883     try (PoolCleaner cleaner = cleaner(e)) {
884     List<Callable<String>> l = new ArrayList<Callable<String>>();
885     l.add(new NPETask());
886     try {
887     e.invokeAny(l);
888     shouldThrow();
889     } catch (ExecutionException success) {
890     assertTrue(success.getCause() instanceof NullPointerException);
891     }
892 dl 1.10 }
893     }
894    
895     /**
896     * invokeAny(c) returns result of some task
897     */
898 jsr166 1.25 public void testInvokeAny5() throws Exception {
899 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
900     try (PoolCleaner cleaner = cleaner(e)) {
901 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
902 dl 1.10 l.add(new StringTask());
903     l.add(new StringTask());
904     String result = e.invokeAny(l);
905     assertSame(TEST_STRING, result);
906     }
907     }
908    
909     /**
910     * invokeAll(null) throws NPE
911     */
912 jsr166 1.25 public void testInvokeAll1() throws Exception {
913 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
914     try (PoolCleaner cleaner = cleaner(e)) {
915     try {
916     e.invokeAll(null);
917     shouldThrow();
918     } catch (NullPointerException success) {}
919 dl 1.10 }
920     }
921    
922     /**
923     * invokeAll(empty collection) returns empty collection
924     */
925 jsr166 1.25 public void testInvokeAll2() throws Exception {
926 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
927     try (PoolCleaner cleaner = cleaner(e)) {
928 dl 1.10 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
929     assertTrue(r.isEmpty());
930     }
931     }
932    
933     /**
934     * invokeAll(c) throws NPE if c has null elements
935     */
936 jsr166 1.25 public void testInvokeAll3() throws Exception {
937 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
938     try (PoolCleaner cleaner = cleaner(e)) {
939     List<Callable<String>> l = new ArrayList<Callable<String>>();
940     l.add(new StringTask());
941     l.add(null);
942     try {
943     e.invokeAll(l);
944     shouldThrow();
945     } catch (NullPointerException success) {}
946 dl 1.10 }
947     }
948    
949     /**
950     * get of invokeAll(c) throws exception on failed task
951     */
952 jsr166 1.25 public void testInvokeAll4() throws Exception {
953 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
954     try (PoolCleaner cleaner = cleaner(e)) {
955     List<Callable<String>> l = new ArrayList<Callable<String>>();
956     l.add(new NPETask());
957     List<Future<String>> futures = e.invokeAll(l);
958     assertEquals(1, futures.size());
959     try {
960     futures.get(0).get();
961     shouldThrow();
962     } catch (ExecutionException success) {
963     assertTrue(success.getCause() instanceof NullPointerException);
964     }
965 dl 1.10 }
966     }
967    
968     /**
969     * invokeAll(c) returns results of all completed tasks
970     */
971 jsr166 1.25 public void testInvokeAll5() throws Exception {
972 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
973     try (PoolCleaner cleaner = cleaner(e)) {
974 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
975 dl 1.10 l.add(new StringTask());
976     l.add(new StringTask());
977 jsr166 1.29 List<Future<String>> futures = e.invokeAll(l);
978     assertEquals(2, futures.size());
979     for (Future<String> future : futures)
980 jsr166 1.25 assertSame(TEST_STRING, future.get());
981 dl 1.10 }
982     }
983    
984 dl 1.11 /**
985     * timed invokeAny(null) throws NPE
986     */
987 jsr166 1.25 public void testTimedInvokeAny1() throws Exception {
988 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
989     try (PoolCleaner cleaner = cleaner(e)) {
990     try {
991     e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
992     shouldThrow();
993     } catch (NullPointerException success) {}
994 dl 1.11 }
995     }
996    
997     /**
998     * timed invokeAny(,,null) throws NPE
999     */
1000 jsr166 1.25 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1001 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1002     try (PoolCleaner cleaner = cleaner(e)) {
1003     List<Callable<String>> l = new ArrayList<Callable<String>>();
1004     l.add(new StringTask());
1005     try {
1006     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1007     shouldThrow();
1008     } catch (NullPointerException success) {}
1009 dl 1.11 }
1010     }
1011    
1012     /**
1013     * timed invokeAny(empty collection) throws IAE
1014     */
1015 jsr166 1.25 public void testTimedInvokeAny2() throws Exception {
1016 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1017     try (PoolCleaner cleaner = cleaner(e)) {
1018     try {
1019     e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1020     shouldThrow();
1021     } catch (IllegalArgumentException success) {}
1022 dl 1.11 }
1023     }
1024    
1025     /**
1026     * timed invokeAny(c) throws NPE if c has null elements
1027     */
1028 jsr166 1.25 public void testTimedInvokeAny3() throws Exception {
1029 jsr166 1.29 CountDownLatch latch = new CountDownLatch(1);
1030 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1031     try (PoolCleaner cleaner = cleaner(e)) {
1032     List<Callable<String>> l = new ArrayList<Callable<String>>();
1033     l.add(latchAwaitingStringTask(latch));
1034     l.add(null);
1035     try {
1036     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1037     shouldThrow();
1038     } catch (NullPointerException success) {}
1039 jsr166 1.25 latch.countDown();
1040 dl 1.11 }
1041     }
1042    
1043     /**
1044     * timed invokeAny(c) throws ExecutionException if no task completes
1045     */
1046 jsr166 1.25 public void testTimedInvokeAny4() throws Exception {
1047 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1048     try (PoolCleaner cleaner = cleaner(e)) {
1049     List<Callable<String>> l = new ArrayList<Callable<String>>();
1050     l.add(new NPETask());
1051     try {
1052     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1053     shouldThrow();
1054     } catch (ExecutionException success) {
1055     assertTrue(success.getCause() instanceof NullPointerException);
1056     }
1057 dl 1.11 }
1058     }
1059    
1060     /**
1061     * timed invokeAny(c) returns result of some task
1062     */
1063 jsr166 1.25 public void testTimedInvokeAny5() throws Exception {
1064 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1065     try (PoolCleaner cleaner = cleaner(e)) {
1066 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1067 dl 1.11 l.add(new StringTask());
1068     l.add(new StringTask());
1069 jsr166 1.25 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1070 dl 1.11 assertSame(TEST_STRING, result);
1071     }
1072     }
1073    
1074     /**
1075     * timed invokeAll(null) throws NPE
1076     */
1077 jsr166 1.25 public void testTimedInvokeAll1() throws Exception {
1078 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1079     try (PoolCleaner cleaner = cleaner(e)) {
1080     try {
1081     e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1082     shouldThrow();
1083     } catch (NullPointerException success) {}
1084 dl 1.11 }
1085     }
1086    
1087     /**
1088     * timed invokeAll(,,null) throws NPE
1089     */
1090 jsr166 1.25 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1091 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1092     try (PoolCleaner cleaner = cleaner(e)) {
1093     List<Callable<String>> l = new ArrayList<Callable<String>>();
1094     l.add(new StringTask());
1095     try {
1096     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1097     shouldThrow();
1098     } catch (NullPointerException success) {}
1099 dl 1.11 }
1100     }
1101    
1102     /**
1103     * timed invokeAll(empty collection) returns empty collection
1104     */
1105 jsr166 1.25 public void testTimedInvokeAll2() throws Exception {
1106 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1107     try (PoolCleaner cleaner = cleaner(e)) {
1108     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(),
1109     MEDIUM_DELAY_MS, MILLISECONDS);
1110 dl 1.11 assertTrue(r.isEmpty());
1111     }
1112     }
1113    
1114     /**
1115     * timed invokeAll(c) throws NPE if c has null elements
1116     */
1117 jsr166 1.25 public void testTimedInvokeAll3() throws Exception {
1118 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1119     try (PoolCleaner cleaner = cleaner(e)) {
1120     List<Callable<String>> l = new ArrayList<Callable<String>>();
1121     l.add(new StringTask());
1122     l.add(null);
1123     try {
1124     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1125     shouldThrow();
1126     } catch (NullPointerException success) {}
1127 dl 1.11 }
1128     }
1129    
1130     /**
1131     * get of element of invokeAll(c) throws exception on failed task
1132     */
1133 jsr166 1.25 public void testTimedInvokeAll4() throws Exception {
1134 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1135     try (PoolCleaner cleaner = cleaner(e)) {
1136     List<Callable<String>> l = new ArrayList<Callable<String>>();
1137     l.add(new NPETask());
1138     List<Future<String>> futures =
1139 jsr166 1.69 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1140 jsr166 1.62 assertEquals(1, futures.size());
1141     try {
1142     futures.get(0).get();
1143     shouldThrow();
1144     } catch (ExecutionException success) {
1145     assertTrue(success.getCause() instanceof NullPointerException);
1146     }
1147 dl 1.11 }
1148     }
1149    
1150     /**
1151     * timed invokeAll(c) returns results of all completed tasks
1152     */
1153 jsr166 1.25 public void testTimedInvokeAll5() throws Exception {
1154 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1155     try (PoolCleaner cleaner = cleaner(e)) {
1156 jsr166 1.29 List<Callable<String>> l = new ArrayList<Callable<String>>();
1157 dl 1.11 l.add(new StringTask());
1158     l.add(new StringTask());
1159 jsr166 1.29 List<Future<String>> futures =
1160 jsr166 1.59 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1161 jsr166 1.29 assertEquals(2, futures.size());
1162     for (Future<String> future : futures)
1163 jsr166 1.25 assertSame(TEST_STRING, future.get());
1164 dl 1.11 }
1165     }
1166    
1167     /**
1168     * timed invokeAll(c) cancels tasks not completed by timeout
1169     */
1170 jsr166 1.25 public void testTimedInvokeAll6() throws Exception {
1171 jsr166 1.62 final ExecutorService e = new ScheduledThreadPoolExecutor(2);
1172     try (PoolCleaner cleaner = cleaner(e)) {
1173 jsr166 1.52 for (long timeout = timeoutMillis();;) {
1174     List<Callable<String>> tasks = new ArrayList<>();
1175     tasks.add(new StringTask("0"));
1176     tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1177     tasks.add(new StringTask("2"));
1178     long startTime = System.nanoTime();
1179     List<Future<String>> futures =
1180     e.invokeAll(tasks, timeout, MILLISECONDS);
1181     assertEquals(tasks.size(), futures.size());
1182     assertTrue(millisElapsedSince(startTime) >= timeout);
1183     for (Future future : futures)
1184     assertTrue(future.isDone());
1185     assertTrue(futures.get(1).isCancelled());
1186     try {
1187     assertEquals("0", futures.get(0).get());
1188     assertEquals("2", futures.get(2).get());
1189     break;
1190     } catch (CancellationException retryWithLongerTimeout) {
1191     timeout *= 2;
1192     if (timeout >= LONG_DELAY_MS / 2)
1193     fail("expected exactly one task to be cancelled");
1194     }
1195     }
1196 dl 1.11 }
1197     }
1198    
1199 dl 1.1 }