ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ThreadPoolExecutorTest.java (file contents):
Revision 1.2 by dl, Sun Sep 7 20:39:11 2003 UTC vs.
Revision 1.122 by jsr166, Sat Jul 15 18:42:01 2017 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines