ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.76
Committed: Sun Oct 4 03:49:33 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.75: +18 -9 lines
Log Message:
improve testSaturatedExecute4

File Contents

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