ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.41
Committed: Mon Sep 28 02:41:29 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.40: +27 -11 lines
Log Message:
improve tests for shutdownNow

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