ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.103
Committed: Sun Aug 11 22:29:27 2019 UTC (4 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.102: +1 -1 lines
Log Message:
more assertions; more interleavings

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