ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.61
Committed: Sun Oct 4 02:00:19 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.60: +9 -7 lines
Log Message:
improve testSetRejectedExecutionHandlerNull

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     final CountDownLatch threadStarted = new CountDownLatch(1);
256     final CountDownLatch done = new CountDownLatch(1);
257 jsr166 1.51 try (PoolCleaner cleaner = cleaner(p)) {
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     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
266     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.52 ThreadPoolExecutor p =
276     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.53 ThreadPoolExecutor p =
302     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     final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
484     final CountDownLatch done = new CountDownLatch(1);
485     try {
486     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     assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
495     assertEquals(THREADS, p.getLargestPoolSize());
496     } finally {
497     done.countDown();
498     joinPool(p);
499     assertEquals(THREADS, p.getLargestPoolSize());
500     }
501 dl 1.1 }
502 jsr166 1.2
503 dl 1.1 /**
504 jsr166 1.19 * getMaximumPoolSize returns value given in constructor if not
505     * otherwise set
506 dl 1.1 */
507     public void testGetMaximumPoolSize() {
508 jsr166 1.21 ThreadPoolExecutor p = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
509     assertEquals(2, p.getMaximumPoolSize());
510     joinPool(p);
511 dl 1.1 }
512 jsr166 1.2
513 dl 1.1 /**
514 jsr166 1.19 * getPoolSize increases, but doesn't overestimate, when threads
515     * become active
516 dl 1.1 */
517 jsr166 1.21 public void testGetPoolSize() throws InterruptedException {
518     final ThreadPoolExecutor p =
519     new CustomTPE(1, 1,
520     LONG_DELAY_MS, MILLISECONDS,
521     new ArrayBlockingQueue<Runnable>(10));
522     final CountDownLatch threadStarted = new CountDownLatch(1);
523     final CountDownLatch done = new CountDownLatch(1);
524     try {
525     assertEquals(0, p.getPoolSize());
526     p.execute(new CheckedRunnable() {
527     public void realRun() throws InterruptedException {
528     threadStarted.countDown();
529     assertEquals(1, p.getPoolSize());
530     done.await();
531     }});
532     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
533     assertEquals(1, p.getPoolSize());
534     } finally {
535     done.countDown();
536     joinPool(p);
537     }
538 dl 1.1 }
539 jsr166 1.2
540 dl 1.1 /**
541 jsr166 1.19 * getTaskCount increases, but doesn't overestimate, when tasks submitted
542 dl 1.1 */
543 jsr166 1.5 public void testGetTaskCount() throws InterruptedException {
544 jsr166 1.21 final ThreadPoolExecutor p =
545     new CustomTPE(1, 1,
546     LONG_DELAY_MS, MILLISECONDS,
547     new ArrayBlockingQueue<Runnable>(10));
548     final CountDownLatch threadStarted = new CountDownLatch(1);
549     final CountDownLatch done = new CountDownLatch(1);
550     try {
551     assertEquals(0, p.getTaskCount());
552     p.execute(new CheckedRunnable() {
553     public void realRun() throws InterruptedException {
554     threadStarted.countDown();
555     assertEquals(1, p.getTaskCount());
556     done.await();
557     }});
558     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
559     assertEquals(1, p.getTaskCount());
560     } finally {
561     done.countDown();
562     joinPool(p);
563     }
564 dl 1.1 }
565 jsr166 1.2
566 dl 1.1 /**
567 jsr166 1.28 * isShutdown is false before shutdown, true after
568 dl 1.1 */
569     public void testIsShutdown() {
570 jsr166 1.2
571 jsr166 1.21 ThreadPoolExecutor p = new CustomTPE(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
572     assertFalse(p.isShutdown());
573     try { p.shutdown(); } catch (SecurityException ok) { return; }
574     assertTrue(p.isShutdown());
575     joinPool(p);
576 dl 1.1 }
577    
578     /**
579 jsr166 1.19 * isTerminated is false before termination, true after
580 dl 1.1 */
581 jsr166 1.5 public void testIsTerminated() throws InterruptedException {
582 jsr166 1.21 final ThreadPoolExecutor p =
583     new CustomTPE(1, 1,
584     LONG_DELAY_MS, MILLISECONDS,
585     new ArrayBlockingQueue<Runnable>(10));
586     final CountDownLatch threadStarted = new CountDownLatch(1);
587     final CountDownLatch done = new CountDownLatch(1);
588     try {
589     assertFalse(p.isTerminating());
590     p.execute(new CheckedRunnable() {
591     public void realRun() throws InterruptedException {
592 jsr166 1.24 assertFalse(p.isTerminating());
593 jsr166 1.21 threadStarted.countDown();
594     done.await();
595     }});
596     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
597     assertFalse(p.isTerminating());
598     done.countDown();
599     } finally {
600     try { p.shutdown(); } catch (SecurityException ok) { return; }
601     }
602     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
603     assertTrue(p.isTerminated());
604     assertFalse(p.isTerminating());
605 dl 1.1 }
606    
607     /**
608 jsr166 1.19 * isTerminating is not true when running or when terminated
609 dl 1.1 */
610 jsr166 1.5 public void testIsTerminating() throws InterruptedException {
611 jsr166 1.21 final ThreadPoolExecutor p =
612     new CustomTPE(1, 1,
613     LONG_DELAY_MS, MILLISECONDS,
614     new ArrayBlockingQueue<Runnable>(10));
615     final CountDownLatch threadStarted = new CountDownLatch(1);
616     final CountDownLatch done = new CountDownLatch(1);
617     try {
618     assertFalse(p.isTerminating());
619     p.execute(new CheckedRunnable() {
620     public void realRun() throws InterruptedException {
621 jsr166 1.23 assertFalse(p.isTerminating());
622 jsr166 1.21 threadStarted.countDown();
623     done.await();
624     }});
625     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
626     assertFalse(p.isTerminating());
627     done.countDown();
628     } finally {
629     try { p.shutdown(); } catch (SecurityException ok) { return; }
630     }
631     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
632     assertTrue(p.isTerminated());
633     assertFalse(p.isTerminating());
634 dl 1.1 }
635    
636     /**
637     * getQueue returns the work queue, which contains queued tasks
638     */
639 jsr166 1.5 public void testGetQueue() throws InterruptedException {
640 jsr166 1.21 final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
641     final ThreadPoolExecutor p =
642     new CustomTPE(1, 1,
643     LONG_DELAY_MS, MILLISECONDS,
644     q);
645     final CountDownLatch threadStarted = new CountDownLatch(1);
646     final CountDownLatch done = new CountDownLatch(1);
647     try {
648     FutureTask[] tasks = new FutureTask[5];
649     for (int i = 0; i < tasks.length; i++) {
650     Callable task = new CheckedCallable<Boolean>() {
651     public Boolean realCall() throws InterruptedException {
652     threadStarted.countDown();
653     assertSame(q, p.getQueue());
654     done.await();
655     return Boolean.TRUE;
656     }};
657     tasks[i] = new FutureTask(task);
658     p.execute(tasks[i]);
659     }
660     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
661     assertSame(q, p.getQueue());
662     assertFalse(q.contains(tasks[0]));
663     assertTrue(q.contains(tasks[tasks.length - 1]));
664     assertEquals(tasks.length - 1, q.size());
665 dl 1.1 } finally {
666 jsr166 1.21 done.countDown();
667     joinPool(p);
668 dl 1.1 }
669     }
670    
671     /**
672     * remove(task) removes queued task, and fails to remove active task
673     */
674 jsr166 1.5 public void testRemove() throws InterruptedException {
675 dl 1.1 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
676 jsr166 1.21 final ThreadPoolExecutor p =
677     new CustomTPE(1, 1,
678     LONG_DELAY_MS, MILLISECONDS,
679     q);
680     Runnable[] tasks = new Runnable[6];
681     final CountDownLatch threadStarted = new CountDownLatch(1);
682     final CountDownLatch done = new CountDownLatch(1);
683     try {
684     for (int i = 0; i < tasks.length; i++) {
685     tasks[i] = new CheckedRunnable() {
686     public void realRun() throws InterruptedException {
687     threadStarted.countDown();
688     done.await();
689     }};
690     p.execute(tasks[i]);
691     }
692     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
693     assertFalse(p.remove(tasks[0]));
694 dl 1.1 assertTrue(q.contains(tasks[4]));
695     assertTrue(q.contains(tasks[3]));
696 jsr166 1.21 assertTrue(p.remove(tasks[4]));
697     assertFalse(p.remove(tasks[4]));
698 dl 1.1 assertFalse(q.contains(tasks[4]));
699     assertTrue(q.contains(tasks[3]));
700 jsr166 1.21 assertTrue(p.remove(tasks[3]));
701 dl 1.1 assertFalse(q.contains(tasks[3]));
702     } finally {
703 jsr166 1.21 done.countDown();
704     joinPool(p);
705 dl 1.1 }
706     }
707    
708     /**
709 jsr166 1.19 * purge removes cancelled tasks from the queue
710 dl 1.1 */
711 jsr166 1.21 public void testPurge() throws InterruptedException {
712     final CountDownLatch threadStarted = new CountDownLatch(1);
713     final CountDownLatch done = new CountDownLatch(1);
714     final BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
715     final ThreadPoolExecutor p =
716     new CustomTPE(1, 1,
717     LONG_DELAY_MS, MILLISECONDS,
718     q);
719 dl 1.1 FutureTask[] tasks = new FutureTask[5];
720 jsr166 1.21 try {
721     for (int i = 0; i < tasks.length; i++) {
722     Callable task = new CheckedCallable<Boolean>() {
723     public Boolean realCall() throws InterruptedException {
724     threadStarted.countDown();
725     done.await();
726     return Boolean.TRUE;
727     }};
728     tasks[i] = new FutureTask(task);
729     p.execute(tasks[i]);
730     }
731     assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
732     assertEquals(tasks.length, p.getTaskCount());
733     assertEquals(tasks.length - 1, q.size());
734     assertEquals(1L, p.getActiveCount());
735     assertEquals(0L, p.getCompletedTaskCount());
736     tasks[4].cancel(true);
737     tasks[3].cancel(false);
738     p.purge();
739     assertEquals(tasks.length - 3, q.size());
740     assertEquals(tasks.length - 2, p.getTaskCount());
741     p.purge(); // Nothing to do
742     assertEquals(tasks.length - 3, q.size());
743     assertEquals(tasks.length - 2, p.getTaskCount());
744     } finally {
745     done.countDown();
746     joinPool(p);
747     }
748 dl 1.1 }
749    
750     /**
751 jsr166 1.40 * shutdownNow returns a list containing tasks that were not run,
752     * and those tasks are drained from the queue
753 dl 1.1 */
754 jsr166 1.41 public void testShutdownNow() throws InterruptedException {
755     final int poolSize = 2;
756     final int count = 5;
757     final AtomicInteger ran = new AtomicInteger(0);
758     ThreadPoolExecutor p =
759     new CustomTPE(poolSize, poolSize, LONG_DELAY_MS, MILLISECONDS,
760     new ArrayBlockingQueue<Runnable>(10));
761     CountDownLatch threadsStarted = new CountDownLatch(poolSize);
762 jsr166 1.43 Runnable waiter = new CheckedRunnable() { public void realRun() {
763 jsr166 1.41 threadsStarted.countDown();
764 dl 1.1 try {
765 jsr166 1.41 MILLISECONDS.sleep(2 * LONG_DELAY_MS);
766     } catch (InterruptedException success) {}
767     ran.getAndIncrement();
768     }};
769     for (int i = 0; i < count; i++)
770     p.execute(waiter);
771     assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
772 jsr166 1.42 assertEquals(poolSize, p.getActiveCount());
773     assertEquals(0, p.getCompletedTaskCount());
774 jsr166 1.41 final List<Runnable> queuedTasks;
775     try {
776     queuedTasks = p.shutdownNow();
777     } catch (SecurityException ok) {
778     return; // Allowed in case test doesn't have privs
779 dl 1.1 }
780 jsr166 1.21 assertTrue(p.isShutdown());
781 jsr166 1.40 assertTrue(p.getQueue().isEmpty());
782 jsr166 1.41 assertEquals(count - poolSize, queuedTasks.size());
783     assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
784     assertTrue(p.isTerminated());
785     assertEquals(poolSize, ran.get());
786 jsr166 1.42 assertEquals(poolSize, p.getCompletedTaskCount());
787 dl 1.1 }
788    
789     // Exception Tests
790    
791 jsr166 1.2 /**
792     * Constructor throws if corePoolSize argument is less than zero
793 dl 1.1 */
794     public void testConstructor1() {
795     try {
796 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
797     new ArrayBlockingQueue<Runnable>(10));
798 dl 1.1 shouldThrow();
799 jsr166 1.5 } catch (IllegalArgumentException success) {}
800 dl 1.1 }
801 jsr166 1.2
802     /**
803     * Constructor throws if maximumPoolSize is less than zero
804 dl 1.1 */
805     public void testConstructor2() {
806     try {
807 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
808     new ArrayBlockingQueue<Runnable>(10));
809 dl 1.1 shouldThrow();
810 jsr166 1.5 } catch (IllegalArgumentException success) {}
811 dl 1.1 }
812 jsr166 1.2
813     /**
814     * Constructor throws if maximumPoolSize is equal to zero
815 dl 1.1 */
816     public void testConstructor3() {
817     try {
818 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
819     new ArrayBlockingQueue<Runnable>(10));
820 dl 1.1 shouldThrow();
821 jsr166 1.5 } catch (IllegalArgumentException success) {}
822 dl 1.1 }
823    
824 jsr166 1.2 /**
825     * Constructor throws if keepAliveTime is less than zero
826 dl 1.1 */
827     public void testConstructor4() {
828     try {
829 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
830     new ArrayBlockingQueue<Runnable>(10));
831 dl 1.1 shouldThrow();
832 jsr166 1.5 } catch (IllegalArgumentException success) {}
833 dl 1.1 }
834    
835 jsr166 1.2 /**
836     * Constructor throws if corePoolSize is greater than the maximumPoolSize
837 dl 1.1 */
838     public void testConstructor5() {
839     try {
840 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
841     new ArrayBlockingQueue<Runnable>(10));
842 dl 1.1 shouldThrow();
843 jsr166 1.5 } catch (IllegalArgumentException success) {}
844 dl 1.1 }
845 jsr166 1.2
846     /**
847     * Constructor throws if workQueue is set to null
848 dl 1.1 */
849     public void testConstructorNullPointerException() {
850     try {
851 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS, null);
852 dl 1.1 shouldThrow();
853 jsr166 1.5 } catch (NullPointerException success) {}
854 dl 1.1 }
855    
856 jsr166 1.2 /**
857     * Constructor throws if corePoolSize argument is less than zero
858 dl 1.1 */
859     public void testConstructor6() {
860     try {
861 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
862     new ArrayBlockingQueue<Runnable>(10),
863     new SimpleThreadFactory());
864 dl 1.1 shouldThrow();
865 jsr166 1.4 } catch (IllegalArgumentException success) {}
866 dl 1.1 }
867 jsr166 1.2
868     /**
869     * Constructor throws if maximumPoolSize is less than zero
870 dl 1.1 */
871     public void testConstructor7() {
872     try {
873 jsr166 1.36 new CustomTPE(1,-1, 1L, SECONDS,
874     new ArrayBlockingQueue<Runnable>(10),
875     new SimpleThreadFactory());
876 dl 1.1 shouldThrow();
877 jsr166 1.5 } catch (IllegalArgumentException success) {}
878 dl 1.1 }
879    
880 jsr166 1.2 /**
881     * Constructor throws if maximumPoolSize is equal to zero
882 dl 1.1 */
883     public void testConstructor8() {
884     try {
885 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
886     new ArrayBlockingQueue<Runnable>(10),
887     new SimpleThreadFactory());
888 dl 1.1 shouldThrow();
889 jsr166 1.5 } catch (IllegalArgumentException success) {}
890 dl 1.1 }
891    
892 jsr166 1.2 /**
893     * Constructor throws if keepAliveTime is less than zero
894 dl 1.1 */
895     public void testConstructor9() {
896     try {
897 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
898     new ArrayBlockingQueue<Runnable>(10),
899     new SimpleThreadFactory());
900 dl 1.1 shouldThrow();
901 jsr166 1.5 } catch (IllegalArgumentException success) {}
902 dl 1.1 }
903    
904 jsr166 1.2 /**
905     * Constructor throws if corePoolSize is greater than the maximumPoolSize
906 dl 1.1 */
907     public void testConstructor10() {
908     try {
909 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
910     new ArrayBlockingQueue<Runnable>(10),
911     new SimpleThreadFactory());
912 dl 1.1 shouldThrow();
913 jsr166 1.5 } catch (IllegalArgumentException success) {}
914 dl 1.1 }
915    
916 jsr166 1.2 /**
917     * Constructor throws if workQueue is set to null
918 dl 1.1 */
919     public void testConstructorNullPointerException2() {
920     try {
921 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS, null, new SimpleThreadFactory());
922 dl 1.1 shouldThrow();
923 jsr166 1.5 } catch (NullPointerException success) {}
924 dl 1.1 }
925    
926 jsr166 1.2 /**
927     * Constructor throws if threadFactory is set to null
928 dl 1.1 */
929     public void testConstructorNullPointerException3() {
930     try {
931 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
932     new ArrayBlockingQueue<Runnable>(10),
933     (ThreadFactory) null);
934 dl 1.1 shouldThrow();
935 jsr166 1.5 } catch (NullPointerException success) {}
936 dl 1.1 }
937 jsr166 1.2
938     /**
939     * Constructor throws if corePoolSize argument is less than zero
940 dl 1.1 */
941     public void testConstructor11() {
942     try {
943 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
944     new ArrayBlockingQueue<Runnable>(10),
945     new NoOpREHandler());
946 dl 1.1 shouldThrow();
947 jsr166 1.5 } catch (IllegalArgumentException success) {}
948 dl 1.1 }
949    
950 jsr166 1.2 /**
951     * Constructor throws if maximumPoolSize is less than zero
952 dl 1.1 */
953     public void testConstructor12() {
954     try {
955 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
956     new ArrayBlockingQueue<Runnable>(10),
957     new NoOpREHandler());
958 dl 1.1 shouldThrow();
959 jsr166 1.5 } catch (IllegalArgumentException success) {}
960 dl 1.1 }
961    
962 jsr166 1.2 /**
963     * Constructor throws if maximumPoolSize is equal to zero
964 dl 1.1 */
965     public void testConstructor13() {
966     try {
967 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
968     new ArrayBlockingQueue<Runnable>(10),
969     new NoOpREHandler());
970 dl 1.1 shouldThrow();
971 jsr166 1.5 } catch (IllegalArgumentException success) {}
972 dl 1.1 }
973    
974 jsr166 1.2 /**
975     * Constructor throws if keepAliveTime is less than zero
976 dl 1.1 */
977     public void testConstructor14() {
978     try {
979 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
980     new ArrayBlockingQueue<Runnable>(10),
981     new NoOpREHandler());
982 dl 1.1 shouldThrow();
983 jsr166 1.5 } catch (IllegalArgumentException success) {}
984 dl 1.1 }
985    
986 jsr166 1.2 /**
987     * Constructor throws if corePoolSize is greater than the maximumPoolSize
988 dl 1.1 */
989     public void testConstructor15() {
990     try {
991 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
992     new ArrayBlockingQueue<Runnable>(10),
993     new NoOpREHandler());
994 dl 1.1 shouldThrow();
995 jsr166 1.5 } catch (IllegalArgumentException success) {}
996 dl 1.1 }
997    
998 jsr166 1.2 /**
999     * Constructor throws if workQueue is set to null
1000 dl 1.1 */
1001     public void testConstructorNullPointerException4() {
1002     try {
1003 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1004     null,
1005     new NoOpREHandler());
1006 dl 1.1 shouldThrow();
1007 jsr166 1.5 } catch (NullPointerException success) {}
1008 dl 1.1 }
1009    
1010 jsr166 1.2 /**
1011     * Constructor throws if handler is set to null
1012 dl 1.1 */
1013     public void testConstructorNullPointerException5() {
1014     try {
1015 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1016     new ArrayBlockingQueue<Runnable>(10),
1017     (RejectedExecutionHandler) null);
1018 dl 1.1 shouldThrow();
1019 jsr166 1.5 } catch (NullPointerException success) {}
1020 dl 1.1 }
1021    
1022 jsr166 1.2 /**
1023     * Constructor throws if corePoolSize argument is less than zero
1024 dl 1.1 */
1025     public void testConstructor16() {
1026     try {
1027 jsr166 1.36 new CustomTPE(-1, 1, 1L, SECONDS,
1028     new ArrayBlockingQueue<Runnable>(10),
1029     new SimpleThreadFactory(),
1030     new NoOpREHandler());
1031 dl 1.1 shouldThrow();
1032 jsr166 1.5 } catch (IllegalArgumentException success) {}
1033 dl 1.1 }
1034    
1035 jsr166 1.2 /**
1036     * Constructor throws if maximumPoolSize is less than zero
1037 dl 1.1 */
1038     public void testConstructor17() {
1039     try {
1040 jsr166 1.36 new CustomTPE(1, -1, 1L, SECONDS,
1041     new ArrayBlockingQueue<Runnable>(10),
1042     new SimpleThreadFactory(),
1043     new NoOpREHandler());
1044 dl 1.1 shouldThrow();
1045 jsr166 1.5 } catch (IllegalArgumentException success) {}
1046 dl 1.1 }
1047    
1048 jsr166 1.2 /**
1049     * Constructor throws if maximumPoolSize is equal to zero
1050 dl 1.1 */
1051     public void testConstructor18() {
1052     try {
1053 jsr166 1.36 new CustomTPE(1, 0, 1L, SECONDS,
1054     new ArrayBlockingQueue<Runnable>(10),
1055     new SimpleThreadFactory(),
1056     new NoOpREHandler());
1057 dl 1.1 shouldThrow();
1058 jsr166 1.5 } catch (IllegalArgumentException success) {}
1059 dl 1.1 }
1060    
1061 jsr166 1.2 /**
1062     * Constructor throws if keepAliveTime is less than zero
1063 dl 1.1 */
1064     public void testConstructor19() {
1065     try {
1066 jsr166 1.36 new CustomTPE(1, 2, -1L, SECONDS,
1067     new ArrayBlockingQueue<Runnable>(10),
1068     new SimpleThreadFactory(),
1069     new NoOpREHandler());
1070 dl 1.1 shouldThrow();
1071 jsr166 1.5 } catch (IllegalArgumentException success) {}
1072 dl 1.1 }
1073    
1074 jsr166 1.2 /**
1075     * Constructor throws if corePoolSize is greater than the maximumPoolSize
1076 dl 1.1 */
1077     public void testConstructor20() {
1078     try {
1079 jsr166 1.36 new CustomTPE(2, 1, 1L, SECONDS,
1080     new ArrayBlockingQueue<Runnable>(10),
1081     new SimpleThreadFactory(),
1082     new NoOpREHandler());
1083 dl 1.1 shouldThrow();
1084 jsr166 1.5 } catch (IllegalArgumentException success) {}
1085 dl 1.1 }
1086    
1087 jsr166 1.2 /**
1088 jsr166 1.20 * Constructor throws if workQueue is null
1089 dl 1.1 */
1090     public void testConstructorNullPointerException6() {
1091     try {
1092 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1093     null,
1094     new SimpleThreadFactory(),
1095     new NoOpREHandler());
1096 dl 1.1 shouldThrow();
1097 jsr166 1.5 } catch (NullPointerException success) {}
1098 dl 1.1 }
1099    
1100 jsr166 1.2 /**
1101 jsr166 1.20 * Constructor throws if handler is null
1102 dl 1.1 */
1103     public void testConstructorNullPointerException7() {
1104     try {
1105 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1106     new ArrayBlockingQueue<Runnable>(10),
1107     new SimpleThreadFactory(),
1108     (RejectedExecutionHandler) null);
1109 dl 1.1 shouldThrow();
1110 jsr166 1.5 } catch (NullPointerException success) {}
1111 dl 1.1 }
1112    
1113 jsr166 1.2 /**
1114 jsr166 1.20 * Constructor throws if ThreadFactory is null
1115 dl 1.1 */
1116     public void testConstructorNullPointerException8() {
1117     try {
1118 jsr166 1.36 new CustomTPE(1, 2, 1L, SECONDS,
1119 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10),
1120     (ThreadFactory) null,
1121     new NoOpREHandler());
1122 dl 1.1 shouldThrow();
1123 jsr166 1.5 } catch (NullPointerException success) {}
1124 dl 1.1 }
1125 jsr166 1.2
1126 dl 1.1 /**
1127 jsr166 1.19 * execute throws RejectedExecutionException if saturated.
1128 dl 1.1 */
1129     public void testSaturatedExecute() {
1130 jsr166 1.21 ThreadPoolExecutor p =
1131     new CustomTPE(1, 1,
1132     LONG_DELAY_MS, MILLISECONDS,
1133     new ArrayBlockingQueue<Runnable>(1));
1134     final CountDownLatch done = new CountDownLatch(1);
1135     try {
1136     Runnable task = new CheckedRunnable() {
1137     public void realRun() throws InterruptedException {
1138     done.await();
1139     }};
1140     for (int i = 0; i < 2; ++i)
1141     p.execute(task);
1142     for (int i = 0; i < 2; ++i) {
1143     try {
1144     p.execute(task);
1145     shouldThrow();
1146     } catch (RejectedExecutionException success) {}
1147     assertTrue(p.getTaskCount() <= 2);
1148 dl 1.1 }
1149 jsr166 1.21 } finally {
1150     done.countDown();
1151     joinPool(p);
1152     }
1153 dl 1.1 }
1154    
1155     /**
1156 jsr166 1.19 * executor using CallerRunsPolicy runs task if saturated.
1157 dl 1.1 */
1158     public void testSaturatedExecute2() {
1159     RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
1160 jsr166 1.21 ThreadPoolExecutor p = new CustomTPE(1, 1,
1161     LONG_DELAY_MS, MILLISECONDS,
1162     new ArrayBlockingQueue<Runnable>(1),
1163     h);
1164 dl 1.1 try {
1165     TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1166 jsr166 1.21 for (int i = 0; i < tasks.length; ++i)
1167 dl 1.1 tasks[i] = new TrackedNoOpRunnable();
1168     TrackedLongRunnable mr = new TrackedLongRunnable();
1169     p.execute(mr);
1170 jsr166 1.21 for (int i = 0; i < tasks.length; ++i)
1171 dl 1.1 p.execute(tasks[i]);
1172 jsr166 1.21 for (int i = 1; i < tasks.length; ++i)
1173 dl 1.1 assertTrue(tasks[i].done);
1174 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1175 dl 1.1 } finally {
1176     joinPool(p);
1177     }
1178     }
1179    
1180     /**
1181 jsr166 1.19 * executor using DiscardPolicy drops task if saturated.
1182 dl 1.1 */
1183     public void testSaturatedExecute3() {
1184     RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
1185 jsr166 1.21 ThreadPoolExecutor p =
1186     new CustomTPE(1, 1,
1187     LONG_DELAY_MS, MILLISECONDS,
1188     new ArrayBlockingQueue<Runnable>(1),
1189     h);
1190 dl 1.1 try {
1191     TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1192 jsr166 1.21 for (int i = 0; i < tasks.length; ++i)
1193 dl 1.1 tasks[i] = new TrackedNoOpRunnable();
1194     p.execute(new TrackedLongRunnable());
1195 jsr166 1.21 for (TrackedNoOpRunnable task : tasks)
1196     p.execute(task);
1197     for (TrackedNoOpRunnable task : tasks)
1198     assertFalse(task.done);
1199 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1200 dl 1.1 } finally {
1201     joinPool(p);
1202     }
1203     }
1204    
1205     /**
1206 jsr166 1.19 * executor using DiscardOldestPolicy drops oldest task if saturated.
1207 dl 1.1 */
1208     public void testSaturatedExecute4() {
1209     RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
1210 jsr166 1.9 ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1211 dl 1.1 try {
1212     p.execute(new TrackedLongRunnable());
1213     TrackedLongRunnable r2 = new TrackedLongRunnable();
1214     p.execute(r2);
1215     assertTrue(p.getQueue().contains(r2));
1216     TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
1217     p.execute(r3);
1218     assertFalse(p.getQueue().contains(r2));
1219     assertTrue(p.getQueue().contains(r3));
1220 jsr166 1.3 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1221 dl 1.1 } finally {
1222     joinPool(p);
1223     }
1224     }
1225    
1226     /**
1227 jsr166 1.19 * execute throws RejectedExecutionException if shutdown
1228 dl 1.1 */
1229     public void testRejectedExecutionExceptionOnShutdown() {
1230 jsr166 1.21 ThreadPoolExecutor p =
1231 jsr166 1.9 new CustomTPE(1,1,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
1232 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1233 jsr166 1.8 try {
1234 jsr166 1.21 p.execute(new NoOpRunnable());
1235 jsr166 1.8 shouldThrow();
1236     } catch (RejectedExecutionException success) {}
1237 jsr166 1.2
1238 jsr166 1.21 joinPool(p);
1239 dl 1.1 }
1240    
1241     /**
1242 jsr166 1.19 * execute using CallerRunsPolicy drops task on shutdown
1243 dl 1.1 */
1244     public void testCallerRunsOnShutdown() {
1245     RejectedExecutionHandler h = new CustomTPE.CallerRunsPolicy();
1246 jsr166 1.9 ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1247 dl 1.1
1248 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1249 jsr166 1.8 try {
1250 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1251 jsr166 1.8 p.execute(r);
1252 dl 1.1 assertFalse(r.done);
1253     } finally {
1254     joinPool(p);
1255     }
1256     }
1257    
1258     /**
1259 jsr166 1.19 * execute using DiscardPolicy drops task on shutdown
1260 dl 1.1 */
1261     public void testDiscardOnShutdown() {
1262     RejectedExecutionHandler h = new CustomTPE.DiscardPolicy();
1263 jsr166 1.9 ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1264 dl 1.1
1265 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1266 jsr166 1.8 try {
1267 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1268 jsr166 1.8 p.execute(r);
1269 dl 1.1 assertFalse(r.done);
1270     } finally {
1271     joinPool(p);
1272     }
1273     }
1274    
1275     /**
1276 jsr166 1.19 * execute using DiscardOldestPolicy drops task on shutdown
1277 dl 1.1 */
1278     public void testDiscardOldestOnShutdown() {
1279     RejectedExecutionHandler h = new CustomTPE.DiscardOldestPolicy();
1280 jsr166 1.9 ThreadPoolExecutor p = new CustomTPE(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1281 dl 1.1
1282 jsr166 1.3 try { p.shutdown(); } catch (SecurityException ok) { return; }
1283 jsr166 1.8 try {
1284 dl 1.1 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1285 jsr166 1.8 p.execute(r);
1286 dl 1.1 assertFalse(r.done);
1287     } finally {
1288     joinPool(p);
1289     }
1290     }
1291    
1292     /**
1293 jsr166 1.18 * execute(null) throws NPE
1294 dl 1.1 */
1295     public void testExecuteNull() {
1296 jsr166 1.37 ThreadPoolExecutor p =
1297     new CustomTPE(1, 2, 1L, SECONDS,
1298     new ArrayBlockingQueue<Runnable>(10));
1299 dl 1.1 try {
1300 jsr166 1.21 p.execute(null);
1301 dl 1.1 shouldThrow();
1302 jsr166 1.8 } catch (NullPointerException success) {}
1303 jsr166 1.2
1304 jsr166 1.21 joinPool(p);
1305 dl 1.1 }
1306 jsr166 1.2
1307 dl 1.1 /**
1308 jsr166 1.19 * setCorePoolSize of negative value throws IllegalArgumentException
1309 dl 1.1 */
1310     public void testCorePoolSizeIllegalArgumentException() {
1311 jsr166 1.21 ThreadPoolExecutor p =
1312 jsr166 1.9 new CustomTPE(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1313 jsr166 1.8 try {
1314 jsr166 1.21 p.setCorePoolSize(-1);
1315 jsr166 1.8 shouldThrow();
1316     } catch (IllegalArgumentException success) {
1317 dl 1.1 } finally {
1318 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1319 dl 1.1 }
1320 jsr166 1.21 joinPool(p);
1321 jsr166 1.2 }
1322 dl 1.1
1323     /**
1324 jsr166 1.19 * setMaximumPoolSize(int) throws IllegalArgumentException
1325     * if given a value less the core pool size
1326 jsr166 1.2 */
1327 dl 1.1 public void testMaximumPoolSizeIllegalArgumentException() {
1328 jsr166 1.21 ThreadPoolExecutor p =
1329 jsr166 1.10 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1330 dl 1.1 try {
1331 jsr166 1.21 p.setMaximumPoolSize(1);
1332 dl 1.1 shouldThrow();
1333 jsr166 1.4 } catch (IllegalArgumentException success) {
1334 dl 1.1 } finally {
1335 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1336 dl 1.1 }
1337 jsr166 1.21 joinPool(p);
1338 dl 1.1 }
1339 jsr166 1.2
1340 dl 1.1 /**
1341 jsr166 1.19 * setMaximumPoolSize throws IllegalArgumentException
1342     * if given a negative value
1343 dl 1.1 */
1344     public void testMaximumPoolSizeIllegalArgumentException2() {
1345 jsr166 1.21 ThreadPoolExecutor p =
1346 jsr166 1.10 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1347 dl 1.1 try {
1348 jsr166 1.21 p.setMaximumPoolSize(-1);
1349 dl 1.1 shouldThrow();
1350 jsr166 1.4 } catch (IllegalArgumentException success) {
1351 dl 1.1 } finally {
1352 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1353 dl 1.1 }
1354 jsr166 1.21 joinPool(p);
1355 dl 1.1 }
1356 jsr166 1.2
1357 dl 1.1 /**
1358 jsr166 1.19 * setKeepAliveTime throws IllegalArgumentException
1359     * when given a negative value
1360 dl 1.1 */
1361     public void testKeepAliveTimeIllegalArgumentException() {
1362 jsr166 1.21 ThreadPoolExecutor p =
1363 jsr166 1.10 new CustomTPE(2,3,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1364 jsr166 1.2
1365 jsr166 1.8 try {
1366 jsr166 1.21 p.setKeepAliveTime(-1,MILLISECONDS);
1367 dl 1.1 shouldThrow();
1368 jsr166 1.4 } catch (IllegalArgumentException success) {
1369 dl 1.1 } finally {
1370 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1371 dl 1.1 }
1372 jsr166 1.21 joinPool(p);
1373 dl 1.1 }
1374    
1375     /**
1376     * terminated() is called on termination
1377     */
1378     public void testTerminated() {
1379 jsr166 1.21 CustomTPE p = new CustomTPE();
1380     try { p.shutdown(); } catch (SecurityException ok) { return; }
1381 jsr166 1.30 assertTrue(p.terminatedCalled());
1382 jsr166 1.21 joinPool(p);
1383 dl 1.1 }
1384    
1385     /**
1386     * beforeExecute and afterExecute are called when executing task
1387     */
1388 jsr166 1.5 public void testBeforeAfter() throws InterruptedException {
1389 jsr166 1.21 CustomTPE p = new CustomTPE();
1390 dl 1.1 try {
1391 jsr166 1.30 final CountDownLatch done = new CountDownLatch(1);
1392 jsr166 1.32 p.execute(new CheckedRunnable() {
1393 jsr166 1.30 public void realRun() {
1394     done.countDown();
1395 jsr166 1.32 }});
1396 jsr166 1.30 await(p.afterCalled);
1397     assertEquals(0, done.getCount());
1398     assertTrue(p.afterCalled());
1399     assertTrue(p.beforeCalled());
1400 jsr166 1.21 try { p.shutdown(); } catch (SecurityException ok) { return; }
1401 dl 1.1 } finally {
1402 jsr166 1.21 joinPool(p);
1403 dl 1.1 }
1404     }
1405    
1406     /**
1407     * completed submit of callable returns result
1408     */
1409 jsr166 1.5 public void testSubmitCallable() throws Exception {
1410 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1411 dl 1.1 try {
1412     Future<String> future = e.submit(new StringTask());
1413     String result = future.get();
1414     assertSame(TEST_STRING, result);
1415     } finally {
1416     joinPool(e);
1417     }
1418     }
1419    
1420     /**
1421     * completed submit of runnable returns successfully
1422     */
1423 jsr166 1.5 public void testSubmitRunnable() throws Exception {
1424 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1425 dl 1.1 try {
1426     Future<?> future = e.submit(new NoOpRunnable());
1427     future.get();
1428     assertTrue(future.isDone());
1429     } finally {
1430     joinPool(e);
1431     }
1432     }
1433    
1434     /**
1435     * completed submit of (runnable, result) returns result
1436     */
1437 jsr166 1.5 public void testSubmitRunnable2() throws Exception {
1438 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1439 dl 1.1 try {
1440     Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1441     String result = future.get();
1442     assertSame(TEST_STRING, result);
1443     } finally {
1444     joinPool(e);
1445     }
1446     }
1447    
1448     /**
1449     * invokeAny(null) throws NPE
1450     */
1451 jsr166 1.5 public void testInvokeAny1() throws Exception {
1452 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1453 dl 1.1 try {
1454     e.invokeAny(null);
1455 jsr166 1.5 shouldThrow();
1456 dl 1.1 } catch (NullPointerException success) {
1457     } finally {
1458     joinPool(e);
1459     }
1460     }
1461    
1462     /**
1463     * invokeAny(empty collection) throws IAE
1464     */
1465 jsr166 1.5 public void testInvokeAny2() throws Exception {
1466 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1467 dl 1.1 try {
1468     e.invokeAny(new ArrayList<Callable<String>>());
1469 jsr166 1.5 shouldThrow();
1470 dl 1.1 } catch (IllegalArgumentException success) {
1471     } finally {
1472     joinPool(e);
1473     }
1474     }
1475    
1476     /**
1477     * invokeAny(c) throws NPE if c has null elements
1478     */
1479 jsr166 1.5 public void testInvokeAny3() throws Exception {
1480 jsr166 1.17 CountDownLatch latch = new CountDownLatch(1);
1481 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1482 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1483     l.add(latchAwaitingStringTask(latch));
1484     l.add(null);
1485 dl 1.1 try {
1486     e.invokeAny(l);
1487 jsr166 1.5 shouldThrow();
1488 dl 1.1 } catch (NullPointerException success) {
1489     } finally {
1490 jsr166 1.5 latch.countDown();
1491 dl 1.1 joinPool(e);
1492     }
1493     }
1494    
1495     /**
1496     * invokeAny(c) throws ExecutionException if no task completes
1497     */
1498 jsr166 1.5 public void testInvokeAny4() throws Exception {
1499 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1500 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1501     l.add(new NPETask());
1502 dl 1.1 try {
1503     e.invokeAny(l);
1504 jsr166 1.5 shouldThrow();
1505 dl 1.1 } catch (ExecutionException success) {
1506 jsr166 1.13 assertTrue(success.getCause() instanceof NullPointerException);
1507 dl 1.1 } finally {
1508     joinPool(e);
1509     }
1510     }
1511    
1512     /**
1513     * invokeAny(c) returns result of some task
1514     */
1515 jsr166 1.5 public void testInvokeAny5() throws Exception {
1516 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1517 dl 1.1 try {
1518 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1519 dl 1.1 l.add(new StringTask());
1520     l.add(new StringTask());
1521     String result = e.invokeAny(l);
1522     assertSame(TEST_STRING, result);
1523     } finally {
1524     joinPool(e);
1525     }
1526     }
1527    
1528     /**
1529     * invokeAll(null) throws NPE
1530     */
1531 jsr166 1.5 public void testInvokeAll1() throws Exception {
1532 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1533 dl 1.1 try {
1534     e.invokeAll(null);
1535 jsr166 1.5 shouldThrow();
1536 dl 1.1 } catch (NullPointerException success) {
1537     } finally {
1538     joinPool(e);
1539     }
1540     }
1541    
1542     /**
1543     * invokeAll(empty collection) returns empty collection
1544     */
1545 jsr166 1.5 public void testInvokeAll2() throws Exception {
1546 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1547 dl 1.1 try {
1548     List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1549     assertTrue(r.isEmpty());
1550     } finally {
1551     joinPool(e);
1552     }
1553     }
1554    
1555     /**
1556     * invokeAll(c) throws NPE if c has null elements
1557     */
1558 jsr166 1.5 public void testInvokeAll3() throws Exception {
1559 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1560 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1561     l.add(new StringTask());
1562     l.add(null);
1563 dl 1.1 try {
1564     e.invokeAll(l);
1565 jsr166 1.5 shouldThrow();
1566 dl 1.1 } catch (NullPointerException success) {
1567     } finally {
1568     joinPool(e);
1569     }
1570     }
1571    
1572     /**
1573     * get of element of invokeAll(c) throws exception on failed task
1574     */
1575 jsr166 1.5 public void testInvokeAll4() 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 NPETask());
1579     List<Future<String>> futures = e.invokeAll(l);
1580     assertEquals(1, futures.size());
1581 dl 1.1 try {
1582 jsr166 1.17 futures.get(0).get();
1583 jsr166 1.5 shouldThrow();
1584 jsr166 1.3 } catch (ExecutionException success) {
1585 jsr166 1.15 assertTrue(success.getCause() instanceof NullPointerException);
1586 dl 1.1 } finally {
1587     joinPool(e);
1588     }
1589     }
1590    
1591     /**
1592     * invokeAll(c) returns results of all completed tasks
1593     */
1594 jsr166 1.5 public void testInvokeAll5() throws Exception {
1595 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1596 dl 1.1 try {
1597 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1598 dl 1.1 l.add(new StringTask());
1599     l.add(new StringTask());
1600 jsr166 1.17 List<Future<String>> futures = e.invokeAll(l);
1601     assertEquals(2, futures.size());
1602     for (Future<String> future : futures)
1603 jsr166 1.6 assertSame(TEST_STRING, future.get());
1604 dl 1.1 } finally {
1605     joinPool(e);
1606     }
1607     }
1608    
1609     /**
1610     * timed invokeAny(null) throws NPE
1611     */
1612 jsr166 1.5 public void testTimedInvokeAny1() throws Exception {
1613 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1614 dl 1.1 try {
1615 jsr166 1.9 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1616 jsr166 1.5 shouldThrow();
1617 dl 1.1 } catch (NullPointerException success) {
1618     } finally {
1619     joinPool(e);
1620     }
1621     }
1622    
1623     /**
1624     * timed invokeAny(,,null) throws NPE
1625     */
1626 jsr166 1.5 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1627 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1628 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1629     l.add(new StringTask());
1630 dl 1.1 try {
1631     e.invokeAny(l, MEDIUM_DELAY_MS, null);
1632 jsr166 1.5 shouldThrow();
1633 dl 1.1 } catch (NullPointerException success) {
1634     } finally {
1635     joinPool(e);
1636     }
1637     }
1638    
1639     /**
1640     * timed invokeAny(empty collection) throws IAE
1641     */
1642 jsr166 1.5 public void testTimedInvokeAny2() throws Exception {
1643 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1644 dl 1.1 try {
1645 jsr166 1.9 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1646 jsr166 1.5 shouldThrow();
1647 dl 1.1 } catch (IllegalArgumentException success) {
1648     } finally {
1649     joinPool(e);
1650     }
1651     }
1652    
1653     /**
1654     * timed invokeAny(c) throws NPE if c has null elements
1655     */
1656 jsr166 1.5 public void testTimedInvokeAny3() throws Exception {
1657 jsr166 1.17 CountDownLatch latch = new CountDownLatch(1);
1658 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1659 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1660     l.add(latchAwaitingStringTask(latch));
1661     l.add(null);
1662 dl 1.1 try {
1663 jsr166 1.9 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1664 jsr166 1.5 shouldThrow();
1665 dl 1.1 } catch (NullPointerException success) {
1666     } finally {
1667 jsr166 1.12 latch.countDown();
1668 dl 1.1 joinPool(e);
1669     }
1670     }
1671    
1672     /**
1673     * timed invokeAny(c) throws ExecutionException if no task completes
1674     */
1675 jsr166 1.5 public void testTimedInvokeAny4() throws Exception {
1676 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1677 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1678     l.add(new NPETask());
1679 dl 1.1 try {
1680 jsr166 1.9 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1681 jsr166 1.5 shouldThrow();
1682 jsr166 1.3 } catch (ExecutionException success) {
1683 jsr166 1.13 assertTrue(success.getCause() instanceof NullPointerException);
1684 dl 1.1 } finally {
1685     joinPool(e);
1686     }
1687     }
1688    
1689     /**
1690     * timed invokeAny(c) returns result of some task
1691     */
1692 jsr166 1.5 public void testTimedInvokeAny5() throws Exception {
1693 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1694 dl 1.1 try {
1695 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1696 dl 1.1 l.add(new StringTask());
1697     l.add(new StringTask());
1698 jsr166 1.9 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1699 dl 1.1 assertSame(TEST_STRING, result);
1700     } finally {
1701     joinPool(e);
1702     }
1703     }
1704    
1705     /**
1706     * timed invokeAll(null) throws NPE
1707     */
1708 jsr166 1.5 public void testTimedInvokeAll1() throws Exception {
1709 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1710 dl 1.1 try {
1711 jsr166 1.9 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1712 jsr166 1.5 shouldThrow();
1713 dl 1.1 } catch (NullPointerException success) {
1714     } finally {
1715     joinPool(e);
1716     }
1717     }
1718    
1719     /**
1720     * timed invokeAll(,,null) throws NPE
1721     */
1722 jsr166 1.5 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1723 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1724 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1725     l.add(new StringTask());
1726 dl 1.1 try {
1727     e.invokeAll(l, MEDIUM_DELAY_MS, null);
1728 jsr166 1.5 shouldThrow();
1729 dl 1.1 } catch (NullPointerException success) {
1730     } finally {
1731     joinPool(e);
1732     }
1733     }
1734    
1735     /**
1736     * timed invokeAll(empty collection) returns empty collection
1737     */
1738 jsr166 1.5 public void testTimedInvokeAll2() throws Exception {
1739 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1740 dl 1.1 try {
1741 jsr166 1.9 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1742 dl 1.1 assertTrue(r.isEmpty());
1743     } finally {
1744     joinPool(e);
1745     }
1746     }
1747    
1748     /**
1749     * timed invokeAll(c) throws NPE if c has null elements
1750     */
1751 jsr166 1.5 public void testTimedInvokeAll3() throws Exception {
1752 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1753 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1754     l.add(new StringTask());
1755     l.add(null);
1756 dl 1.1 try {
1757 jsr166 1.9 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1758 jsr166 1.5 shouldThrow();
1759 dl 1.1 } catch (NullPointerException success) {
1760     } finally {
1761     joinPool(e);
1762     }
1763     }
1764    
1765     /**
1766     * get of element of invokeAll(c) throws exception on failed task
1767     */
1768 jsr166 1.5 public void testTimedInvokeAll4() throws Exception {
1769 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1770 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1771     l.add(new NPETask());
1772     List<Future<String>> futures =
1773     e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1774     assertEquals(1, futures.size());
1775 dl 1.1 try {
1776 jsr166 1.17 futures.get(0).get();
1777 jsr166 1.5 shouldThrow();
1778 jsr166 1.3 } catch (ExecutionException success) {
1779 jsr166 1.6 assertTrue(success.getCause() instanceof NullPointerException);
1780 dl 1.1 } finally {
1781     joinPool(e);
1782     }
1783     }
1784    
1785     /**
1786     * timed invokeAll(c) returns results of all completed tasks
1787     */
1788 jsr166 1.5 public void testTimedInvokeAll5() throws Exception {
1789 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1790 dl 1.1 try {
1791 jsr166 1.17 List<Callable<String>> l = new ArrayList<Callable<String>>();
1792 dl 1.1 l.add(new StringTask());
1793     l.add(new StringTask());
1794 jsr166 1.17 List<Future<String>> futures =
1795 jsr166 1.45 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1796 jsr166 1.17 assertEquals(2, futures.size());
1797     for (Future<String> future : futures)
1798 jsr166 1.6 assertSame(TEST_STRING, future.get());
1799 dl 1.1 } finally {
1800     joinPool(e);
1801     }
1802     }
1803    
1804     /**
1805     * timed invokeAll(c) cancels tasks not completed by timeout
1806     */
1807 jsr166 1.5 public void testTimedInvokeAll6() throws Exception {
1808 jsr166 1.9 ExecutorService e = new CustomTPE(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1809 dl 1.1 try {
1810 jsr166 1.39 for (long timeout = timeoutMillis();;) {
1811     List<Callable<String>> tasks = new ArrayList<>();
1812     tasks.add(new StringTask("0"));
1813     tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1814     tasks.add(new StringTask("2"));
1815     long startTime = System.nanoTime();
1816     List<Future<String>> futures =
1817     e.invokeAll(tasks, timeout, MILLISECONDS);
1818     assertEquals(tasks.size(), futures.size());
1819     assertTrue(millisElapsedSince(startTime) >= timeout);
1820     for (Future future : futures)
1821     assertTrue(future.isDone());
1822     assertTrue(futures.get(1).isCancelled());
1823     try {
1824     assertEquals("0", futures.get(0).get());
1825     assertEquals("2", futures.get(2).get());
1826     break;
1827     } catch (CancellationException retryWithLongerTimeout) {
1828     timeout *= 2;
1829     if (timeout >= LONG_DELAY_MS / 2)
1830     fail("expected exactly one task to be cancelled");
1831     }
1832     }
1833 dl 1.1 } finally {
1834     joinPool(e);
1835     }
1836     }
1837    
1838     /**
1839     * Execution continues if there is at least one thread even if
1840     * thread factory fails to create more
1841     */
1842 jsr166 1.5 public void testFailingThreadFactory() throws InterruptedException {
1843 jsr166 1.21 final ExecutorService e =
1844     new CustomTPE(100, 100,
1845     LONG_DELAY_MS, MILLISECONDS,
1846     new LinkedBlockingQueue<Runnable>(),
1847     new FailingThreadFactory());
1848     try {
1849     final int TASKS = 100;
1850     final CountDownLatch done = new CountDownLatch(TASKS);
1851     for (int k = 0; k < TASKS; ++k)
1852     e.execute(new CheckedRunnable() {
1853     public void realRun() {
1854     done.countDown();
1855     }});
1856     assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
1857 dl 1.1 } finally {
1858     joinPool(e);
1859     }
1860     }
1861    
1862     /**
1863     * allowsCoreThreadTimeOut is by default false.
1864     */
1865     public void testAllowsCoreThreadTimeOut() {
1866 jsr166 1.21 ThreadPoolExecutor p = new CustomTPE(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1867     assertFalse(p.allowsCoreThreadTimeOut());
1868     joinPool(p);
1869 dl 1.1 }
1870    
1871     /**
1872     * allowCoreThreadTimeOut(true) causes idle threads to time out
1873     */
1874 jsr166 1.21 public void testAllowCoreThreadTimeOut_true() throws Exception {
1875 jsr166 1.39 long keepAliveTime = timeoutMillis();
1876 jsr166 1.21 final ThreadPoolExecutor p =
1877     new CustomTPE(2, 10,
1878 jsr166 1.39 keepAliveTime, MILLISECONDS,
1879 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10));
1880     final CountDownLatch threadStarted = new CountDownLatch(1);
1881     try {
1882     p.allowCoreThreadTimeOut(true);
1883     p.execute(new CheckedRunnable() {
1884 jsr166 1.39 public void realRun() {
1885 jsr166 1.21 threadStarted.countDown();
1886     assertEquals(1, p.getPoolSize());
1887     }});
1888 jsr166 1.29 await(threadStarted);
1889 jsr166 1.39 delay(keepAliveTime);
1890 jsr166 1.29 long startTime = System.nanoTime();
1891     while (p.getPoolSize() > 0
1892     && millisElapsedSince(startTime) < LONG_DELAY_MS)
1893     Thread.yield();
1894     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1895 jsr166 1.21 assertEquals(0, p.getPoolSize());
1896 dl 1.1 } finally {
1897 jsr166 1.21 joinPool(p);
1898 dl 1.1 }
1899     }
1900    
1901     /**
1902     * allowCoreThreadTimeOut(false) causes idle threads not to time out
1903     */
1904 jsr166 1.21 public void testAllowCoreThreadTimeOut_false() throws Exception {
1905 jsr166 1.39 long keepAliveTime = timeoutMillis();
1906 jsr166 1.21 final ThreadPoolExecutor p =
1907     new CustomTPE(2, 10,
1908 jsr166 1.39 keepAliveTime, MILLISECONDS,
1909 jsr166 1.21 new ArrayBlockingQueue<Runnable>(10));
1910     final CountDownLatch threadStarted = new CountDownLatch(1);
1911     try {
1912     p.allowCoreThreadTimeOut(false);
1913     p.execute(new CheckedRunnable() {
1914     public void realRun() throws InterruptedException {
1915     threadStarted.countDown();
1916     assertTrue(p.getPoolSize() >= 1);
1917     }});
1918 jsr166 1.39 delay(2 * keepAliveTime);
1919 jsr166 1.21 assertTrue(p.getPoolSize() >= 1);
1920 dl 1.1 } finally {
1921 jsr166 1.21 joinPool(p);
1922 dl 1.1 }
1923     }
1924    
1925 jsr166 1.44 /**
1926     * get(cancelled task) throws CancellationException
1927     * (in part, a test of CustomTPE itself)
1928     */
1929     public void testGet_cancelled() throws Exception {
1930     final ExecutorService e =
1931     new CustomTPE(1, 1,
1932     LONG_DELAY_MS, MILLISECONDS,
1933     new LinkedBlockingQueue<Runnable>());
1934     try {
1935     final CountDownLatch blockerStarted = new CountDownLatch(1);
1936     final CountDownLatch done = new CountDownLatch(1);
1937     final List<Future<?>> futures = new ArrayList<>();
1938     for (int i = 0; i < 2; i++) {
1939     Runnable r = new CheckedRunnable() { public void realRun()
1940     throws Throwable {
1941     blockerStarted.countDown();
1942     assertTrue(done.await(2 * LONG_DELAY_MS, MILLISECONDS));
1943     }};
1944     futures.add(e.submit(r));
1945     }
1946     assertTrue(blockerStarted.await(LONG_DELAY_MS, MILLISECONDS));
1947     for (Future<?> future : futures) future.cancel(false);
1948     for (Future<?> future : futures) {
1949     try {
1950     future.get();
1951     shouldThrow();
1952     } catch (CancellationException success) {}
1953     try {
1954     future.get(LONG_DELAY_MS, MILLISECONDS);
1955     shouldThrow();
1956     } catch (CancellationException success) {}
1957     assertTrue(future.isCancelled());
1958     assertTrue(future.isDone());
1959     }
1960     done.countDown();
1961     } finally {
1962     joinPool(e);
1963     }
1964     }
1965    
1966 dl 1.1 }