ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.82
Committed: Sun Oct 4 07:23:20 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.81: +160 -205 lines
Log Message:
more PoolCleaning

File Contents

# User Rev Content
1 dl 1.1 /*
2     * 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.25 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.2 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.9 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 jsr166 1.36 import static java.util.concurrent.TimeUnit.SECONDS;
11 jsr166 1.33
12     import java.util.ArrayList;
13     import java.util.List;
14     import java.util.concurrent.ArrayBlockingQueue;
15     import java.util.concurrent.BlockingQueue;
16     import java.util.concurrent.Callable;
17 jsr166 1.39 import java.util.concurrent.CancellationException;
18 jsr166 1.33 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.FutureTask;
24     import java.util.concurrent.LinkedBlockingQueue;
25     import java.util.concurrent.RejectedExecutionException;
26     import java.util.concurrent.RejectedExecutionHandler;
27     import java.util.concurrent.RunnableFuture;
28     import java.util.concurrent.SynchronousQueue;
29     import java.util.concurrent.ThreadFactory;
30     import java.util.concurrent.ThreadPoolExecutor;
31     import java.util.concurrent.TimeoutException;
32     import java.util.concurrent.TimeUnit;
33 jsr166 1.41 import java.util.concurrent.atomic.AtomicInteger;
34 jsr166 1.31 import java.util.concurrent.locks.Condition;
35     import java.util.concurrent.locks.ReentrantLock;
36 jsr166 1.33
37     import junit.framework.Test;
38     import junit.framework.TestSuite;
39 dl 1.1
40     public class ThreadPoolExecutorSubclassTest extends JSR166TestCase {
41     public static void main(String[] args) {
42 jsr166 1.35 main(suite(), args);
43 dl 1.1 }
44     public static Test suite() {
45 jsr166 1.6 return new TestSuite(ThreadPoolExecutorSubclassTest.class);
46 dl 1.1 }
47    
48     static class CustomTask<V> implements RunnableFuture<V> {
49     final Callable<V> callable;
50     final ReentrantLock lock = new ReentrantLock();
51     final Condition cond = lock.newCondition();
52     boolean done;
53     boolean cancelled;
54     V result;
55     Thread thread;
56     Exception exception;
57 jsr166 1.6 CustomTask(Callable<V> c) {
58     if (c == null) throw new NullPointerException();
59     callable = c;
60     }
61     CustomTask(final Runnable r, final V res) {
62     if (r == null) throw new NullPointerException();
63     callable = new Callable<V>() {
64 jsr166 1.34 public V call() throws Exception { r.run(); return res; }};
65 dl 1.1 }
66     public boolean isDone() {
67     lock.lock(); try { return done; } finally { lock.unlock() ; }
68     }
69     public boolean isCancelled() {
70     lock.lock(); try { return cancelled; } finally { lock.unlock() ; }
71     }
72     public boolean cancel(boolean mayInterrupt) {
73     lock.lock();
74     try {
75     if (!done) {
76     cancelled = true;
77     done = true;
78 jsr166 1.2 if (mayInterrupt && thread != null)
79 dl 1.1 thread.interrupt();
80     return true;
81     }
82     return false;
83     }
84     finally { lock.unlock() ; }
85     }
86     public void run() {
87     lock.lock();
88     try {
89 jsr166 1.22 if (done)
90     return;
91     thread = Thread.currentThread();
92 dl 1.1 }
93     finally { lock.unlock() ; }
94     V v = null;
95     Exception e = null;
96     try {
97     v = callable.call();
98     }
99 jsr166 1.3 catch (Exception ex) {
100 dl 1.1 e = ex;
101     }
102     lock.lock();
103     try {
104 jsr166 1.44 if (!done) {
105     result = v;
106     exception = e;
107     done = true;
108     thread = null;
109     cond.signalAll();
110     }
111 dl 1.1 }
112     finally { lock.unlock(); }
113     }
114     public V get() throws InterruptedException, ExecutionException {
115     lock.lock();
116     try {
117 jsr166 1.2 while (!done)
118 dl 1.1 cond.await();
119 jsr166 1.44 if (cancelled)
120     throw new CancellationException();
121 dl 1.1 if (exception != null)
122     throw new ExecutionException(exception);
123     return result;
124     }
125     finally { lock.unlock(); }
126     }
127     public V get(long timeout, TimeUnit unit)
128 jsr166 1.4 throws InterruptedException, ExecutionException, TimeoutException {
129 dl 1.1 long nanos = unit.toNanos(timeout);
130     lock.lock();
131     try {
132 jsr166 1.44 while (!done) {
133 jsr166 1.47 if (nanos <= 0L)
134 dl 1.1 throw new TimeoutException();
135     nanos = cond.awaitNanos(nanos);
136     }
137 jsr166 1.44 if (cancelled)
138     throw new CancellationException();
139 dl 1.1 if (exception != null)
140     throw new ExecutionException(exception);
141     return result;
142     }
143     finally { lock.unlock(); }
144     }
145 jsr166 1.2 }
146    
147 dl 1.1 static class CustomTPE extends ThreadPoolExecutor {
148     protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
149     return new CustomTask<V>(c);
150     }
151     protected <V> RunnableFuture<V> newTaskFor(Runnable r, V v) {
152     return new CustomTask<V>(r, v);
153 jsr166 1.2 }
154    
155 dl 1.1 CustomTPE(int corePoolSize,
156     int maximumPoolSize,
157     long keepAliveTime,
158     TimeUnit unit,
159     BlockingQueue<Runnable> workQueue) {
160 jsr166 1.2 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
161 dl 1.1 workQueue);
162     }
163     CustomTPE(int corePoolSize,
164     int maximumPoolSize,
165     long keepAliveTime,
166     TimeUnit unit,
167     BlockingQueue<Runnable> workQueue,
168     ThreadFactory threadFactory) {
169     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
170     threadFactory);
171     }
172    
173     CustomTPE(int corePoolSize,
174     int maximumPoolSize,
175     long keepAliveTime,
176     TimeUnit unit,
177     BlockingQueue<Runnable> workQueue,
178     RejectedExecutionHandler handler) {
179     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
180     handler);
181     }
182     CustomTPE(int corePoolSize,
183     int maximumPoolSize,
184     long keepAliveTime,
185     TimeUnit unit,
186     BlockingQueue<Runnable> workQueue,
187     ThreadFactory threadFactory,
188     RejectedExecutionHandler handler) {
189 jsr166 1.2 super(corePoolSize, maximumPoolSize, keepAliveTime, unit,
190 dl 1.1 workQueue, threadFactory, handler);
191     }
192    
193 jsr166 1.30 final CountDownLatch beforeCalled = new CountDownLatch(1);
194     final CountDownLatch afterCalled = new CountDownLatch(1);
195     final CountDownLatch terminatedCalled = new CountDownLatch(1);
196    
197 dl 1.1 public CustomTPE() {
198 jsr166 1.9 super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
199 dl 1.1 }
200     protected void beforeExecute(Thread t, Runnable r) {
201 jsr166 1.30 beforeCalled.countDown();
202 dl 1.1 }
203     protected void afterExecute(Runnable r, Throwable t) {
204 jsr166 1.30 afterCalled.countDown();
205 dl 1.1 }
206     protected void terminated() {
207 jsr166 1.30 terminatedCalled.countDown();
208 dl 1.1 }
209 jsr166 1.2
210 jsr166 1.30 public boolean beforeCalled() {
211     return beforeCalled.getCount() == 0;
212     }
213     public boolean afterCalled() {
214     return afterCalled.getCount() == 0;
215     }
216     public boolean terminatedCalled() {
217     return terminatedCalled.getCount() == 0;
218     }
219 dl 1.1 }
220    
221 jsr166 1.4 static class FailingThreadFactory implements ThreadFactory {
222 dl 1.1 int calls = 0;
223 jsr166 1.4 public Thread newThread(Runnable r) {
224 dl 1.1 if (++calls > 1) return null;
225     return new Thread(r);
226 jsr166 1.2 }
227 dl 1.1 }
228 jsr166 1.2
229 dl 1.1 /**
230 jsr166 1.19 * execute successfully executes a runnable
231 dl 1.1 */
232 jsr166 1.5 public void testExecute() throws InterruptedException {
233 jsr166 1.50 final ThreadPoolExecutor p =
234     new CustomTPE(1, 1,
235     2 * LONG_DELAY_MS, MILLISECONDS,
236     new ArrayBlockingQueue<Runnable>(10));
237 jsr166 1.51 try (PoolCleaner cleaner = cleaner(p)) {
238 jsr166 1.48 final CountDownLatch done = new CountDownLatch(1);
239     final Runnable task = new CheckedRunnable() {
240 jsr166 1.50 public void realRun() { done.countDown(); }};
241 jsr166 1.21 p.execute(task);
242 jsr166 1.48 assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
243 jsr166 1.2 }
244 dl 1.1 }
245    
246     /**
247 jsr166 1.19 * getActiveCount increases but doesn't overestimate, when a
248     * thread becomes active
249 dl 1.1 */
250 jsr166 1.5 public void testGetActiveCount() throws InterruptedException {
251 jsr166 1.21 final ThreadPoolExecutor p =
252     new CustomTPE(2, 2,
253     LONG_DELAY_MS, MILLISECONDS,
254     new ArrayBlockingQueue<Runnable>(10));
255 jsr166 1.51 try (PoolCleaner cleaner = cleaner(p)) {
256 jsr166 1.66 final CountDownLatch threadStarted = new CountDownLatch(1);
257     final CountDownLatch done = new CountDownLatch(1);
258 jsr166 1.21 assertEquals(0, p.getActiveCount());
259     p.execute(new CheckedRunnable() {
260     public void realRun() throws InterruptedException {
261     threadStarted.countDown();
262     assertEquals(1, p.getActiveCount());
263     done.await();
264     }});
265 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
266 jsr166 1.21 assertEquals(1, p.getActiveCount());
267     done.countDown();
268     }
269 dl 1.1 }
270    
271     /**
272 jsr166 1.19 * prestartCoreThread starts a thread if under corePoolSize, else doesn't
273 dl 1.1 */
274     public void testPrestartCoreThread() {
275 jsr166 1.80 final ThreadPoolExecutor p =
276 jsr166 1.52 new CustomTPE(2, 6,
277     LONG_DELAY_MS, MILLISECONDS,
278     new ArrayBlockingQueue<Runnable>(10));
279     try (PoolCleaner cleaner = cleaner(p)) {
280     assertEquals(0, p.getPoolSize());
281     assertTrue(p.prestartCoreThread());
282     assertEquals(1, p.getPoolSize());
283     assertTrue(p.prestartCoreThread());
284     assertEquals(2, p.getPoolSize());
285     assertFalse(p.prestartCoreThread());
286     assertEquals(2, p.getPoolSize());
287     p.setCorePoolSize(4);
288     assertTrue(p.prestartCoreThread());
289     assertEquals(3, p.getPoolSize());
290     assertTrue(p.prestartCoreThread());
291     assertEquals(4, p.getPoolSize());
292     assertFalse(p.prestartCoreThread());
293     assertEquals(4, p.getPoolSize());
294     }
295 dl 1.1 }
296    
297     /**
298 jsr166 1.19 * prestartAllCoreThreads starts all corePoolSize threads
299 dl 1.1 */
300     public void testPrestartAllCoreThreads() {
301 jsr166 1.80 final ThreadPoolExecutor p =
302 jsr166 1.53 new CustomTPE(2, 6,
303     LONG_DELAY_MS, MILLISECONDS,
304     new ArrayBlockingQueue<Runnable>(10));
305     try (PoolCleaner cleaner = cleaner(p)) {
306     assertEquals(0, p.getPoolSize());
307     p.prestartAllCoreThreads();
308     assertEquals(2, p.getPoolSize());
309     p.prestartAllCoreThreads();
310     assertEquals(2, p.getPoolSize());
311     p.setCorePoolSize(4);
312     p.prestartAllCoreThreads();
313     assertEquals(4, p.getPoolSize());
314     p.prestartAllCoreThreads();
315     assertEquals(4, p.getPoolSize());
316     }
317 dl 1.1 }
318 jsr166 1.2
319 dl 1.1 /**
320 jsr166 1.19 * getCompletedTaskCount increases, but doesn't overestimate,
321     * when tasks complete
322 dl 1.1 */
323 jsr166 1.5 public void testGetCompletedTaskCount() throws InterruptedException {
324 jsr166 1.21 final ThreadPoolExecutor p =
325     new CustomTPE(2, 2,
326     LONG_DELAY_MS, MILLISECONDS,
327     new ArrayBlockingQueue<Runnable>(10));
328 jsr166 1.54 try (PoolCleaner cleaner = cleaner(p)) {
329     final CountDownLatch threadStarted = new CountDownLatch(1);
330     final CountDownLatch threadProceed = new CountDownLatch(1);
331     final CountDownLatch threadDone = new CountDownLatch(1);
332 jsr166 1.21 assertEquals(0, p.getCompletedTaskCount());
333     p.execute(new CheckedRunnable() {
334     public void realRun() throws InterruptedException {
335     threadStarted.countDown();
336     assertEquals(0, p.getCompletedTaskCount());
337     threadProceed.await();
338     threadDone.countDown();
339     }});
340 jsr166 1.30 await(threadStarted);
341 jsr166 1.21 assertEquals(0, p.getCompletedTaskCount());
342     threadProceed.countDown();
343     threadDone.await();
344 jsr166 1.30 long startTime = System.nanoTime();
345     while (p.getCompletedTaskCount() != 1) {
346     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
347     fail("timed out");
348     Thread.yield();
349     }
350 jsr166 1.21 }
351 dl 1.1 }
352 jsr166 1.2
353 dl 1.1 /**
354 jsr166 1.19 * getCorePoolSize returns size given in constructor if not otherwise set
355 dl 1.1 */
356     public void testGetCorePoolSize() {
357 jsr166 1.59 final ThreadPoolExecutor p =
358 jsr166 1.55 new CustomTPE(1, 1,
359     LONG_DELAY_MS, MILLISECONDS,
360     new ArrayBlockingQueue<Runnable>(10));
361     try (PoolCleaner cleaner = cleaner(p)) {
362     assertEquals(1, p.getCorePoolSize());
363     }
364 dl 1.1 }
365 jsr166 1.2
366 dl 1.1 /**
367 jsr166 1.19 * getKeepAliveTime returns value given in constructor if not otherwise set
368 dl 1.1 */
369     public void testGetKeepAliveTime() {
370 jsr166 1.59 final ThreadPoolExecutor p =
371 jsr166 1.56 new CustomTPE(2, 2,
372     1000, MILLISECONDS,
373     new ArrayBlockingQueue<Runnable>(10));
374     try (PoolCleaner cleaner = cleaner(p)) {
375     assertEquals(1, p.getKeepAliveTime(SECONDS));
376     }
377 dl 1.1 }
378    
379 jsr166 1.2 /**
380 dl 1.1 * getThreadFactory returns factory in constructor if not set
381     */
382     public void testGetThreadFactory() {
383 jsr166 1.59 final ThreadFactory threadFactory = new SimpleThreadFactory();
384     final ThreadPoolExecutor p =
385 jsr166 1.57 new CustomTPE(1, 2,
386     LONG_DELAY_MS, MILLISECONDS,
387     new ArrayBlockingQueue<Runnable>(10),
388     threadFactory,
389     new NoOpREHandler());
390     try (PoolCleaner cleaner = cleaner(p)) {
391     assertSame(threadFactory, p.getThreadFactory());
392     }
393 dl 1.1 }
394    
395 jsr166 1.2 /**
396 dl 1.1 * setThreadFactory sets the thread factory returned by getThreadFactory
397     */
398     public void testSetThreadFactory() {
399 jsr166 1.59 final ThreadPoolExecutor p =
400 jsr166 1.57 new CustomTPE(1, 2,
401     LONG_DELAY_MS, MILLISECONDS,
402     new ArrayBlockingQueue<Runnable>(10));
403     try (PoolCleaner cleaner = cleaner(p)) {
404     ThreadFactory threadFactory = new SimpleThreadFactory();
405     p.setThreadFactory(threadFactory);
406     assertSame(threadFactory, p.getThreadFactory());
407     }
408 dl 1.1 }
409    
410 jsr166 1.2 /**
411 dl 1.1 * setThreadFactory(null) throws NPE
412     */
413     public void testSetThreadFactoryNull() {
414 jsr166 1.59 final ThreadPoolExecutor p =
415 jsr166 1.58 new CustomTPE(1, 2,
416     LONG_DELAY_MS, MILLISECONDS,
417     new ArrayBlockingQueue<Runnable>(10));
418     try (PoolCleaner cleaner = cleaner(p)) {
419     try {
420     p.setThreadFactory(null);
421     shouldThrow();
422     } catch (NullPointerException success) {}
423 dl 1.1 }
424     }
425    
426 jsr166 1.2 /**
427 dl 1.1 * getRejectedExecutionHandler returns handler in constructor if not set
428     */
429     public void testGetRejectedExecutionHandler() {
430 jsr166 1.60 final RejectedExecutionHandler handler = new NoOpREHandler();
431 jsr166 1.59 final ThreadPoolExecutor p =
432     new CustomTPE(1, 2,
433     LONG_DELAY_MS, MILLISECONDS,
434     new ArrayBlockingQueue<Runnable>(10),
435 jsr166 1.60 handler);
436 jsr166 1.59 try (PoolCleaner cleaner = cleaner(p)) {
437 jsr166 1.60 assertSame(handler, p.getRejectedExecutionHandler());
438 jsr166 1.59 }
439 dl 1.1 }
440    
441 jsr166 1.2 /**
442 dl 1.1 * setRejectedExecutionHandler sets the handler returned by
443     * getRejectedExecutionHandler
444     */
445     public void testSetRejectedExecutionHandler() {
446 jsr166 1.60 final ThreadPoolExecutor p =
447     new CustomTPE(1, 2,
448     LONG_DELAY_MS, MILLISECONDS,
449     new ArrayBlockingQueue<Runnable>(10));
450     try (PoolCleaner cleaner = cleaner(p)) {
451     RejectedExecutionHandler handler = new NoOpREHandler();
452     p.setRejectedExecutionHandler(handler);
453     assertSame(handler, p.getRejectedExecutionHandler());
454     }
455 dl 1.1 }
456    
457 jsr166 1.2 /**
458 dl 1.1 * setRejectedExecutionHandler(null) throws NPE
459     */
460     public void testSetRejectedExecutionHandlerNull() {
461 jsr166 1.61 final ThreadPoolExecutor p =
462     new CustomTPE(1, 2,
463     LONG_DELAY_MS, MILLISECONDS,
464     new ArrayBlockingQueue<Runnable>(10));
465     try (PoolCleaner cleaner = cleaner(p)) {
466     try {
467     p.setRejectedExecutionHandler(null);
468     shouldThrow();
469     } catch (NullPointerException success) {}
470 dl 1.1 }
471     }
472    
473     /**
474 jsr166 1.19 * getLargestPoolSize increases, but doesn't overestimate, when
475     * multiple threads active
476 dl 1.1 */
477 jsr166 1.5 public void testGetLargestPoolSize() throws InterruptedException {
478 jsr166 1.21 final int THREADS = 3;
479     final ThreadPoolExecutor p =
480     new CustomTPE(THREADS, THREADS,
481     LONG_DELAY_MS, MILLISECONDS,
482     new ArrayBlockingQueue<Runnable>(10));
483 jsr166 1.62 try (PoolCleaner cleaner = cleaner(p)) {
484     final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
485     final CountDownLatch done = new CountDownLatch(1);
486 jsr166 1.21 assertEquals(0, p.getLargestPoolSize());
487     for (int i = 0; i < THREADS; i++)
488     p.execute(new CheckedRunnable() {
489     public void realRun() throws InterruptedException {
490     threadsStarted.countDown();
491     done.await();
492     assertEquals(THREADS, p.getLargestPoolSize());
493     }});
494 jsr166 1.62 assertTrue(threadsStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
495 jsr166 1.21 assertEquals(THREADS, p.getLargestPoolSize());
496 jsr166 1.62 done.countDown(); // release pool
497 jsr166 1.21 }
498 jsr166 1.62 assertEquals(THREADS, p.getLargestPoolSize());
499 dl 1.1 }
500 jsr166 1.2
501 dl 1.1 /**
502 jsr166 1.19 * getMaximumPoolSize returns value given in constructor if not
503     * otherwise set
504 dl 1.1 */
505     public void testGetMaximumPoolSize() {
506 jsr166 1.63 final ThreadPoolExecutor p =
507     new CustomTPE(2, 3,
508     LONG_DELAY_MS, MILLISECONDS,
509     new ArrayBlockingQueue<Runnable>(10));
510     try (PoolCleaner cleaner = cleaner(p)) {
511     assertEquals(3, p.getMaximumPoolSize());
512     p.setMaximumPoolSize(5);
513     assertEquals(5, p.getMaximumPoolSize());
514     p.setMaximumPoolSize(4);
515     assertEquals(4, p.getMaximumPoolSize());
516     }
517 dl 1.1 }
518 jsr166 1.2
519 dl 1.1 /**
520 jsr166 1.19 * getPoolSize increases, but doesn't overestimate, when threads
521     * become active
522 dl 1.1 */
523 jsr166 1.21 public void testGetPoolSize() throws InterruptedException {
524     final ThreadPoolExecutor p =
525     new CustomTPE(1, 1,
526     LONG_DELAY_MS, MILLISECONDS,
527     new ArrayBlockingQueue<Runnable>(10));
528 jsr166 1.64 try (PoolCleaner cleaner = cleaner(p)) {
529     final CountDownLatch threadStarted = new CountDownLatch(1);
530     final CountDownLatch done = new CountDownLatch(1);
531 jsr166 1.21 assertEquals(0, p.getPoolSize());
532     p.execute(new CheckedRunnable() {
533     public void realRun() throws InterruptedException {
534     threadStarted.countDown();
535     assertEquals(1, p.getPoolSize());
536     done.await();
537     }});
538 jsr166 1.64 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
539 jsr166 1.21 assertEquals(1, p.getPoolSize());
540 jsr166 1.64 done.countDown(); // release pool
541 jsr166 1.21 }
542 dl 1.1 }
543 jsr166 1.2
544 dl 1.1 /**
545 jsr166 1.19 * getTaskCount increases, but doesn't overestimate, when tasks submitted
546 dl 1.1 */
547 jsr166 1.5 public void testGetTaskCount() throws InterruptedException {
548 jsr166 1.21 final ThreadPoolExecutor p =
549     new CustomTPE(1, 1,
550     LONG_DELAY_MS, MILLISECONDS,
551     new ArrayBlockingQueue<Runnable>(10));
552 jsr166 1.67 try (PoolCleaner cleaner = cleaner(p)) {
553     final CountDownLatch threadStarted = new CountDownLatch(1);
554     final CountDownLatch done = new CountDownLatch(1);
555 jsr166 1.21 assertEquals(0, p.getTaskCount());
556     p.execute(new CheckedRunnable() {
557     public void realRun() throws InterruptedException {
558     threadStarted.countDown();
559     assertEquals(1, p.getTaskCount());
560     done.await();
561     }});
562 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
563 jsr166 1.21 assertEquals(1, p.getTaskCount());
564     done.countDown();
565     }
566 dl 1.1 }
567 jsr166 1.2
568 dl 1.1 /**
569 jsr166 1.28 * isShutdown is false before shutdown, true after
570 dl 1.1 */
571     public void testIsShutdown() {
572 jsr166 1.68 final ThreadPoolExecutor p =
573     new CustomTPE(1, 1,
574     LONG_DELAY_MS, MILLISECONDS,
575     new ArrayBlockingQueue<Runnable>(10));
576     try (PoolCleaner cleaner = cleaner(p)) {
577     assertFalse(p.isShutdown());
578     try { p.shutdown(); } catch (SecurityException ok) { return; }
579     assertTrue(p.isShutdown());
580     }
581 dl 1.1 }
582    
583     /**
584 jsr166 1.19 * isTerminated is false before termination, true after
585 dl 1.1 */
586 jsr166 1.5 public void testIsTerminated() throws InterruptedException {
587 jsr166 1.21 final ThreadPoolExecutor p =
588     new CustomTPE(1, 1,
589     LONG_DELAY_MS, MILLISECONDS,
590     new ArrayBlockingQueue<Runnable>(10));
591 jsr166 1.69 try (PoolCleaner cleaner = cleaner(p)) {
592     final CountDownLatch threadStarted = new CountDownLatch(1);
593     final CountDownLatch done = new CountDownLatch(1);
594 jsr166 1.21 assertFalse(p.isTerminating());
595     p.execute(new CheckedRunnable() {
596     public void realRun() throws InterruptedException {
597 jsr166 1.24 assertFalse(p.isTerminating());
598 jsr166 1.21 threadStarted.countDown();
599     done.await();
600     }});
601 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
602 jsr166 1.21 assertFalse(p.isTerminating());
603     done.countDown();
604     try { p.shutdown(); } catch (SecurityException ok) { return; }
605 jsr166 1.69 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
606     assertTrue(p.isTerminated());
607     assertFalse(p.isTerminating());
608 jsr166 1.21 }
609 dl 1.1 }
610    
611     /**
612 jsr166 1.19 * isTerminating is not true when running or when terminated
613 dl 1.1 */
614 jsr166 1.5 public void testIsTerminating() throws InterruptedException {
615 jsr166 1.21 final ThreadPoolExecutor p =
616     new CustomTPE(1, 1,
617     LONG_DELAY_MS, MILLISECONDS,
618     new ArrayBlockingQueue<Runnable>(10));
619 jsr166 1.70 try (PoolCleaner cleaner = cleaner(p)) {
620     final CountDownLatch threadStarted = new CountDownLatch(1);
621     final CountDownLatch done = new CountDownLatch(1);
622 jsr166 1.21 assertFalse(p.isTerminating());
623     p.execute(new CheckedRunnable() {
624     public void realRun() throws InterruptedException {
625 jsr166 1.23 assertFalse(p.isTerminating());
626 jsr166 1.21 threadStarted.countDown();
627     done.await();
628     }});
629 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
630 jsr166 1.21 assertFalse(p.isTerminating());
631     done.countDown();
632     try { p.shutdown(); } catch (SecurityException ok) { return; }
633 jsr166 1.70 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
634     assertTrue(p.isTerminated());
635     assertFalse(p.isTerminating());
636 jsr166 1.21 }
637 dl 1.1 }
638    
639     /**
640     * getQueue returns the work queue, which contains queued tasks
641     */
642 jsr166 1.5 public void testGetQueue() throws InterruptedException {
643 jsr166 1.21 final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
644     final ThreadPoolExecutor p =
645     new CustomTPE(1, 1,
646     LONG_DELAY_MS, MILLISECONDS,
647     q);
648 jsr166 1.71 try (PoolCleaner cleaner = cleaner(p)) {
649     final CountDownLatch threadStarted = new CountDownLatch(1);
650     final CountDownLatch done = new CountDownLatch(1);
651 jsr166 1.21 FutureTask[] tasks = new FutureTask[5];
652     for (int i = 0; i < tasks.length; i++) {
653     Callable task = new CheckedCallable<Boolean>() {
654     public Boolean realCall() throws InterruptedException {
655     threadStarted.countDown();
656     assertSame(q, p.getQueue());
657     done.await();
658     return Boolean.TRUE;
659     }};
660     tasks[i] = new FutureTask(task);
661     p.execute(tasks[i]);
662     }
663 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
664 jsr166 1.21 assertSame(q, p.getQueue());
665     assertFalse(q.contains(tasks[0]));
666     assertTrue(q.contains(tasks[tasks.length - 1]));
667     assertEquals(tasks.length - 1, q.size());
668     done.countDown();
669 dl 1.1 }
670     }
671    
672     /**
673     * remove(task) removes queued task, and fails to remove active task
674     */
675 jsr166 1.5 public void testRemove() throws InterruptedException {
676 dl 1.1 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
677 jsr166 1.21 final ThreadPoolExecutor p =
678     new CustomTPE(1, 1,
679     LONG_DELAY_MS, MILLISECONDS,
680     q);
681 jsr166 1.72 try (PoolCleaner cleaner = cleaner(p)) {
682     Runnable[] tasks = new Runnable[6];
683     final CountDownLatch threadStarted = new CountDownLatch(1);
684     final CountDownLatch done = new CountDownLatch(1);
685 jsr166 1.21 for (int i = 0; i < tasks.length; i++) {
686     tasks[i] = new CheckedRunnable() {
687 jsr166 1.72 public void realRun() throws InterruptedException {
688     threadStarted.countDown();
689     done.await();
690     }};
691 jsr166 1.21 p.execute(tasks[i]);
692     }
693 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
694 jsr166 1.21 assertFalse(p.remove(tasks[0]));
695 dl 1.1 assertTrue(q.contains(tasks[4]));
696     assertTrue(q.contains(tasks[3]));
697 jsr166 1.21 assertTrue(p.remove(tasks[4]));
698     assertFalse(p.remove(tasks[4]));
699 dl 1.1 assertFalse(q.contains(tasks[4]));
700     assertTrue(q.contains(tasks[3]));
701 jsr166 1.21 assertTrue(p.remove(tasks[3]));
702 dl 1.1 assertFalse(q.contains(tasks[3]));
703 jsr166 1.21 done.countDown();
704 dl 1.1 }
705     }
706    
707     /**
708 jsr166 1.19 * purge removes cancelled tasks from the queue
709 dl 1.1 */
710 jsr166 1.21 public void testPurge() throws InterruptedException {
711     final CountDownLatch threadStarted = new CountDownLatch(1);
712     final CountDownLatch done = new CountDownLatch(1);
713     final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
714     final ThreadPoolExecutor p =
715     new CustomTPE(1, 1,
716     LONG_DELAY_MS, MILLISECONDS,
717     q);
718 jsr166 1.72 try (PoolCleaner cleaner = cleaner(p)) {
719     FutureTask[] tasks = new FutureTask[5];
720 jsr166 1.21 for (int i = 0; i < tasks.length; i++) {
721     Callable task = new CheckedCallable<Boolean>() {
722     public Boolean realCall() throws InterruptedException {
723     threadStarted.countDown();
724     done.await();
725     return Boolean.TRUE;
726     }};
727     tasks[i] = new FutureTask(task);
728     p.execute(tasks[i]);
729     }
730 jsr166 1.65 assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
731 jsr166 1.21 assertEquals(tasks.length, p.getTaskCount());
732     assertEquals(tasks.length - 1, q.size());
733     assertEquals(1L, p.getActiveCount());
734     assertEquals(0L, p.getCompletedTaskCount());
735     tasks[4].cancel(true);
736     tasks[3].cancel(false);
737     p.purge();
738     assertEquals(tasks.length - 3, q.size());
739     assertEquals(tasks.length - 2, p.getTaskCount());
740     p.purge(); // Nothing to do
741     assertEquals(tasks.length - 3, q.size());
742     assertEquals(tasks.length - 2, p.getTaskCount());
743     done.countDown();
744     }
745 dl 1.1 }
746    
747     /**
748 jsr166 1.40 * shutdownNow returns a list containing tasks that were not run,
749     * and those tasks are drained from the queue
750 dl 1.1 */
751 jsr166 1.41 public void testShutdownNow() throws InterruptedException {
752     final int poolSize = 2;
753     final int count = 5;
754     final AtomicInteger ran = new AtomicInteger(0);
755 jsr166 1.80 final ThreadPoolExecutor p =
756 jsr166 1.81 new CustomTPE(poolSize, poolSize,
757     LONG_DELAY_MS, MILLISECONDS,
758 jsr166 1.41 new ArrayBlockingQueue<Runnable>(10));
759     CountDownLatch threadsStarted = new CountDownLatch(poolSize);
760 jsr166 1.43 Runnable waiter = new CheckedRunnable() { public void realRun() {
761 jsr166 1.41 threadsStarted.countDown();
762 dl 1.1 try {
763 jsr166 1.41 MILLISECONDS.sleep(2 * LONG_DELAY_MS);
764     } catch (InterruptedException success) {}
765     ran.getAndIncrement();
766     }};
767     for (int i = 0; i < count; i++)
768     p.execute(waiter);
769     assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
770 jsr166 1.42 assertEquals(poolSize, p.getActiveCount());
771     assertEquals(0, p.getCompletedTaskCount());
772 jsr166 1.41 final List<Runnable> queuedTasks;
773     try {
774     queuedTasks = p.shutdownNow();
775     } catch (SecurityException ok) {
776     return; // Allowed in case test doesn't have privs
777 dl 1.1 }
778 jsr166 1.21 assertTrue(p.isShutdown());
779 jsr166 1.40 assertTrue(p.getQueue().isEmpty());
780 jsr166 1.41 assertEquals(count - poolSize, queuedTasks.size());
781     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
782     assertTrue(p.isTerminated());
783     assertEquals(poolSize, ran.get());
784 jsr166 1.42 assertEquals(poolSize, p.getCompletedTaskCount());
785 dl 1.1 }
786    
787     // Exception Tests
788    
789 jsr166 1.2 /**
790     * Constructor throws if corePoolSize argument is less than zero
791 dl 1.1 */
792     public void testConstructor1() {
793     try {
794 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
795     new ArrayBlockingQueue<Runnable>(10));
796 dl 1.1 shouldThrow();
797 jsr166 1.5 } catch (IllegalArgumentException success) {}
798 dl 1.1 }
799 jsr166 1.2
800     /**
801     * Constructor throws if maximumPoolSize is less than zero
802 dl 1.1 */
803     public void testConstructor2() {
804     try {
805 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
806     new ArrayBlockingQueue<Runnable>(10));
807 dl 1.1 shouldThrow();
808 jsr166 1.5 } catch (IllegalArgumentException success) {}
809 dl 1.1 }
810 jsr166 1.2
811     /**
812     * Constructor throws if maximumPoolSize is equal to zero
813 dl 1.1 */
814     public void testConstructor3() {
815     try {
816 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
817     new ArrayBlockingQueue<Runnable>(10));
818 dl 1.1 shouldThrow();
819 jsr166 1.5 } catch (IllegalArgumentException success) {}
820 dl 1.1 }
821    
822 jsr166 1.2 /**
823     * Constructor throws if keepAliveTime is less than zero
824 dl 1.1 */
825     public void testConstructor4() {
826     try {
827 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
828     new ArrayBlockingQueue<Runnable>(10));
829 dl 1.1 shouldThrow();
830 jsr166 1.5 } catch (IllegalArgumentException success) {}
831 dl 1.1 }
832    
833 jsr166 1.2 /**
834     * Constructor throws if corePoolSize is greater than the maximumPoolSize
835 dl 1.1 */
836     public void testConstructor5() {
837     try {
838 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
839     new ArrayBlockingQueue<Runnable>(10));
840 dl 1.1 shouldThrow();
841 jsr166 1.5 } catch (IllegalArgumentException success) {}
842 dl 1.1 }
843 jsr166 1.2
844     /**
845     * Constructor throws if workQueue is set to null
846 dl 1.1 */
847     public void testConstructorNullPointerException() {
848     try {
849 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS, null);
850 dl 1.1 shouldThrow();
851 jsr166 1.5 } catch (NullPointerException success) {}
852 dl 1.1 }
853    
854 jsr166 1.2 /**
855     * Constructor throws if corePoolSize argument is less than zero
856 dl 1.1 */
857     public void testConstructor6() {
858     try {
859 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
860     new ArrayBlockingQueue<Runnable>(10),
861     new SimpleThreadFactory());
862 dl 1.1 shouldThrow();
863 jsr166 1.4 } catch (IllegalArgumentException success) {}
864 dl 1.1 }
865 jsr166 1.2
866     /**
867     * Constructor throws if maximumPoolSize is less than zero
868 dl 1.1 */
869     public void testConstructor7() {
870     try {
871 jsr166 1.36 new CustomTPE(1,-1, 1L, SECONDS,
872     new ArrayBlockingQueue<Runnable>(10),
873     new SimpleThreadFactory());
874 dl 1.1 shouldThrow();
875 jsr166 1.5 } catch (IllegalArgumentException success) {}
876 dl 1.1 }
877    
878 jsr166 1.2 /**
879     * Constructor throws if maximumPoolSize is equal to zero
880 dl 1.1 */
881     public void testConstructor8() {
882     try {
883 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
884     new ArrayBlockingQueue<Runnable>(10),
885     new SimpleThreadFactory());
886 dl 1.1 shouldThrow();
887 jsr166 1.5 } catch (IllegalArgumentException success) {}
888 dl 1.1 }
889    
890 jsr166 1.2 /**
891     * Constructor throws if keepAliveTime is less than zero
892 dl 1.1 */
893     public void testConstructor9() {
894     try {
895 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
896     new ArrayBlockingQueue<Runnable>(10),
897     new SimpleThreadFactory());
898 dl 1.1 shouldThrow();
899 jsr166 1.5 } catch (IllegalArgumentException success) {}
900 dl 1.1 }
901    
902 jsr166 1.2 /**
903     * Constructor throws if corePoolSize is greater than the maximumPoolSize
904 dl 1.1 */
905     public void testConstructor10() {
906     try {
907 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
908     new ArrayBlockingQueue<Runnable>(10),
909     new SimpleThreadFactory());
910 dl 1.1 shouldThrow();
911 jsr166 1.5 } catch (IllegalArgumentException success) {}
912 dl 1.1 }
913    
914 jsr166 1.2 /**
915     * Constructor throws if workQueue is set to null
916 dl 1.1 */
917     public void testConstructorNullPointerException2() {
918     try {
919 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS, null, new SimpleThreadFactory());
920 dl 1.1 shouldThrow();
921 jsr166 1.5 } catch (NullPointerException success) {}
922 dl 1.1 }
923    
924 jsr166 1.2 /**
925     * Constructor throws if threadFactory is set to null
926 dl 1.1 */
927     public void testConstructorNullPointerException3() {
928     try {
929 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
930     new ArrayBlockingQueue<Runnable>(10),
931     (ThreadFactory) null);
932 dl 1.1 shouldThrow();
933 jsr166 1.5 } catch (NullPointerException success) {}
934 dl 1.1 }
935 jsr166 1.2
936     /**
937     * Constructor throws if corePoolSize argument is less than zero
938 dl 1.1 */
939     public void testConstructor11() {
940     try {
941 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
942     new ArrayBlockingQueue<Runnable>(10),
943     new NoOpREHandler());
944 dl 1.1 shouldThrow();
945 jsr166 1.5 } catch (IllegalArgumentException success) {}
946 dl 1.1 }
947    
948 jsr166 1.2 /**
949     * Constructor throws if maximumPoolSize is less than zero
950 dl 1.1 */
951     public void testConstructor12() {
952     try {
953 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
954     new ArrayBlockingQueue<Runnable>(10),
955     new NoOpREHandler());
956 dl 1.1 shouldThrow();
957 jsr166 1.5 } catch (IllegalArgumentException success) {}
958 dl 1.1 }
959    
960 jsr166 1.2 /**
961     * Constructor throws if maximumPoolSize is equal to zero
962 dl 1.1 */
963     public void testConstructor13() {
964     try {
965 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
966     new ArrayBlockingQueue<Runnable>(10),
967     new NoOpREHandler());
968 dl 1.1 shouldThrow();
969 jsr166 1.5 } catch (IllegalArgumentException success) {}
970 dl 1.1 }
971    
972 jsr166 1.2 /**
973     * Constructor throws if keepAliveTime is less than zero
974 dl 1.1 */
975     public void testConstructor14() {
976     try {
977 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
978     new ArrayBlockingQueue<Runnable>(10),
979     new NoOpREHandler());
980 dl 1.1 shouldThrow();
981 jsr166 1.5 } catch (IllegalArgumentException success) {}
982 dl 1.1 }
983    
984 jsr166 1.2 /**
985     * Constructor throws if corePoolSize is greater than the maximumPoolSize
986 dl 1.1 */
987     public void testConstructor15() {
988     try {
989 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
990     new ArrayBlockingQueue<Runnable>(10),
991     new NoOpREHandler());
992 dl 1.1 shouldThrow();
993 jsr166 1.5 } catch (IllegalArgumentException success) {}
994 dl 1.1 }
995    
996 jsr166 1.2 /**
997     * Constructor throws if workQueue is set to null
998 dl 1.1 */
999     public void testConstructorNullPointerException4() {
1000     try {
1001 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1002     null,
1003     new NoOpREHandler());
1004 dl 1.1 shouldThrow();
1005 jsr166 1.5 } catch (NullPointerException success) {}
1006 dl 1.1 }
1007    
1008 jsr166 1.2 /**
1009     * Constructor throws if handler is set to null
1010 dl 1.1 */
1011     public void testConstructorNullPointerException5() {
1012     try {
1013 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1014     new ArrayBlockingQueue<Runnable>(10),
1015     (RejectedExecutionHandler) null);
1016 dl 1.1 shouldThrow();
1017 jsr166 1.5 } catch (NullPointerException success) {}
1018 dl 1.1 }
1019    
1020 jsr166 1.2 /**
1021     * Constructor throws if corePoolSize argument is less than zero
1022 dl 1.1 */
1023     public void testConstructor16() {
1024     try {
1025 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
1026     new ArrayBlockingQueue<Runnable>(10),
1027     new SimpleThreadFactory(),
1028     new NoOpREHandler());
1029 dl 1.1 shouldThrow();
1030 jsr166 1.5 } catch (IllegalArgumentException success) {}
1031 dl 1.1 }
1032    
1033 jsr166 1.2 /**
1034     * Constructor throws if maximumPoolSize is less than zero
1035 dl 1.1 */
1036     public void testConstructor17() {
1037     try {
1038 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
1039     new ArrayBlockingQueue<Runnable>(10),
1040     new SimpleThreadFactory(),
1041     new NoOpREHandler());
1042 dl 1.1 shouldThrow();
1043 jsr166 1.5 } catch (IllegalArgumentException success) {}
1044 dl 1.1 }
1045    
1046 jsr166 1.2 /**
1047     * Constructor throws if maximumPoolSize is equal to zero
1048 dl 1.1 */
1049     public void testConstructor18() {
1050     try {
1051 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
1052     new ArrayBlockingQueue<Runnable>(10),
1053     new SimpleThreadFactory(),
1054     new NoOpREHandler());
1055 dl 1.1 shouldThrow();
1056 jsr166 1.5 } catch (IllegalArgumentException success) {}
1057 dl 1.1 }
1058    
1059 jsr166 1.2 /**
1060     * Constructor throws if keepAliveTime is less than zero
1061 dl 1.1 */
1062     public void testConstructor19() {
1063     try {
1064 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
1065     new ArrayBlockingQueue<Runnable>(10),
1066     new SimpleThreadFactory(),
1067     new NoOpREHandler());
1068 dl 1.1 shouldThrow();
1069 jsr166 1.5 } catch (IllegalArgumentException success) {}
1070 dl 1.1 }
1071    
1072 jsr166 1.2 /**
1073     * Constructor throws if corePoolSize is greater than the maximumPoolSize
1074 dl 1.1 */
1075     public void testConstructor20() {
1076     try {
1077 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
1078     new ArrayBlockingQueue<Runnable>(10),
1079     new SimpleThreadFactory(),
1080     new NoOpREHandler());
1081 dl 1.1 shouldThrow();
1082 jsr166 1.5 } catch (IllegalArgumentException success) {}
1083 dl 1.1 }
1084    
1085 jsr166 1.2 /**
1086 jsr166 1.20 * Constructor throws if workQueue is null
1087 dl 1.1 */
1088     public void testConstructorNullPointerException6() {
1089     try {
1090 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1091     null,
1092     new SimpleThreadFactory(),
1093     new NoOpREHandler());
1094 dl 1.1 shouldThrow();
1095 jsr166 1.5 } catch (NullPointerException success) {}
1096 dl 1.1 }
1097    
1098 jsr166 1.2 /**
1099 jsr166 1.20 * Constructor throws if handler is null
1100 dl 1.1 */
1101     public void testConstructorNullPointerException7() {
1102     try {
1103 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1104     new ArrayBlockingQueue<Runnable>(10),
1105     new SimpleThreadFactory(),
1106     (RejectedExecutionHandler) null);
1107 dl 1.1 shouldThrow();
1108 jsr166 1.5 } catch (NullPointerException success) {}
1109 dl 1.1 }
1110    
1111 jsr166 1.2 /**
1112 jsr166 1.20 * Constructor throws if ThreadFactory is null
1113 dl 1.1 */
1114     public void testConstructorNullPointerException8() {
1115     try {
1116 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1117 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10),
1118     (ThreadFactory) null,
1119     new NoOpREHandler());
1120 dl 1.1 shouldThrow();
1121 jsr166 1.5 } catch (NullPointerException success) {}
1122 dl 1.1 }
1123 jsr166 1.2
1124 dl 1.1 /**
1125 jsr166 1.19 * execute throws RejectedExecutionException if saturated.
1126 dl 1.1 */
1127     public void testSaturatedExecute() {
1128 jsr166 1.73 final ThreadPoolExecutor p =
1129 jsr166 1.21 new CustomTPE(1, 1,
1130     LONG_DELAY_MS, MILLISECONDS,
1131     new ArrayBlockingQueue<Runnable>(1));
1132 jsr166 1.73 try (PoolCleaner cleaner = cleaner(p)) {
1133     final CountDownLatch done = new CountDownLatch(1);
1134 jsr166 1.21 Runnable task = new CheckedRunnable() {
1135     public void realRun() throws InterruptedException {
1136     done.await();
1137     }};
1138     for (int i = 0; i < 2; ++i)
1139     p.execute(task);
1140     for (int i = 0; i < 2; ++i) {
1141     try {
1142     p.execute(task);
1143     shouldThrow();
1144     } catch (RejectedExecutionException success) {}
1145     assertTrue(p.getTaskCount() <= 2);
1146 dl 1.1 }
1147 jsr166 1.21 done.countDown();
1148     }
1149 dl 1.1 }
1150    
1151     /**
1152 jsr166 1.19 * executor using CallerRunsPolicy runs task if saturated.
1153 dl 1.1 */
1154     public void testSaturatedExecute2() {
1155 jsr166 1.74 final ThreadPoolExecutor p =
1156     new CustomTPE(1, 1,
1157     LONG_DELAY_MS, MILLISECONDS,
1158     new ArrayBlockingQueue<Runnable>(1),
1159     new CustomTPE.CallerRunsPolicy());
1160     try (PoolCleaner cleaner = cleaner(p)) {
1161     final CountDownLatch done = new CountDownLatch(1);
1162     Runnable blocker = new CheckedRunnable() {
1163     public void realRun() throws InterruptedException {
1164     done.await();
1165     }};
1166     p.execute(blocker);
1167 dl 1.1 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1168 jsr166 1.74 for (int i = 0; i < tasks.length; i++)
1169 dl 1.1 tasks[i] = new TrackedNoOpRunnable();
1170 jsr166 1.74 for (int i = 0; i < tasks.length; i++)
1171 dl 1.1 p.execute(tasks[i]);
1172 jsr166 1.74 for (int i = 1; i < tasks.length; i++)
1173 dl 1.1 assertTrue(tasks[i].done);
1174 jsr166 1.75 assertFalse(tasks[0].done); // waiting in queue
1175 jsr166 1.74 done.countDown();
1176 dl 1.1 }
1177     }
1178    
1179     /**
1180 jsr166 1.19 * executor using DiscardPolicy drops task if saturated.
1181 dl 1.1 */
1182     public void testSaturatedExecute3() {
1183 jsr166 1.75 final TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1184     for (int i = 0; i < tasks.length; ++i)
1185     tasks[i] = new TrackedNoOpRunnable();
1186     final ThreadPoolExecutor p =
1187 jsr166 1.21 new CustomTPE(1, 1,
1188     LONG_DELAY_MS, MILLISECONDS,
1189     new ArrayBlockingQueue<Runnable>(1),
1190 jsr166 1.75 new CustomTPE.DiscardPolicy());
1191     try (PoolCleaner cleaner = cleaner(p)) {
1192     final CountDownLatch done = new CountDownLatch(1);
1193     p.execute(awaiter(done));
1194    
1195 jsr166 1.21 for (TrackedNoOpRunnable task : tasks)
1196     p.execute(task);
1197 jsr166 1.75 for (int i = 1; i < tasks.length; i++)
1198     assertFalse(tasks[i].done);
1199     done.countDown();
1200 dl 1.1 }
1201 jsr166 1.75 for (int i = 1; i < tasks.length; i++)
1202     assertFalse(tasks[i].done);
1203     assertTrue(tasks[0].done); // was waiting in queue
1204 dl 1.1 }
1205    
1206     /**
1207 jsr166 1.19 * executor using DiscardOldestPolicy drops oldest task if saturated.
1208 dl 1.1 */
1209     public void testSaturatedExecute4() {
1210 jsr166 1.76 final CountDownLatch done = new CountDownLatch(1);
1211     LatchAwaiter r1 = awaiter(done);
1212     LatchAwaiter r2 = awaiter(done);
1213     LatchAwaiter r3 = awaiter(done);
1214     final ThreadPoolExecutor p =
1215     new CustomTPE(1, 1,
1216     LONG_DELAY_MS, MILLISECONDS,
1217     new ArrayBlockingQueue<Runnable>(1),
1218     new CustomTPE.DiscardOldestPolicy());
1219     try (PoolCleaner cleaner = cleaner(p)) {
1220     assertEquals(LatchAwaiter.NEW, r1.state);
1221     assertEquals(LatchAwaiter.NEW, r2.state);
1222     assertEquals(LatchAwaiter.NEW, r3.state);
1223     p.execute(r1);
1224 dl 1.1 p.execute(r2);
1225     assertTrue(p.getQueue().contains(r2));
1226     p.execute(r3);
1227     assertFalse(p.getQueue().contains(r2));
1228     assertTrue(p.getQueue().contains(r3));
1229 jsr166 1.76 done.countDown();
1230 dl 1.1 }
1231 jsr166 1.76 assertEquals(LatchAwaiter.DONE, r1.state);
1232     assertEquals(LatchAwaiter.NEW, r2.state);
1233     assertEquals(LatchAwaiter.DONE, r3.state);
1234 dl 1.1 }
1235    
1236     /**
1237 jsr166 1.19 * execute throws RejectedExecutionException if shutdown
1238 dl 1.1 */
1239     public void testRejectedExecutionExceptionOnShutdown() {
1240 jsr166 1.77 final ThreadPoolExecutor p =
1241     new CustomTPE(1, 1,
1242     LONG_DELAY_MS, MILLISECONDS,
1243     new ArrayBlockingQueue<Runnable>(1));
1244 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1245 jsr166 1.77 try (PoolCleaner cleaner = cleaner(p)) {
1246     try {
1247     p.execute(new NoOpRunnable());
1248     shouldThrow();
1249     } catch (RejectedExecutionException success) {}
1250     }
1251 dl 1.1 }
1252    
1253     /**
1254 jsr166 1.19 * execute using CallerRunsPolicy drops task on shutdown
1255 dl 1.1 */
1256     public void testCallerRunsOnShutdown() {
1257 jsr166 1.79 final ThreadPoolExecutor p =
1258     new CustomTPE(1, 1,
1259     LONG_DELAY_MS, MILLISECONDS,
1260     new ArrayBlockingQueue<Runnable>(1),
1261     new CustomTPE.CallerRunsPolicy());
1262 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1263 jsr166 1.78 try (PoolCleaner cleaner = cleaner(p)) {
1264 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1265 jsr166 1.8 p.execute(r);
1266 dl 1.1 assertFalse(r.done);
1267     }
1268     }
1269    
1270     /**
1271 jsr166 1.19 * execute using DiscardPolicy drops task on shutdown
1272 dl 1.1 */
1273     public void testDiscardOnShutdown() {
1274 jsr166 1.79 final ThreadPoolExecutor p =
1275     new CustomTPE(1, 1,
1276     LONG_DELAY_MS, MILLISECONDS,
1277     new ArrayBlockingQueue<Runnable>(1),
1278     new CustomTPE.DiscardPolicy());
1279 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1280 jsr166 1.79 try (PoolCleaner cleaner = cleaner(p)) {
1281 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1282 jsr166 1.8 p.execute(r);
1283 dl 1.1 assertFalse(r.done);
1284     }
1285     }
1286    
1287     /**
1288 jsr166 1.19 * execute using DiscardOldestPolicy drops task on shutdown
1289 dl 1.1 */
1290     public void testDiscardOldestOnShutdown() {
1291 jsr166 1.79 final ThreadPoolExecutor p =
1292     new CustomTPE(1, 1,
1293     LONG_DELAY_MS, MILLISECONDS,
1294     new ArrayBlockingQueue<Runnable>(1),
1295     new CustomTPE.DiscardOldestPolicy());
1296 dl 1.1
1297 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1298 jsr166 1.79 try (PoolCleaner cleaner = cleaner(p)) {
1299 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1300 jsr166 1.8 p.execute(r);
1301 dl 1.1 assertFalse(r.done);
1302     }
1303     }
1304    
1305     /**
1306 jsr166 1.18 * execute(null) throws NPE
1307 dl 1.1 */
1308     public void testExecuteNull() {
1309 jsr166 1.79 final ThreadPoolExecutor p =
1310     new CustomTPE(1, 2,
1311     1L, SECONDS,
1312 jsr166 1.37 new ArrayBlockingQueue<Runnable>(10));
1313 jsr166 1.79 try (PoolCleaner cleaner = cleaner(p)) {
1314     try {
1315     p.execute(null);
1316     shouldThrow();
1317     } catch (NullPointerException success) {}
1318     }
1319 dl 1.1 }
1320 jsr166 1.2
1321 dl 1.1 /**
1322 jsr166 1.19 * setCorePoolSize of negative value throws IllegalArgumentException
1323 dl 1.1 */
1324     public void testCorePoolSizeIllegalArgumentException() {
1325 jsr166 1.80 final ThreadPoolExecutor p =
1326 jsr166 1.81 new CustomTPE(1, 2,
1327     LONG_DELAY_MS, MILLISECONDS,
1328     new ArrayBlockingQueue<Runnable>(10));
1329     try (PoolCleaner cleaner = cleaner(p)) {
1330     try {
1331     p.setCorePoolSize(-1);
1332     shouldThrow();
1333     } catch (IllegalArgumentException success) {}
1334 dl 1.1 }
1335 jsr166 1.2 }
1336 dl 1.1
1337     /**
1338 jsr166 1.19 * setMaximumPoolSize(int) throws IllegalArgumentException
1339     * if given a value less the core pool size
1340 jsr166 1.2 */
1341 dl 1.1 public void testMaximumPoolSizeIllegalArgumentException() {
1342 jsr166 1.80 final ThreadPoolExecutor p =
1343 jsr166 1.81 new CustomTPE(2, 3,
1344     LONG_DELAY_MS, MILLISECONDS,
1345     new ArrayBlockingQueue<Runnable>(10));
1346 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1347     try {
1348     p.setMaximumPoolSize(1);
1349     shouldThrow();
1350     } catch (IllegalArgumentException success) {}
1351 dl 1.1 }
1352     }
1353 jsr166 1.2
1354 dl 1.1 /**
1355 jsr166 1.19 * setMaximumPoolSize throws IllegalArgumentException
1356     * if given a negative value
1357 dl 1.1 */
1358     public void testMaximumPoolSizeIllegalArgumentException2() {
1359 jsr166 1.80 final ThreadPoolExecutor p =
1360 jsr166 1.81 new CustomTPE(2, 3,
1361     LONG_DELAY_MS,
1362     MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1363 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1364     try {
1365     p.setMaximumPoolSize(-1);
1366     shouldThrow();
1367     } catch (IllegalArgumentException success) {}
1368 dl 1.1 }
1369     }
1370 jsr166 1.2
1371 dl 1.1 /**
1372 jsr166 1.19 * setKeepAliveTime throws IllegalArgumentException
1373     * when given a negative value
1374 dl 1.1 */
1375     public void testKeepAliveTimeIllegalArgumentException() {
1376 jsr166 1.80 final ThreadPoolExecutor p =
1377 jsr166 1.81 new CustomTPE(2, 3,
1378     LONG_DELAY_MS, MILLISECONDS,
1379     new ArrayBlockingQueue<Runnable>(10));
1380 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1381     try {
1382     p.setKeepAliveTime(-1, MILLISECONDS);
1383     shouldThrow();
1384     } catch (IllegalArgumentException success) {}
1385 dl 1.1 }
1386     }
1387    
1388     /**
1389     * terminated() is called on termination
1390     */
1391     public void testTerminated() {
1392 jsr166 1.21 CustomTPE p = new CustomTPE();
1393 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1394     try { p.shutdown(); } catch (SecurityException ok) { return; }
1395     assertTrue(p.terminatedCalled());
1396     assertTrue(p.isShutdown());
1397     }
1398 dl 1.1 }
1399    
1400     /**
1401     * beforeExecute and afterExecute are called when executing task
1402     */
1403 jsr166 1.5 public void testBeforeAfter() throws InterruptedException {
1404 jsr166 1.21 CustomTPE p = new CustomTPE();
1405 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1406 jsr166 1.30 final CountDownLatch done = new CountDownLatch(1);
1407 jsr166 1.32 p.execute(new CheckedRunnable() {
1408 jsr166 1.30 public void realRun() {
1409     done.countDown();
1410 jsr166 1.32 }});
1411 jsr166 1.30 await(p.afterCalled);
1412     assertEquals(0, done.getCount());
1413     assertTrue(p.afterCalled());
1414     assertTrue(p.beforeCalled());
1415 dl 1.1 }
1416     }
1417    
1418     /**
1419     * completed submit of callable returns result
1420     */
1421 jsr166 1.5 public void testSubmitCallable() throws Exception {
1422 jsr166 1.80 final ExecutorService e =
1423     new CustomTPE(2, 2,
1424     LONG_DELAY_MS, MILLISECONDS,
1425     new ArrayBlockingQueue<Runnable>(10));
1426 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1427 dl 1.1 Future<String> future = e.submit(new StringTask());
1428     String result = future.get();
1429     assertSame(TEST_STRING, result);
1430     }
1431     }
1432    
1433     /**
1434     * completed submit of runnable returns successfully
1435     */
1436 jsr166 1.5 public void testSubmitRunnable() throws Exception {
1437 jsr166 1.80 final ExecutorService e =
1438     new CustomTPE(2, 2,
1439     LONG_DELAY_MS, MILLISECONDS,
1440     new ArrayBlockingQueue<Runnable>(10));
1441 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1442 dl 1.1 Future<?> future = e.submit(new NoOpRunnable());
1443     future.get();
1444     assertTrue(future.isDone());
1445     }
1446     }
1447    
1448     /**
1449     * completed submit of (runnable, result) returns result
1450     */
1451 jsr166 1.5 public void testSubmitRunnable2() throws Exception {
1452 jsr166 1.80 final ExecutorService e =
1453     new CustomTPE(2, 2,
1454     LONG_DELAY_MS, MILLISECONDS,
1455     new ArrayBlockingQueue<Runnable>(10));
1456 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1457 dl 1.1 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1458     String result = future.get();
1459     assertSame(TEST_STRING, result);
1460     }
1461     }
1462    
1463     /**
1464     * invokeAny(null) throws NPE
1465     */
1466 jsr166 1.5 public void testInvokeAny1() throws Exception {
1467 jsr166 1.80 final ExecutorService e =
1468     new CustomTPE(2, 2,
1469     LONG_DELAY_MS, MILLISECONDS,
1470     new ArrayBlockingQueue<Runnable>(10));
1471 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1472     try {
1473     e.invokeAny(null);
1474     shouldThrow();
1475     } catch (NullPointerException success) {}
1476 dl 1.1 }
1477     }
1478    
1479     /**
1480     * invokeAny(empty collection) throws IAE
1481     */
1482 jsr166 1.5 public void testInvokeAny2() throws Exception {
1483 jsr166 1.80 final ExecutorService e =
1484     new CustomTPE(2, 2,
1485     LONG_DELAY_MS, MILLISECONDS,
1486     new ArrayBlockingQueue<Runnable>(10));
1487 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1488     try {
1489     e.invokeAny(new ArrayList<Callable<String>>());
1490     shouldThrow();
1491     } catch (IllegalArgumentException success) {}
1492 dl 1.1 }
1493     }
1494    
1495     /**
1496     * invokeAny(c) throws NPE if c has null elements
1497     */
1498 jsr166 1.5 public void testInvokeAny3() throws Exception {
1499 jsr166 1.17 CountDownLatch latch = new CountDownLatch(1);
1500 jsr166 1.80 final ExecutorService e =
1501     new CustomTPE(2, 2,
1502     LONG_DELAY_MS, MILLISECONDS,
1503     new ArrayBlockingQueue<Runnable>(10));
1504 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1505     List<Callable<String>> l = new ArrayList<Callable<String>>();
1506     l.add(latchAwaitingStringTask(latch));
1507     l.add(null);
1508     try {
1509     e.invokeAny(l);
1510     shouldThrow();
1511     } catch (NullPointerException success) {}
1512 jsr166 1.5 latch.countDown();
1513 dl 1.1 }
1514     }
1515    
1516     /**
1517     * invokeAny(c) throws ExecutionException if no task completes
1518     */
1519 jsr166 1.5 public void testInvokeAny4() throws Exception {
1520 jsr166 1.80 final ExecutorService e =
1521     new CustomTPE(2, 2,
1522     LONG_DELAY_MS, MILLISECONDS,
1523     new ArrayBlockingQueue<Runnable>(10));
1524 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1525     List<Callable<String>> l = new ArrayList<Callable<String>>();
1526     l.add(new NPETask());
1527     try {
1528     e.invokeAny(l);
1529     shouldThrow();
1530     } catch (ExecutionException success) {
1531     assertTrue(success.getCause() instanceof NullPointerException);
1532     }
1533 dl 1.1 }
1534     }
1535    
1536     /**
1537     * invokeAny(c) returns result of some task
1538     */
1539 jsr166 1.5 public void testInvokeAny5() throws Exception {
1540 jsr166 1.80 final ExecutorService e =
1541     new CustomTPE(2, 2,
1542     LONG_DELAY_MS, MILLISECONDS,
1543     new ArrayBlockingQueue<Runnable>(10));
1544 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1545 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1546 dl 1.1 l.add(new StringTask());
1547     l.add(new StringTask());
1548     String result = e.invokeAny(l);
1549     assertSame(TEST_STRING, result);
1550     }
1551     }
1552    
1553     /**
1554     * invokeAll(null) throws NPE
1555     */
1556 jsr166 1.5 public void testInvokeAll1() throws Exception {
1557 jsr166 1.80 final ExecutorService e =
1558     new CustomTPE(2, 2,
1559     LONG_DELAY_MS, MILLISECONDS,
1560     new ArrayBlockingQueue<Runnable>(10));
1561 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1562     try {
1563     e.invokeAll(null);
1564     shouldThrow();
1565     } catch (NullPointerException success) {}
1566 dl 1.1 }
1567     }
1568    
1569     /**
1570     * invokeAll(empty collection) returns empty collection
1571     */
1572 jsr166 1.5 public void testInvokeAll2() throws Exception {
1573 jsr166 1.80 final ExecutorService e =
1574     new CustomTPE(2, 2,
1575     LONG_DELAY_MS, MILLISECONDS,
1576     new ArrayBlockingQueue<Runnable>(10));
1577 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1578 dl 1.1 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1579     assertTrue(r.isEmpty());
1580     }
1581     }
1582    
1583     /**
1584     * invokeAll(c) throws NPE if c has null elements
1585     */
1586 jsr166 1.5 public void testInvokeAll3() throws Exception {
1587 jsr166 1.80 final ExecutorService e =
1588     new CustomTPE(2, 2,
1589     LONG_DELAY_MS, MILLISECONDS,
1590     new ArrayBlockingQueue<Runnable>(10));
1591 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1592     List<Callable<String>> l = new ArrayList<Callable<String>>();
1593     l.add(new StringTask());
1594     l.add(null);
1595     try {
1596     e.invokeAll(l);
1597     shouldThrow();
1598     } catch (NullPointerException success) {}
1599 dl 1.1 }
1600     }
1601    
1602     /**
1603     * get of element of invokeAll(c) throws exception on failed task
1604     */
1605 jsr166 1.5 public void testInvokeAll4() throws Exception {
1606 jsr166 1.80 final ExecutorService e =
1607     new CustomTPE(2, 2,
1608     LONG_DELAY_MS, MILLISECONDS,
1609     new ArrayBlockingQueue<Runnable>(10));
1610 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1611     List<Callable<String>> l = new ArrayList<Callable<String>>();
1612     l.add(new NPETask());
1613     List<Future<String>> futures = e.invokeAll(l);
1614     assertEquals(1, futures.size());
1615     try {
1616     futures.get(0).get();
1617     shouldThrow();
1618     } catch (ExecutionException success) {
1619     assertTrue(success.getCause() instanceof NullPointerException);
1620     }
1621 dl 1.1 }
1622     }
1623    
1624     /**
1625     * invokeAll(c) returns results of all completed tasks
1626     */
1627 jsr166 1.5 public void testInvokeAll5() throws Exception {
1628 jsr166 1.80 final ExecutorService e =
1629     new CustomTPE(2, 2,
1630     LONG_DELAY_MS, MILLISECONDS,
1631     new ArrayBlockingQueue<Runnable>(10));
1632 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1633 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1634 dl 1.1 l.add(new StringTask());
1635     l.add(new StringTask());
1636 jsr166 1.17 List<Future<String>> futures = e.invokeAll(l);
1637     assertEquals(2, futures.size());
1638     for (Future<String> future : futures)
1639 jsr166 1.6 assertSame(TEST_STRING, future.get());
1640 dl 1.1 }
1641     }
1642    
1643     /**
1644     * timed invokeAny(null) throws NPE
1645     */
1646 jsr166 1.5 public void testTimedInvokeAny1() throws Exception {
1647 jsr166 1.80 final ExecutorService e =
1648     new CustomTPE(2, 2,
1649     LONG_DELAY_MS, MILLISECONDS,
1650     new ArrayBlockingQueue<Runnable>(10));
1651 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1652     try {
1653     e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1654     shouldThrow();
1655     } catch (NullPointerException success) {}
1656 dl 1.1 }
1657     }
1658    
1659     /**
1660     * timed invokeAny(,,null) throws NPE
1661     */
1662 jsr166 1.5 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1663 jsr166 1.80 final ExecutorService e =
1664     new CustomTPE(2, 2,
1665     LONG_DELAY_MS, MILLISECONDS,
1666     new ArrayBlockingQueue<Runnable>(10));
1667 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1668     List<Callable<String>> l = new ArrayList<Callable<String>>();
1669     l.add(new StringTask());
1670     try {
1671     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1672     shouldThrow();
1673     } catch (NullPointerException success) {}
1674 dl 1.1 }
1675     }
1676    
1677     /**
1678     * timed invokeAny(empty collection) throws IAE
1679     */
1680 jsr166 1.5 public void testTimedInvokeAny2() throws Exception {
1681 jsr166 1.80 final ExecutorService e =
1682     new CustomTPE(2, 2,
1683     LONG_DELAY_MS, MILLISECONDS,
1684     new ArrayBlockingQueue<Runnable>(10));
1685 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1686     try {
1687     e.invokeAny(new ArrayList<Callable<String>>(),
1688     MEDIUM_DELAY_MS, MILLISECONDS);
1689     shouldThrow();
1690     } catch (IllegalArgumentException success) {}
1691 dl 1.1 }
1692     }
1693    
1694     /**
1695     * timed invokeAny(c) throws NPE if c has null elements
1696     */
1697 jsr166 1.5 public void testTimedInvokeAny3() throws Exception {
1698 jsr166 1.17 CountDownLatch latch = new CountDownLatch(1);
1699 jsr166 1.80 final ExecutorService e =
1700     new CustomTPE(2, 2,
1701     LONG_DELAY_MS, MILLISECONDS,
1702     new ArrayBlockingQueue<Runnable>(10));
1703 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1704     List<Callable<String>> l = new ArrayList<Callable<String>>();
1705     l.add(latchAwaitingStringTask(latch));
1706     l.add(null);
1707     try {
1708     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1709     shouldThrow();
1710     } catch (NullPointerException success) {}
1711 jsr166 1.12 latch.countDown();
1712 dl 1.1 }
1713     }
1714    
1715     /**
1716     * timed invokeAny(c) throws ExecutionException if no task completes
1717     */
1718 jsr166 1.5 public void testTimedInvokeAny4() throws Exception {
1719 jsr166 1.80 final ExecutorService e =
1720     new CustomTPE(2, 2,
1721     LONG_DELAY_MS, MILLISECONDS,
1722     new ArrayBlockingQueue<Runnable>(10));
1723 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1724     List<Callable<String>> l = new ArrayList<Callable<String>>();
1725     l.add(new NPETask());
1726     try {
1727     e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1728     shouldThrow();
1729     } catch (ExecutionException success) {
1730     assertTrue(success.getCause() instanceof NullPointerException);
1731     }
1732 dl 1.1 }
1733     }
1734    
1735     /**
1736     * timed invokeAny(c) returns result of some task
1737     */
1738 jsr166 1.5 public void testTimedInvokeAny5() throws Exception {
1739 jsr166 1.80 final ExecutorService e =
1740     new CustomTPE(2, 2,
1741     LONG_DELAY_MS, MILLISECONDS,
1742     new ArrayBlockingQueue<Runnable>(10));
1743 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1744 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1745 dl 1.1 l.add(new StringTask());
1746     l.add(new StringTask());
1747 jsr166 1.9 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1748 dl 1.1 assertSame(TEST_STRING, result);
1749     }
1750     }
1751    
1752     /**
1753     * timed invokeAll(null) throws NPE
1754     */
1755 jsr166 1.5 public void testTimedInvokeAll1() throws Exception {
1756 jsr166 1.80 final ExecutorService e =
1757     new CustomTPE(2, 2,
1758     LONG_DELAY_MS, MILLISECONDS,
1759     new ArrayBlockingQueue<Runnable>(10));
1760 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1761     try {
1762     e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1763     shouldThrow();
1764     } catch (NullPointerException success) {}
1765 dl 1.1 }
1766     }
1767    
1768     /**
1769     * timed invokeAll(,,null) throws NPE
1770     */
1771 jsr166 1.5 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1772 jsr166 1.80 final ExecutorService e =
1773     new CustomTPE(2, 2,
1774     LONG_DELAY_MS, MILLISECONDS,
1775     new ArrayBlockingQueue<Runnable>(10));
1776 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1777     List<Callable<String>> l = new ArrayList<Callable<String>>();
1778     l.add(new StringTask());
1779     try {
1780     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1781     shouldThrow();
1782     } catch (NullPointerException success) {}
1783 dl 1.1 }
1784     }
1785    
1786     /**
1787     * timed invokeAll(empty collection) returns empty collection
1788     */
1789 jsr166 1.5 public void testTimedInvokeAll2() throws Exception {
1790 jsr166 1.80 final ExecutorService e =
1791     new CustomTPE(2, 2,
1792     LONG_DELAY_MS, MILLISECONDS,
1793     new ArrayBlockingQueue<Runnable>(10));
1794 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1795     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(),
1796     MEDIUM_DELAY_MS, MILLISECONDS);
1797 dl 1.1 assertTrue(r.isEmpty());
1798     }
1799     }
1800    
1801     /**
1802     * timed invokeAll(c) throws NPE if c has null elements
1803     */
1804 jsr166 1.5 public void testTimedInvokeAll3() throws Exception {
1805 jsr166 1.80 final ExecutorService e =
1806     new CustomTPE(2, 2,
1807     LONG_DELAY_MS, MILLISECONDS,
1808     new ArrayBlockingQueue<Runnable>(10));
1809 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1810     List<Callable<String>> l = new ArrayList<Callable<String>>();
1811     l.add(new StringTask());
1812     l.add(null);
1813     try {
1814     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1815     shouldThrow();
1816     } catch (NullPointerException success) {}
1817 dl 1.1 }
1818     }
1819    
1820     /**
1821     * get of element of invokeAll(c) throws exception on failed task
1822     */
1823 jsr166 1.5 public void testTimedInvokeAll4() throws Exception {
1824 jsr166 1.80 final ExecutorService e =
1825     new CustomTPE(2, 2,
1826     LONG_DELAY_MS, MILLISECONDS,
1827     new ArrayBlockingQueue<Runnable>(10));
1828 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1829     List<Callable<String>> l = new ArrayList<Callable<String>>();
1830     l.add(new NPETask());
1831     List<Future<String>> futures =
1832     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1833     assertEquals(1, futures.size());
1834     try {
1835     futures.get(0).get();
1836     shouldThrow();
1837     } catch (ExecutionException success) {
1838     assertTrue(success.getCause() instanceof NullPointerException);
1839     }
1840 dl 1.1 }
1841     }
1842    
1843     /**
1844     * timed invokeAll(c) returns results of all completed tasks
1845     */
1846 jsr166 1.5 public void testTimedInvokeAll5() throws Exception {
1847 jsr166 1.80 final ExecutorService e =
1848     new CustomTPE(2, 2,
1849     LONG_DELAY_MS, MILLISECONDS,
1850     new ArrayBlockingQueue<Runnable>(10));
1851 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1852 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1853 dl 1.1 l.add(new StringTask());
1854     l.add(new StringTask());
1855 jsr166 1.17 List<Future<String>> futures =
1856 jsr166 1.45 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1857 jsr166 1.17 assertEquals(2, futures.size());
1858     for (Future<String> future : futures)
1859 jsr166 1.6 assertSame(TEST_STRING, future.get());
1860 dl 1.1 }
1861     }
1862    
1863     /**
1864     * timed invokeAll(c) cancels tasks not completed by timeout
1865     */
1866 jsr166 1.5 public void testTimedInvokeAll6() throws Exception {
1867 jsr166 1.80 final ExecutorService e =
1868     new CustomTPE(2, 2,
1869     LONG_DELAY_MS, MILLISECONDS,
1870     new ArrayBlockingQueue<Runnable>(10));
1871 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1872 jsr166 1.39 for (long timeout = timeoutMillis();;) {
1873     List<Callable<String>> tasks = new ArrayList<>();
1874     tasks.add(new StringTask("0"));
1875     tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1876     tasks.add(new StringTask("2"));
1877     long startTime = System.nanoTime();
1878     List<Future<String>> futures =
1879     e.invokeAll(tasks, timeout, MILLISECONDS);
1880     assertEquals(tasks.size(), futures.size());
1881     assertTrue(millisElapsedSince(startTime) >= timeout);
1882     for (Future future : futures)
1883     assertTrue(future.isDone());
1884     assertTrue(futures.get(1).isCancelled());
1885     try {
1886     assertEquals("0", futures.get(0).get());
1887     assertEquals("2", futures.get(2).get());
1888     break;
1889     } catch (CancellationException retryWithLongerTimeout) {
1890     timeout *= 2;
1891     if (timeout >= LONG_DELAY_MS / 2)
1892     fail("expected exactly one task to be cancelled");
1893     }
1894     }
1895 dl 1.1 }
1896     }
1897    
1898     /**
1899     * Execution continues if there is at least one thread even if
1900     * thread factory fails to create more
1901     */
1902 jsr166 1.5 public void testFailingThreadFactory() throws InterruptedException {
1903 jsr166 1.21 final ExecutorService e =
1904     new CustomTPE(100, 100,
1905     LONG_DELAY_MS, MILLISECONDS,
1906     new LinkedBlockingQueue<Runnable>(),
1907     new FailingThreadFactory());
1908 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1909 jsr166 1.21 final int TASKS = 100;
1910     final CountDownLatch done = new CountDownLatch(TASKS);
1911     for (int k = 0; k < TASKS; ++k)
1912     e.execute(new CheckedRunnable() {
1913     public void realRun() {
1914     done.countDown();
1915     }});
1916     assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
1917 dl 1.1 }
1918     }
1919    
1920     /**
1921     * allowsCoreThreadTimeOut is by default false.
1922     */
1923     public void testAllowsCoreThreadTimeOut() {
1924 jsr166 1.80 final ThreadPoolExecutor p =
1925     new CustomTPE(2, 2,
1926     1000, MILLISECONDS,
1927     new ArrayBlockingQueue<Runnable>(10));
1928 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1929     assertFalse(p.allowsCoreThreadTimeOut());
1930     }
1931 dl 1.1 }
1932    
1933     /**
1934     * allowCoreThreadTimeOut(true) causes idle threads to time out
1935     */
1936 jsr166 1.21 public void testAllowCoreThreadTimeOut_true() throws Exception {
1937 jsr166 1.39 long keepAliveTime = timeoutMillis();
1938 jsr166 1.21 final ThreadPoolExecutor p =
1939     new CustomTPE(2, 10,
1940 jsr166 1.39 keepAliveTime, MILLISECONDS,
1941 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10));
1942 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1943     final CountDownLatch threadStarted = new CountDownLatch(1);
1944 jsr166 1.21 p.allowCoreThreadTimeOut(true);
1945     p.execute(new CheckedRunnable() {
1946 jsr166 1.39 public void realRun() {
1947 jsr166 1.21 threadStarted.countDown();
1948     assertEquals(1, p.getPoolSize());
1949     }});
1950 jsr166 1.29 await(threadStarted);
1951 jsr166 1.39 delay(keepAliveTime);
1952 jsr166 1.29 long startTime = System.nanoTime();
1953     while (p.getPoolSize() > 0
1954     && millisElapsedSince(startTime) < LONG_DELAY_MS)
1955     Thread.yield();
1956     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1957 jsr166 1.21 assertEquals(0, p.getPoolSize());
1958 dl 1.1 }
1959     }
1960    
1961     /**
1962     * allowCoreThreadTimeOut(false) causes idle threads not to time out
1963     */
1964 jsr166 1.21 public void testAllowCoreThreadTimeOut_false() throws Exception {
1965 jsr166 1.39 long keepAliveTime = timeoutMillis();
1966 jsr166 1.21 final ThreadPoolExecutor p =
1967     new CustomTPE(2, 10,
1968 jsr166 1.39 keepAliveTime, MILLISECONDS,
1969 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10));
1970 jsr166 1.82 try (PoolCleaner cleaner = cleaner(p)) {
1971     final CountDownLatch threadStarted = new CountDownLatch(1);
1972 jsr166 1.21 p.allowCoreThreadTimeOut(false);
1973     p.execute(new CheckedRunnable() {
1974     public void realRun() throws InterruptedException {
1975     threadStarted.countDown();
1976     assertTrue(p.getPoolSize() >= 1);
1977     }});
1978 jsr166 1.39 delay(2 * keepAliveTime);
1979 jsr166 1.21 assertTrue(p.getPoolSize() >= 1);
1980 dl 1.1 }
1981     }
1982    
1983 jsr166 1.44 /**
1984     * get(cancelled task) throws CancellationException
1985     * (in part, a test of CustomTPE itself)
1986     */
1987     public void testGet_cancelled() throws Exception {
1988     final ExecutorService e =
1989     new CustomTPE(1, 1,
1990     LONG_DELAY_MS, MILLISECONDS,
1991     new LinkedBlockingQueue<Runnable>());
1992 jsr166 1.82 try (PoolCleaner cleaner = cleaner(e)) {
1993 jsr166 1.44 final CountDownLatch blockerStarted = new CountDownLatch(1);
1994     final CountDownLatch done = new CountDownLatch(1);
1995     final List<Future<?>> futures = new ArrayList<>();
1996     for (int i = 0; i < 2; i++) {
1997     Runnable r = new CheckedRunnable() { public void realRun()
1998     throws Throwable {
1999     blockerStarted.countDown();
2000     assertTrue(done.await(2 * LONG_DELAY_MS, MILLISECONDS));
2001     }};
2002     futures.add(e.submit(r));
2003     }
2004     assertTrue(blockerStarted.await(LONG_DELAY_MS, MILLISECONDS));
2005     for (Future<?> future : futures) future.cancel(false);
2006     for (Future<?> future : futures) {
2007     try {
2008     future.get();
2009     shouldThrow();
2010     } catch (CancellationException success) {}
2011     try {
2012     future.get(LONG_DELAY_MS, MILLISECONDS);
2013     shouldThrow();
2014     } catch (CancellationException success) {}
2015     assertTrue(future.isCancelled());
2016     assertTrue(future.isDone());
2017     }
2018     done.countDown();
2019     }
2020     }
2021    
2022 dl 1.1 }