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.3 by dl, Sun Sep 14 20:42:41 2003 UTC vs.
Revision 1.28 by jsr166, Wed Nov 18 16:13:11 2009 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/licenses/publicdomain
5 > * Other contributors include Andrew Wright, Jeffrey Hayes,
6 > * Pat Fisher, Mike Judd.
7   */
8  
9   import java.util.concurrent.*;
10 + import static java.util.concurrent.TimeUnit.MILLISECONDS;
11 + import java.util.concurrent.atomic.*;
12   import junit.framework.*;
13 < import java.util.List;
13 > import java.util.*;
14  
15   public class ThreadPoolExecutorTest extends JSR166TestCase {
16      public static void main(String[] args) {
17 <        junit.textui.TestRunner.run (suite());  
17 >        junit.textui.TestRunner.run (suite());
18      }
19      public static Test suite() {
20          return new TestSuite(ThreadPoolExecutorTest.class);
21      }
22 <    
22 >
23 >    static class ExtendedTPE extends ThreadPoolExecutor {
24 >        volatile boolean beforeCalled = false;
25 >        volatile boolean afterCalled = false;
26 >        volatile boolean terminatedCalled = false;
27 >        public ExtendedTPE() {
28 >            super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
29 >        }
30 >        protected void beforeExecute(Thread t, Runnable r) {
31 >            beforeCalled = true;
32 >        }
33 >        protected void afterExecute(Runnable r, Throwable t) {
34 >            afterCalled = true;
35 >        }
36 >        protected void terminated() {
37 >            terminatedCalled = true;
38 >        }
39 >    }
40 >
41 >    static class FailingThreadFactory implements ThreadFactory {
42 >        int calls = 0;
43 >        public Thread newThread(Runnable r) {
44 >            if (++calls > 1) return null;
45 >            return new Thread(r);
46 >        }
47 >    }
48 >
49 >
50      /**
51 <     * For use as ThreadFactory in constructors
51 >     *  execute successfully executes a runnable
52       */
53 <    static class MyThreadFactory implements ThreadFactory{
54 <        public Thread newThread(Runnable r){
55 <            return new Thread(r);
56 <        }  
53 >    public void testExecute() throws InterruptedException {
54 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
55 >        try {
56 >            p1.execute(new ShortRunnable());
57 >            Thread.sleep(SMALL_DELAY_MS);
58 >        } finally {
59 >            joinPool(p1);
60 >        }
61      }
62  
63      /**
64 <     * For use as RejectedExecutionHandler in constructors
64 >     *  getActiveCount increases but doesn't overestimate, when a
65 >     *  thread becomes active
66       */
67 <    static class MyREHandler implements RejectedExecutionHandler{
68 <        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor){}
67 >    public void testGetActiveCount() throws InterruptedException {
68 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
69 >        assertEquals(0, p2.getActiveCount());
70 >        p2.execute(new MediumRunnable());
71 >        Thread.sleep(SHORT_DELAY_MS);
72 >        assertEquals(1, p2.getActiveCount());
73 >        joinPool(p2);
74      }
75 <
75 >
76      /**
77 <     *   execute successfully executes a runnable
77 >     *  prestartCoreThread starts a thread if under corePoolSize, else doesn't
78       */
79 <    public void testExecute(){
80 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
81 <        try {
82 <            one.execute(new Runnable(){
83 <                    public void run(){
84 <                        try{
85 <                            Thread.sleep(SHORT_DELAY_MS);
86 <                        } catch(InterruptedException e){
87 <                            fail("unexpected exception");
88 <                        }
49 <                    }
50 <                });
51 <            Thread.sleep(SMALL_DELAY_MS);
52 <        } catch(InterruptedException e){
53 <            fail("unexpected exception");
54 <        }
55 <        joinPool(one);
79 >    public void testPrestartCoreThread() {
80 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
81 >        assertEquals(0, p2.getPoolSize());
82 >        assertTrue(p2.prestartCoreThread());
83 >        assertEquals(1, p2.getPoolSize());
84 >        assertTrue(p2.prestartCoreThread());
85 >        assertEquals(2, p2.getPoolSize());
86 >        assertFalse(p2.prestartCoreThread());
87 >        assertEquals(2, p2.getPoolSize());
88 >        joinPool(p2);
89      }
90  
91      /**
92 <     *   getActiveCount gives correct values
92 >     *  prestartAllCoreThreads starts all corePoolSize threads
93       */
94 <    public void testGetActiveCount(){
95 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
96 <        assertEquals(0, two.getActiveCount());
97 <        two.execute(new MediumRunnable());
98 <        try{
99 <            Thread.sleep(SHORT_DELAY_MS);
100 <        } catch(Exception e){
101 <            fail("unexpected exception");
69 <        }
70 <        assertEquals(1, two.getActiveCount());
71 <        joinPool(two);
94 >    public void testPrestartAllCoreThreads() {
95 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
96 >        assertEquals(0, p2.getPoolSize());
97 >        p2.prestartAllCoreThreads();
98 >        assertEquals(2, p2.getPoolSize());
99 >        p2.prestartAllCoreThreads();
100 >        assertEquals(2, p2.getPoolSize());
101 >        joinPool(p2);
102      }
103 <    
103 >
104      /**
105 <     *   getCompleteTaskCount gives correct values
105 >     *   getCompletedTaskCount increases, but doesn't overestimate,
106 >     *   when tasks complete
107       */
108 <    public void testGetCompletedTaskCount(){
109 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
110 <        assertEquals(0, two.getCompletedTaskCount());
111 <        two.execute(new ShortRunnable());
112 <        try{
113 <            Thread.sleep(MEDIUM_DELAY_MS);
114 <        } catch(Exception e){
115 <            fail("unexpected exception");
108 >    public void testGetCompletedTaskCount() throws InterruptedException {
109 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
110 >        assertEquals(0, p2.getCompletedTaskCount());
111 >        p2.execute(new ShortRunnable());
112 >        Thread.sleep(SMALL_DELAY_MS);
113 >        assertEquals(1, p2.getCompletedTaskCount());
114 >        try { p2.shutdown(); } catch (SecurityException ok) { return; }
115 >        joinPool(p2);
116 >    }
117 >
118 >    /**
119 >     *   getCorePoolSize returns size given in constructor if not otherwise set
120 >     */
121 >    public void testGetCorePoolSize() {
122 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
123 >        assertEquals(1, p1.getCorePoolSize());
124 >        joinPool(p1);
125 >    }
126 >
127 >    /**
128 >     *   getKeepAliveTime returns value given in constructor if not otherwise set
129 >     */
130 >    public void testGetKeepAliveTime() {
131 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
132 >        assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
133 >        joinPool(p2);
134 >    }
135 >
136 >
137 >    /**
138 >     * getThreadFactory returns factory in constructor if not set
139 >     */
140 >    public void testGetThreadFactory() {
141 >        ThreadFactory tf = new SimpleThreadFactory();
142 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), tf, new NoOpREHandler());
143 >        assertSame(tf, p.getThreadFactory());
144 >        joinPool(p);
145 >    }
146 >
147 >    /**
148 >     * setThreadFactory sets the thread factory returned by getThreadFactory
149 >     */
150 >    public void testSetThreadFactory() {
151 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
152 >        ThreadFactory tf = new SimpleThreadFactory();
153 >        p.setThreadFactory(tf);
154 >        assertSame(tf, p.getThreadFactory());
155 >        joinPool(p);
156 >    }
157 >
158 >
159 >    /**
160 >     * setThreadFactory(null) throws NPE
161 >     */
162 >    public void testSetThreadFactoryNull() {
163 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
164 >        try {
165 >            p.setThreadFactory(null);
166 >            shouldThrow();
167 >        } catch (NullPointerException success) {
168 >        } finally {
169 >            joinPool(p);
170          }
86        assertEquals(1, two.getCompletedTaskCount());
87        two.shutdown();
88        joinPool(two);
171      }
172 <    
172 >
173      /**
174 <     *   getCorePoolSize gives correct values
174 >     * getRejectedExecutionHandler returns handler in constructor if not set
175       */
176 <    public void testGetCorePoolSize(){
177 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
178 <        assertEquals(1, one.getCorePoolSize());
179 <        joinPool(one);
176 >    public void testGetRejectedExecutionHandler() {
177 >        RejectedExecutionHandler h = new NoOpREHandler();
178 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), h);
179 >        assertSame(h, p.getRejectedExecutionHandler());
180 >        joinPool(p);
181      }
182 <    
182 >
183      /**
184 <     *   getKeepAliveTime gives correct values
184 >     * setRejectedExecutionHandler sets the handler returned by
185 >     * getRejectedExecutionHandler
186       */
187 <    public void testGetKeepAliveTime(){
188 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
189 <        assertEquals(1, two.getKeepAliveTime(TimeUnit.SECONDS));
190 <        joinPool(two);
187 >    public void testSetRejectedExecutionHandler() {
188 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
189 >        RejectedExecutionHandler h = new NoOpREHandler();
190 >        p.setRejectedExecutionHandler(h);
191 >        assertSame(h, p.getRejectedExecutionHandler());
192 >        joinPool(p);
193      }
194 <    
194 >
195 >
196      /**
197 <     *   getLargestPoolSize gives correct values
197 >     * setRejectedExecutionHandler(null) throws NPE
198       */
199 <    public void testGetLargestPoolSize(){
200 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
199 >    public void testSetRejectedExecutionHandlerNull() {
200 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
201          try {
202 <            assertEquals(0, two.getLargestPoolSize());
203 <            two.execute(new MediumRunnable());
204 <            two.execute(new MediumRunnable());
205 <            Thread.sleep(SHORT_DELAY_MS);
206 <            assertEquals(2, two.getLargestPoolSize());
207 <        } catch(Exception e){
208 <            fail("unexpected exception");
209 <        }
210 <        joinPool(two);
202 >            p.setRejectedExecutionHandler(null);
203 >            shouldThrow();
204 >        } catch (NullPointerException success) {
205 >        } finally {
206 >            joinPool(p);
207 >        }
208 >    }
209 >
210 >
211 >    /**
212 >     *   getLargestPoolSize increases, but doesn't overestimate, when
213 >     *   multiple threads active
214 >     */
215 >    public void testGetLargestPoolSize() throws InterruptedException {
216 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
217 >        assertEquals(0, p2.getLargestPoolSize());
218 >        p2.execute(new MediumRunnable());
219 >        p2.execute(new MediumRunnable());
220 >        Thread.sleep(SHORT_DELAY_MS);
221 >        assertEquals(2, p2.getLargestPoolSize());
222 >        joinPool(p2);
223      }
224 <    
224 >
225      /**
226 <     *   getMaximumPoolSize gives correct values
226 >     *   getMaximumPoolSize returns value given in constructor if not
227 >     *   otherwise set
228       */
229 <    public void testGetMaximumPoolSize(){
230 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
231 <        assertEquals(2, two.getMaximumPoolSize());
232 <        joinPool(two);
229 >    public void testGetMaximumPoolSize() {
230 >        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
231 >        assertEquals(2, p2.getMaximumPoolSize());
232 >        joinPool(p2);
233      }
234 <    
234 >
235      /**
236 <     *   getPoolSize gives correct values
236 >     *   getPoolSize increases, but doesn't overestimate, when threads
237 >     *   become active
238       */
239 <    public void testGetPoolSize(){
240 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
241 <        assertEquals(0, one.getPoolSize());
242 <        one.execute(new MediumRunnable());
243 <        assertEquals(1, one.getPoolSize());
244 <        joinPool(one);
239 >    public void testGetPoolSize() {
240 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
241 >        assertEquals(0, p1.getPoolSize());
242 >        p1.execute(new MediumRunnable());
243 >        assertEquals(1, p1.getPoolSize());
244 >        joinPool(p1);
245      }
246 <    
246 >
247      /**
248 <     *   getTaskCount gives correct values
248 >     *  getTaskCount increases, but doesn't overestimate, when tasks submitted
249       */
250 <    public void testGetTaskCount(){
251 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
250 >    public void testGetTaskCount() throws InterruptedException {
251 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
252 >        assertEquals(0, p1.getTaskCount());
253 >        p1.execute(new MediumRunnable());
254 >        Thread.sleep(SHORT_DELAY_MS);
255 >        assertEquals(1, p1.getTaskCount());
256 >        joinPool(p1);
257 >    }
258 >
259 >    /**
260 >     *   isShutDown is false before shutdown, true after
261 >     */
262 >    public void testIsShutdown() {
263 >
264 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
265 >        assertFalse(p1.isShutdown());
266 >        try { p1.shutdown(); } catch (SecurityException ok) { return; }
267 >        assertTrue(p1.isShutdown());
268 >        joinPool(p1);
269 >    }
270 >
271 >
272 >    /**
273 >     *  isTerminated is false before termination, true after
274 >     */
275 >    public void testIsTerminated() throws InterruptedException {
276 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
277 >        assertFalse(p1.isTerminated());
278          try {
279 <            assertEquals(0, one.getTaskCount());
280 <            for(int i = 0; i < 5; i++)
281 <                one.execute(new MediumRunnable());
282 <            Thread.sleep(SHORT_DELAY_MS);
283 <            assertEquals(5, one.getTaskCount());
284 <        } catch(Exception e){
158 <            fail("unexpected exception");
159 <        }
160 <        joinPool(one);
279 >            p1.execute(new MediumRunnable());
280 >        } finally {
281 >            try { p1.shutdown(); } catch (SecurityException ok) { return; }
282 >        }
283 >        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
284 >        assertTrue(p1.isTerminated());
285      }
286 <    
286 >
287      /**
288 <     *   isShutDown gives correct values
288 >     *  isTerminating is not true when running or when terminated
289       */
290 <    public void testIsShutdown(){
291 <        
292 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
293 <        assertFalse(one.isShutdown());
294 <        one.shutdown();
295 <        assertTrue(one.isShutdown());
296 <        joinPool(one);
290 >    public void testIsTerminating() throws InterruptedException {
291 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
292 >        assertFalse(p1.isTerminating());
293 >        try {
294 >            p1.execute(new SmallRunnable());
295 >            assertFalse(p1.isTerminating());
296 >        } finally {
297 >            try { p1.shutdown(); } catch (SecurityException ok) { return; }
298 >        }
299 >        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
300 >        assertTrue(p1.isTerminated());
301 >        assertFalse(p1.isTerminating());
302      }
303  
175        
304      /**
305 <     *   isTerminated gives correct values
178 <     *  Makes sure termination does not take an innapropriate
179 <     *  amount of time
305 >     * getQueue returns the work queue, which contains queued tasks
306       */
307 <    public void testIsTerminated(){
308 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
307 >    public void testGetQueue() throws InterruptedException {
308 >        BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
309 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
310 >        FutureTask[] tasks = new FutureTask[5];
311 >        for (int i = 0; i < 5; i++) {
312 >            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
313 >            p1.execute(tasks[i]);
314 >        }
315          try {
316 <            one.execute(new MediumRunnable());
316 >            Thread.sleep(SHORT_DELAY_MS);
317 >            BlockingQueue<Runnable> wq = p1.getQueue();
318 >            assertSame(q, wq);
319 >            assertFalse(wq.contains(tasks[0]));
320 >            assertTrue(wq.contains(tasks[4]));
321 >            for (int i = 1; i < 5; ++i)
322 >                tasks[i].cancel(true);
323 >            p1.shutdownNow();
324          } finally {
325 <            one.shutdown();
325 >            joinPool(p1);
326 >        }
327 >    }
328 >
329 >    /**
330 >     * remove(task) removes queued task, and fails to remove active task
331 >     */
332 >    public void testRemove() throws InterruptedException {
333 >        BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
334 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
335 >        FutureTask[] tasks = new FutureTask[5];
336 >        for (int i = 0; i < 5; i++) {
337 >            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
338 >            p1.execute(tasks[i]);
339 >        }
340 >        try {
341 >            Thread.sleep(SHORT_DELAY_MS);
342 >            assertFalse(p1.remove(tasks[0]));
343 >            assertTrue(q.contains(tasks[4]));
344 >            assertTrue(q.contains(tasks[3]));
345 >            assertTrue(p1.remove(tasks[4]));
346 >            assertFalse(p1.remove(tasks[4]));
347 >            assertFalse(q.contains(tasks[4]));
348 >            assertTrue(q.contains(tasks[3]));
349 >            assertTrue(p1.remove(tasks[3]));
350 >            assertFalse(q.contains(tasks[3]));
351 >        } finally {
352 >            joinPool(p1);
353          }
188        try {
189            assertTrue(one.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
190            assertTrue(one.isTerminated());
191        } catch(Exception e){
192            fail("unexpected exception");
193        }      
354      }
355  
356      /**
357 <     *   purge correctly removes cancelled tasks
358 <     *  from the queue
359 <     */
360 <    public void testPurge(){
361 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
362 <        CancellableTask[] tasks = new CancellableTask[5];
363 <        for(int i = 0; i < 5; i++){
364 <            tasks[i] = new CancellableTask(new MediumPossiblyInterruptedRunnable());
205 <            one.execute(tasks[i]);
357 >     *   purge removes cancelled tasks from the queue
358 >     */
359 >    public void testPurge() {
360 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
361 >        FutureTask[] tasks = new FutureTask[5];
362 >        for (int i = 0; i < 5; i++) {
363 >            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
364 >            p1.execute(tasks[i]);
365          }
366          tasks[4].cancel(true);
367          tasks[3].cancel(true);
368 <        one.purge();
369 <        long count = one.getTaskCount();
368 >        p1.purge();
369 >        long count = p1.getTaskCount();
370          assertTrue(count >= 2 && count < 5);
371 <        joinPool(one);
371 >        joinPool(p1);
372      }
373  
374      /**
375 <     *   shutDownNow returns a list
217 <     *  containing the correct number of elements
375 >     *  shutDownNow returns a list containing tasks that were not run
376       */
377 <    public void testShutDownNow(){
378 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
377 >    public void testShutDownNow() {
378 >        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
379          List l;
380          try {
381 <            for(int i = 0; i < 5; i++)
382 <                one.execute(new MediumPossiblyInterruptedRunnable());
381 >            for (int i = 0; i < 5; i++)
382 >                p1.execute(new MediumPossiblyInterruptedRunnable());
383          }
384          finally {
385 <            l = one.shutdownNow();
385 >            try {
386 >                l = p1.shutdownNow();
387 >            } catch (SecurityException ok) { return; }
388 >
389          }
390 <        assertTrue(one.isShutdown());
390 >        assertTrue(p1.isShutdown());
391          assertTrue(l.size() <= 4);
392      }
393  
394      // Exception Tests
234    
395  
396 <    /** Throws if corePoolSize argument is less than zero */
396 >
397 >    /**
398 >     * Constructor throws if corePoolSize argument is less than zero
399 >     */
400      public void testConstructor1() {
401 <        try{
402 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
403 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
404 <        }
242 <        catch (IllegalArgumentException success){}
401 >        try {
402 >            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
403 >            shouldThrow();
404 >        } catch (IllegalArgumentException success) {}
405      }
406 <    
407 <    /** Throws if maximumPoolSize is less than zero */
406 >
407 >    /**
408 >     * Constructor throws if maximumPoolSize is less than zero
409 >     */
410      public void testConstructor2() {
411 <        try{
412 <            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
413 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
414 <        }
251 <        catch (IllegalArgumentException success){}
411 >        try {
412 >            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
413 >            shouldThrow();
414 >        } catch (IllegalArgumentException success) {}
415      }
416 <    
417 <    /** Throws if maximumPoolSize is equal to zero */
416 >
417 >    /**
418 >     * Constructor throws if maximumPoolSize is equal to zero
419 >     */
420      public void testConstructor3() {
421 <        try{
422 <            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
423 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
424 <        }
260 <        catch (IllegalArgumentException success){}
421 >        try {
422 >            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
423 >            shouldThrow();
424 >        } catch (IllegalArgumentException success) {}
425      }
426  
427 <    /** Throws if keepAliveTime is less than zero */
427 >    /**
428 >     * Constructor throws if keepAliveTime is less than zero
429 >     */
430      public void testConstructor4() {
431 <        try{
432 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
433 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
434 <        }
269 <        catch (IllegalArgumentException success){}
431 >        try {
432 >            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
433 >            shouldThrow();
434 >        } catch (IllegalArgumentException success) {}
435      }
436  
437 <    /** Throws if corePoolSize is greater than the maximumPoolSize */
437 >    /**
438 >     * Constructor throws if corePoolSize is greater than the maximumPoolSize
439 >     */
440      public void testConstructor5() {
441 <        try{
442 <            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
443 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
444 <        }
278 <        catch (IllegalArgumentException success){}
441 >        try {
442 >            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
443 >            shouldThrow();
444 >        } catch (IllegalArgumentException success) {}
445      }
446 <        
447 <    /** Throws if workQueue is set to null */
448 <    public void testNullPointerException() {
449 <        try{
450 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,null);
451 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
452 <        }
453 <        catch (NullPointerException success){}  
446 >
447 >    /**
448 >     * Constructor throws if workQueue is set to null
449 >     */
450 >    public void testConstructorNullPointerException() {
451 >        try {
452 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null);
453 >            shouldThrow();
454 >        } catch (NullPointerException success) {}
455      }
289    
456  
457 <    
458 <    /** Throws if corePoolSize argument is less than zero */
457 >
458 >
459 >    /**
460 >     * Constructor throws if corePoolSize argument is less than zero
461 >     */
462      public void testConstructor6() {
463 <        try{
464 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory());
465 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
466 <        } catch (IllegalArgumentException success){}
463 >        try {
464 >            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
465 >            shouldThrow();
466 >        } catch (IllegalArgumentException success) {}
467      }
468 <    
469 <    /** Throws if maximumPoolSize is less than zero */
468 >
469 >    /**
470 >     * Constructor throws if maximumPoolSize is less than zero
471 >     */
472      public void testConstructor7() {
473 <        try{
474 <            new ThreadPoolExecutor(1,-1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory());
475 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
476 <        }
306 <        catch (IllegalArgumentException success){}
473 >        try {
474 >            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
475 >            shouldThrow();
476 >        } catch (IllegalArgumentException success) {}
477      }
478  
479 <    /** Throws if maximumPoolSize is equal to zero */
479 >    /**
480 >     * Constructor throws if maximumPoolSize is equal to zero
481 >     */
482      public void testConstructor8() {
483 <        try{
484 <            new ThreadPoolExecutor(1,0,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory());
485 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
486 <        }
315 <        catch (IllegalArgumentException success){}
483 >        try {
484 >            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
485 >            shouldThrow();
486 >        } catch (IllegalArgumentException success) {}
487      }
488  
489 <    /** Throws if keepAliveTime is less than zero */
489 >    /**
490 >     * Constructor throws if keepAliveTime is less than zero
491 >     */
492      public void testConstructor9() {
493 <        try{
494 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory());
495 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
496 <        }
324 <        catch (IllegalArgumentException success){}
493 >        try {
494 >            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
495 >            shouldThrow();
496 >        } catch (IllegalArgumentException success) {}
497      }
498  
499 <    /** Throws if corePoolSize is greater than the maximumPoolSize */
499 >    /**
500 >     * Constructor throws if corePoolSize is greater than the maximumPoolSize
501 >     */
502      public void testConstructor10() {
503 <        try{
504 <            new ThreadPoolExecutor(2,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory());
505 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
506 <        }
333 <        catch (IllegalArgumentException success){}
503 >        try {
504 >            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
505 >            shouldThrow();
506 >        } catch (IllegalArgumentException success) {}
507      }
508  
509 <    /** Throws if workQueue is set to null */
510 <    public void testNullPointerException2() {
511 <        try{
512 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,null,new MyThreadFactory());
513 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
514 <        }
515 <        catch (NullPointerException success){}  
509 >    /**
510 >     * Constructor throws if workQueue is set to null
511 >     */
512 >    public void testConstructorNullPointerException2() {
513 >        try {
514 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new SimpleThreadFactory());
515 >            shouldThrow();
516 >        } catch (NullPointerException success) {}
517      }
518  
519 <    /** Throws if threadFactory is set to null */
520 <    public void testNullPointerException3() {
521 <        try{
519 >    /**
520 >     * Constructor throws if threadFactory is set to null
521 >     */
522 >    public void testConstructorNullPointerException3() {
523 >        try {
524              ThreadFactory f = null;
525 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
526 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
527 <        }
352 <        catch (NullPointerException success){}  
525 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
526 >            shouldThrow();
527 >        } catch (NullPointerException success) {}
528      }
529 <
530 <    
531 <    /** Throws if corePoolSize argument is less than zero */
529 >
530 >
531 >    /**
532 >     * Constructor throws if corePoolSize argument is less than zero
533 >     */
534      public void testConstructor11() {
535 <        try{
536 <            new ThreadPoolExecutor(-1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyREHandler());
537 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
538 <        }
362 <        catch (IllegalArgumentException success){}
535 >        try {
536 >            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
537 >            shouldThrow();
538 >        } catch (IllegalArgumentException success) {}
539      }
540  
541 <    /** Throws if maximumPoolSize is less than zero */
541 >    /**
542 >     * Constructor throws if maximumPoolSize is less than zero
543 >     */
544      public void testConstructor12() {
545 <        try{
546 <            new ThreadPoolExecutor(1,-1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyREHandler());
547 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
548 <        }
371 <        catch (IllegalArgumentException success){}
545 >        try {
546 >            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
547 >            shouldThrow();
548 >        } catch (IllegalArgumentException success) {}
549      }
550  
551 <    /** Throws if maximumPoolSize is equal to zero */
551 >    /**
552 >     * Constructor throws if maximumPoolSize is equal to zero
553 >     */
554      public void testConstructor13() {
555 <        try{
556 <            new ThreadPoolExecutor(1,0,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyREHandler());
557 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
558 <        }
380 <        catch (IllegalArgumentException success){}
555 >        try {
556 >            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
557 >            shouldThrow();
558 >        } catch (IllegalArgumentException success) {}
559      }
560  
561 <    /** Throws if keepAliveTime is less than zero */
561 >    /**
562 >     * Constructor throws if keepAliveTime is less than zero
563 >     */
564      public void testConstructor14() {
565 <        try{
566 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyREHandler());
567 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
568 <        }
389 <        catch (IllegalArgumentException success){}
565 >        try {
566 >            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
567 >            shouldThrow();
568 >        } catch (IllegalArgumentException success) {}
569      }
570  
571 <    /** Throws if corePoolSize is greater than the maximumPoolSize */
571 >    /**
572 >     * Constructor throws if corePoolSize is greater than the maximumPoolSize
573 >     */
574      public void testConstructor15() {
575 <        try{
576 <            new ThreadPoolExecutor(2,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyREHandler());
577 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
578 <        }
398 <        catch (IllegalArgumentException success){}
575 >        try {
576 >            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
577 >            shouldThrow();
578 >        } catch (IllegalArgumentException success) {}
579      }
580  
581 <    /** Throws if workQueue is set to null */
582 <    public void testNullPointerException4() {
583 <        try{
584 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,null,new MyREHandler());
585 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
586 <        }
587 <        catch (NullPointerException success){}  
581 >    /**
582 >     * Constructor throws if workQueue is set to null
583 >     */
584 >    public void testConstructorNullPointerException4() {
585 >        try {
586 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new NoOpREHandler());
587 >            shouldThrow();
588 >        } catch (NullPointerException success) {}
589      }
590  
591 <    /** Throws if handler is set to null */
592 <    public void testNullPointerException5() {
593 <        try{
591 >    /**
592 >     * Constructor throws if handler is set to null
593 >     */
594 >    public void testConstructorNullPointerException5() {
595 >        try {
596              RejectedExecutionHandler r = null;
597 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
598 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
599 <        }
417 <        catch (NullPointerException success){}  
597 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
598 >            shouldThrow();
599 >        } catch (NullPointerException success) {}
600      }
601  
602 <    
603 <    /** Throws if corePoolSize argument is less than zero */
602 >
603 >    /**
604 >     * Constructor throws if corePoolSize argument is less than zero
605 >     */
606      public void testConstructor16() {
607 <        try{
608 <            new ThreadPoolExecutor(-1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),new MyREHandler());
609 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
610 <        }
427 <        catch (IllegalArgumentException success){}
607 >        try {
608 >            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
609 >            shouldThrow();
610 >        } catch (IllegalArgumentException success) {}
611      }
612  
613 <    /** Throws if maximumPoolSize is less than zero */
613 >    /**
614 >     * Constructor throws if maximumPoolSize is less than zero
615 >     */
616      public void testConstructor17() {
617 <        try{
618 <            new ThreadPoolExecutor(1,-1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),new MyREHandler());
619 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
620 <        }
436 <        catch (IllegalArgumentException success){}
617 >        try {
618 >            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
619 >            shouldThrow();
620 >        } catch (IllegalArgumentException success) {}
621      }
622  
623 <    /** Throws if maximumPoolSize is equal to zero */
623 >    /**
624 >     * Constructor throws if maximumPoolSize is equal to zero
625 >     */
626      public void testConstructor18() {
627 <        try{
628 <            new ThreadPoolExecutor(1,0,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),new MyREHandler());
629 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
630 <        }
445 <        catch (IllegalArgumentException success){}
627 >        try {
628 >            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
629 >            shouldThrow();
630 >        } catch (IllegalArgumentException success) {}
631      }
632  
633 <    /** Throws if keepAliveTime is less than zero */
633 >    /**
634 >     * Constructor throws if keepAliveTime is less than zero
635 >     */
636      public void testConstructor19() {
637 <        try{
638 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),new MyREHandler());
639 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
640 <        }
454 <        catch (IllegalArgumentException success){}
637 >        try {
638 >            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
639 >            shouldThrow();
640 >        } catch (IllegalArgumentException success) {}
641      }
642  
643 <    /** Throws if corePoolSize is greater than the maximumPoolSize */
643 >    /**
644 >     * Constructor throws if corePoolSize is greater than the maximumPoolSize
645 >     */
646      public void testConstructor20() {
647 <        try{
648 <            new ThreadPoolExecutor(2,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),new MyREHandler());
649 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
647 >        try {
648 >            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
649 >            shouldThrow();
650 >        } catch (IllegalArgumentException success) {}
651 >    }
652 >
653 >    /**
654 >     * Constructor throws if workQueue is set to null
655 >     */
656 >    public void testConstructorNullPointerException6() {
657 >        try {
658 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
659 >            shouldThrow();
660 >        } catch (NullPointerException success) {}
661 >    }
662 >
663 >    /**
664 >     * Constructor throws if handler is set to null
665 >     */
666 >    public void testConstructorNullPointerException7() {
667 >        try {
668 >            RejectedExecutionHandler r = null;
669 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),r);
670 >            shouldThrow();
671 >        } catch (NullPointerException success) {}
672 >    }
673 >
674 >    /**
675 >     * Constructor throws if ThreadFactory is set top null
676 >     */
677 >    public void testConstructorNullPointerException8() {
678 >        try {
679 >            ThreadFactory f = null;
680 >            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new NoOpREHandler());
681 >            shouldThrow();
682 >        } catch (NullPointerException success) {}
683 >    }
684 >
685 >
686 >    /**
687 >     *  execute throws RejectedExecutionException
688 >     *  if saturated.
689 >     */
690 >    public void testSaturatedExecute() {
691 >        ThreadPoolExecutor p =
692 >            new ThreadPoolExecutor(1, 1,
693 >                                   LONG_DELAY_MS, MILLISECONDS,
694 >                                   new ArrayBlockingQueue<Runnable>(1));
695 >        try {
696 >            for (int i = 0; i < 2; ++i)
697 >                p.execute(new MediumRunnable());
698 >            for (int i = 0; i < 2; ++i) {
699 >                try {
700 >                    p.execute(new MediumRunnable());
701 >                    shouldThrow();
702 >                } catch (RejectedExecutionException success) {}
703 >            }
704 >        } finally {
705 >            joinPool(p);
706          }
463        catch (IllegalArgumentException success){}
707      }
708  
709 <    /** Throws if workQueue is set to null */
710 <    public void testNullPointerException6() {
711 <        try{
712 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,null,new MyThreadFactory(),new MyREHandler());
713 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
709 >    /**
710 >     *  executor using CallerRunsPolicy runs task if saturated.
711 >     */
712 >    public void testSaturatedExecute2() {
713 >        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
714 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
715 >        try {
716 >
717 >            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
718 >            for (int i = 0; i < 5; ++i) {
719 >                tasks[i] = new TrackedNoOpRunnable();
720 >            }
721 >            TrackedLongRunnable mr = new TrackedLongRunnable();
722 >            p.execute(mr);
723 >            for (int i = 0; i < 5; ++i) {
724 >                p.execute(tasks[i]);
725 >            }
726 >            for (int i = 1; i < 5; ++i) {
727 >                assertTrue(tasks[i].done);
728 >            }
729 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
730 >        } finally {
731 >            joinPool(p);
732          }
472        catch (NullPointerException success){}  
733      }
734  
735 <    /** Throws if handler is set to null */
736 <    public void testNullPointerException7() {
737 <        try{
738 <            RejectedExecutionHandler r = null;
739 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new MyThreadFactory(),r);
740 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
735 >    /**
736 >     *  executor using DiscardPolicy drops task if saturated.
737 >     */
738 >    public void testSaturatedExecute3() {
739 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
740 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
741 >        try {
742 >
743 >            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
744 >            for (int i = 0; i < 5; ++i) {
745 >                tasks[i] = new TrackedNoOpRunnable();
746 >            }
747 >            p.execute(new TrackedLongRunnable());
748 >            for (int i = 0; i < 5; ++i) {
749 >                p.execute(tasks[i]);
750 >            }
751 >            for (int i = 0; i < 5; ++i) {
752 >                assertFalse(tasks[i].done);
753 >            }
754 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
755 >        } finally {
756 >            joinPool(p);
757          }
482        catch (NullPointerException success){}  
758      }
759  
760 <    /** Throws if ThreadFactory is set top null */
761 <    public void testNullPointerException8() {
762 <        try{
763 <            ThreadFactory f = null;
764 <            new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new MyREHandler());
765 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
760 >    /**
761 >     *  executor using DiscardOldestPolicy drops oldest task if saturated.
762 >     */
763 >    public void testSaturatedExecute4() {
764 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
765 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
766 >        try {
767 >            p.execute(new TrackedLongRunnable());
768 >            TrackedLongRunnable r2 = new TrackedLongRunnable();
769 >            p.execute(r2);
770 >            assertTrue(p.getQueue().contains(r2));
771 >            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
772 >            p.execute(r3);
773 >            assertFalse(p.getQueue().contains(r2));
774 >            assertTrue(p.getQueue().contains(r3));
775 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
776 >        } finally {
777 >            joinPool(p);
778          }
492        catch (NullPointerException successdn8){}  
779      }
494    
780  
781      /**
782 <     *   execute will throw RejectedExcutionException
498 <     *  ThreadPoolExecutor will throw one when more runnables are
499 <     *  executed then will fit in the Queue.
782 >     *  execute throws RejectedExecutionException if shutdown
783       */
784 <    public void testRejectedExecutionException(){
785 <        ThreadPoolExecutor tpe = null;
786 <        try{
787 <            tpe = new ThreadPoolExecutor(1,1,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
788 <        } catch(Exception e){}
506 <        tpe.shutdown();
507 <        try{
784 >    public void testRejectedExecutionExceptionOnShutdown() {
785 >        ThreadPoolExecutor tpe =
786 >            new ThreadPoolExecutor(1,1,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
787 >        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
788 >        try {
789              tpe.execute(new NoOpRunnable());
790 <            fail("ThreadPoolExecutor - void execute(Runnable) should throw RejectedExecutionException");
791 <        } catch(RejectedExecutionException success){}
792 <        
790 >            shouldThrow();
791 >        } catch (RejectedExecutionException success) {}
792 >
793          joinPool(tpe);
794      }
795 <    
795 >
796 >    /**
797 >     *  execute using CallerRunsPolicy drops task on shutdown
798 >     */
799 >    public void testCallerRunsOnShutdown() {
800 >        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
801 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
802 >
803 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
804 >        try {
805 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
806 >            p.execute(r);
807 >            assertFalse(r.done);
808 >        } finally {
809 >            joinPool(p);
810 >        }
811 >    }
812 >
813      /**
814 <     *   setCorePoolSize will throw IllegalArgumentException
517 <     *  when given a negative
814 >     *  execute using DiscardPolicy drops task on shutdown
815       */
816 <    public void testCorePoolSizeIllegalArgumentException(){
817 <        ThreadPoolExecutor tpe = null;
818 <        try{
819 <            tpe = new ThreadPoolExecutor(1,2,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
820 <        } catch(Exception e){}
821 <        try{
816 >    public void testDiscardOnShutdown() {
817 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
818 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
819 >
820 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
821 >        try {
822 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
823 >            p.execute(r);
824 >            assertFalse(r.done);
825 >        } finally {
826 >            joinPool(p);
827 >        }
828 >    }
829 >
830 >
831 >    /**
832 >     *  execute using DiscardOldestPolicy drops task on shutdown
833 >     */
834 >    public void testDiscardOldestOnShutdown() {
835 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
836 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
837 >
838 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
839 >        try {
840 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
841 >            p.execute(r);
842 >            assertFalse(r.done);
843 >        } finally {
844 >            joinPool(p);
845 >        }
846 >    }
847 >
848 >
849 >    /**
850 >     *  execute (null) throws NPE
851 >     */
852 >    public void testExecuteNull() {
853 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
854 >        try {
855 >            tpe.execute(null);
856 >            shouldThrow();
857 >        } catch (NullPointerException success) {}
858 >
859 >        joinPool(tpe);
860 >    }
861 >
862 >    /**
863 >     *  setCorePoolSize of negative value throws IllegalArgumentException
864 >     */
865 >    public void testCorePoolSizeIllegalArgumentException() {
866 >        ThreadPoolExecutor tpe =
867 >            new ThreadPoolExecutor(1, 2,
868 >                                   LONG_DELAY_MS, MILLISECONDS,
869 >                                   new ArrayBlockingQueue<Runnable>(10));
870 >        try {
871              tpe.setCorePoolSize(-1);
872 <            fail("ThreadPoolExecutor - void setCorePoolSize(int) should throw IllegalArgumentException");
873 <        } catch(IllegalArgumentException success){
872 >            shouldThrow();
873 >        } catch (IllegalArgumentException success) {
874          } finally {
875 <            tpe.shutdown();
875 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
876          }
877          joinPool(tpe);
878 <    }  
878 >    }
879  
534    
880      /**
881 <     *   setMaximumPoolSize(int) will throw IllegalArgumentException
882 <     *  if given a value less the it's actual core pool size
883 <     */  
884 <    public void testMaximumPoolSizeIllegalArgumentException(){
885 <        ThreadPoolExecutor tpe = null;
886 <        try{
887 <            tpe = new ThreadPoolExecutor(2,3,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
888 <        } catch(Exception e){}
889 <        try{
881 >     *  setMaximumPoolSize(int) throws IllegalArgumentException if
882 >     *  given a value less the core pool size
883 >     */
884 >    public void testMaximumPoolSizeIllegalArgumentException() {
885 >        ThreadPoolExecutor tpe =
886 >            new ThreadPoolExecutor(2, 3,
887 >                                   LONG_DELAY_MS, MILLISECONDS,
888 >                                   new ArrayBlockingQueue<Runnable>(10));
889 >        try {
890              tpe.setMaximumPoolSize(1);
891 <            fail("ThreadPoolExecutor - void setMaximumPoolSize(int) should throw IllegalArgumentException");
892 <        } catch(IllegalArgumentException success){
891 >            shouldThrow();
892 >        } catch (IllegalArgumentException success) {
893          } finally {
894 <            tpe.shutdown();
894 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
895          }
896          joinPool(tpe);
897      }
898 <    
898 >
899      /**
900 <     *   setMaximumPoolSize will throw IllegalArgumentException
901 <     *  if given a negative number
900 >     *  setMaximumPoolSize throws IllegalArgumentException
901 >     *  if given a negative value
902       */
903 <    public void testMaximumPoolSizeIllegalArgumentException2(){
904 <        ThreadPoolExecutor tpe = null;
905 <        try{
906 <            tpe = new ThreadPoolExecutor(2,3,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
907 <        } catch(Exception e){}
908 <        try{
903 >    public void testMaximumPoolSizeIllegalArgumentException2() {
904 >        ThreadPoolExecutor tpe =
905 >            new ThreadPoolExecutor(2, 3,
906 >                                   LONG_DELAY_MS, MILLISECONDS,
907 >                                   new ArrayBlockingQueue<Runnable>(10));
908 >        try {
909              tpe.setMaximumPoolSize(-1);
910 <            fail("ThreadPoolExecutor - void setMaximumPoolSize(int) should throw IllegalArgumentException");
911 <        } catch(IllegalArgumentException success){
910 >            shouldThrow();
911 >        } catch (IllegalArgumentException success) {
912          } finally {
913 <            tpe.shutdown();
913 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
914          }
915          joinPool(tpe);
916      }
917 <    
917 >
918  
919      /**
920 <     *   setKeepAliveTime will throw IllegalArgumentException
920 >     *  setKeepAliveTime  throws IllegalArgumentException
921       *  when given a negative value
922       */
923 <    public void testKeepAliveTimeIllegalArgumentException(){
924 <        ThreadPoolExecutor tpe = null;
925 <        try{
926 <            tpe = new ThreadPoolExecutor(2,3,SHORT_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
927 <        } catch(Exception e){}
928 <        
929 <        try{
930 <            tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
931 <            fail("ThreadPoolExecutor - void setKeepAliveTime(long, TimeUnit) should throw IllegalArgumentException");
587 <        } catch(IllegalArgumentException success){
923 >    public void testKeepAliveTimeIllegalArgumentException() {
924 >        ThreadPoolExecutor tpe =
925 >            new ThreadPoolExecutor(2, 3,
926 >                                   LONG_DELAY_MS, MILLISECONDS,
927 >                                   new ArrayBlockingQueue<Runnable>(10));
928 >        try {
929 >            tpe.setKeepAliveTime(-1,MILLISECONDS);
930 >            shouldThrow();
931 >        } catch (IllegalArgumentException success) {
932          } finally {
933 <            tpe.shutdown();
933 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
934          }
935          joinPool(tpe);
936      }
937 <  
937 >
938 >    /**
939 >     * terminated() is called on termination
940 >     */
941 >    public void testTerminated() {
942 >        ExtendedTPE tpe = new ExtendedTPE();
943 >        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
944 >        assertTrue(tpe.terminatedCalled);
945 >        joinPool(tpe);
946 >    }
947 >
948 >    /**
949 >     * beforeExecute and afterExecute are called when executing task
950 >     */
951 >    public void testBeforeAfter() throws InterruptedException {
952 >        ExtendedTPE tpe = new ExtendedTPE();
953 >        try {
954 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
955 >            tpe.execute(r);
956 >            Thread.sleep(SHORT_DELAY_MS);
957 >            assertTrue(r.done);
958 >            assertTrue(tpe.beforeCalled);
959 >            assertTrue(tpe.afterCalled);
960 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
961 >        } finally {
962 >            joinPool(tpe);
963 >        }
964 >    }
965 >
966 >    /**
967 >     * completed submit of callable returns result
968 >     */
969 >    public void testSubmitCallable() throws Exception {
970 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
971 >        try {
972 >            Future<String> future = e.submit(new StringTask());
973 >            String result = future.get();
974 >            assertSame(TEST_STRING, result);
975 >        } finally {
976 >            joinPool(e);
977 >        }
978 >    }
979 >
980 >    /**
981 >     * completed submit of runnable returns successfully
982 >     */
983 >    public void testSubmitRunnable() throws Exception {
984 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
985 >        try {
986 >            Future<?> future = e.submit(new NoOpRunnable());
987 >            future.get();
988 >            assertTrue(future.isDone());
989 >        } finally {
990 >            joinPool(e);
991 >        }
992 >    }
993 >
994 >    /**
995 >     * completed submit of (runnable, result) returns result
996 >     */
997 >    public void testSubmitRunnable2() throws Exception {
998 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
999 >        try {
1000 >            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1001 >            String result = future.get();
1002 >            assertSame(TEST_STRING, result);
1003 >        } finally {
1004 >            joinPool(e);
1005 >        }
1006 >    }
1007 >
1008 >
1009 >    /**
1010 >     * invokeAny(null) throws NPE
1011 >     */
1012 >    public void testInvokeAny1() throws Exception {
1013 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1014 >        try {
1015 >            e.invokeAny(null);
1016 >            shouldThrow();
1017 >        } catch (NullPointerException success) {
1018 >        } finally {
1019 >            joinPool(e);
1020 >        }
1021 >    }
1022 >
1023 >    /**
1024 >     * invokeAny(empty collection) throws IAE
1025 >     */
1026 >    public void testInvokeAny2() throws Exception {
1027 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1028 >        try {
1029 >            e.invokeAny(new ArrayList<Callable<String>>());
1030 >            shouldThrow();
1031 >        } catch (IllegalArgumentException success) {
1032 >        } finally {
1033 >            joinPool(e);
1034 >        }
1035 >    }
1036 >
1037 >    /**
1038 >     * invokeAny(c) throws NPE if c has null elements
1039 >     */
1040 >    public void testInvokeAny3() throws Exception {
1041 >        final CountDownLatch latch = new CountDownLatch(1);
1042 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1043 >        try {
1044 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1045 >            l.add(new CheckedCallable<String>() {
1046 >                      public String realCall() throws InterruptedException {
1047 >                          latch.await();
1048 >                          return TEST_STRING;
1049 >                      }});
1050 >            l.add(null);
1051 >            e.invokeAny(l);
1052 >            shouldThrow();
1053 >        } catch (NullPointerException success) {
1054 >        } finally {
1055 >            latch.countDown();
1056 >            joinPool(e);
1057 >        }
1058 >    }
1059 >
1060 >    /**
1061 >     * invokeAny(c) throws ExecutionException if no task completes
1062 >     */
1063 >    public void testInvokeAny4() throws Exception {
1064 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1065 >        try {
1066 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1067 >            l.add(new NPETask());
1068 >            e.invokeAny(l);
1069 >            shouldThrow();
1070 >        } catch (ExecutionException success) {
1071 >            assertTrue(success.getCause() instanceof NullPointerException);
1072 >        } finally {
1073 >            joinPool(e);
1074 >        }
1075 >    }
1076 >
1077 >    /**
1078 >     * invokeAny(c) returns result of some task
1079 >     */
1080 >    public void testInvokeAny5() throws Exception {
1081 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1082 >        try {
1083 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1084 >            l.add(new StringTask());
1085 >            l.add(new StringTask());
1086 >            String result = e.invokeAny(l);
1087 >            assertSame(TEST_STRING, result);
1088 >        } finally {
1089 >            joinPool(e);
1090 >        }
1091 >    }
1092 >
1093 >    /**
1094 >     * invokeAll(null) throws NPE
1095 >     */
1096 >    public void testInvokeAll1() throws Exception {
1097 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1098 >        try {
1099 >            e.invokeAll(null);
1100 >            shouldThrow();
1101 >        } catch (NullPointerException success) {
1102 >        } finally {
1103 >            joinPool(e);
1104 >        }
1105 >    }
1106 >
1107 >    /**
1108 >     * invokeAll(empty collection) returns empty collection
1109 >     */
1110 >    public void testInvokeAll2() throws InterruptedException {
1111 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1112 >        try {
1113 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1114 >            assertTrue(r.isEmpty());
1115 >        } finally {
1116 >            joinPool(e);
1117 >        }
1118 >    }
1119 >
1120 >    /**
1121 >     * invokeAll(c) throws NPE if c has null elements
1122 >     */
1123 >    public void testInvokeAll3() throws Exception {
1124 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1125 >        try {
1126 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1127 >            l.add(new StringTask());
1128 >            l.add(null);
1129 >            e.invokeAll(l);
1130 >            shouldThrow();
1131 >        } catch (NullPointerException success) {
1132 >        } finally {
1133 >            joinPool(e);
1134 >        }
1135 >    }
1136 >
1137 >    /**
1138 >     * get of element of invokeAll(c) throws exception on failed task
1139 >     */
1140 >    public void testInvokeAll4() throws Exception {
1141 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1142 >        try {
1143 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1144 >            l.add(new NPETask());
1145 >            List<Future<String>> result = e.invokeAll(l);
1146 >            assertEquals(1, result.size());
1147 >            for (Future<String> future : result) {
1148 >                try {
1149 >                    future.get();
1150 >                    shouldThrow();
1151 >                } catch (ExecutionException success) {
1152 >                    Throwable cause = success.getCause();
1153 >                    assertTrue(cause instanceof NullPointerException);
1154 >                }
1155 >            }
1156 >        } finally {
1157 >            joinPool(e);
1158 >        }
1159 >    }
1160 >
1161 >    /**
1162 >     * invokeAll(c) returns results of all completed tasks
1163 >     */
1164 >    public void testInvokeAll5() throws Exception {
1165 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1166 >        try {
1167 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1168 >            l.add(new StringTask());
1169 >            l.add(new StringTask());
1170 >            List<Future<String>> result = e.invokeAll(l);
1171 >            assertEquals(2, result.size());
1172 >            for (Future<String> future : result)
1173 >                assertSame(TEST_STRING, future.get());
1174 >        } finally {
1175 >            joinPool(e);
1176 >        }
1177 >    }
1178 >
1179 >
1180 >
1181 >    /**
1182 >     * timed invokeAny(null) throws NPE
1183 >     */
1184 >    public void testTimedInvokeAny1() throws Exception {
1185 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1186 >        try {
1187 >            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1188 >            shouldThrow();
1189 >        } catch (NullPointerException success) {
1190 >        } finally {
1191 >            joinPool(e);
1192 >        }
1193 >    }
1194 >
1195 >    /**
1196 >     * timed invokeAny(,,null) throws NPE
1197 >     */
1198 >    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1199 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1200 >        try {
1201 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1202 >            l.add(new StringTask());
1203 >            e.invokeAny(l, MEDIUM_DELAY_MS, null);
1204 >            shouldThrow();
1205 >        } catch (NullPointerException success) {
1206 >        } finally {
1207 >            joinPool(e);
1208 >        }
1209 >    }
1210 >
1211 >    /**
1212 >     * timed invokeAny(empty collection) throws IAE
1213 >     */
1214 >    public void testTimedInvokeAny2() throws Exception {
1215 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1216 >        try {
1217 >            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1218 >            shouldThrow();
1219 >        } catch (IllegalArgumentException success) {
1220 >        } finally {
1221 >            joinPool(e);
1222 >        }
1223 >    }
1224 >
1225 >    /**
1226 >     * timed invokeAny(c) throws NPE if c has null elements
1227 >     */
1228 >    public void testTimedInvokeAny3() throws Exception {
1229 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1230 >        try {
1231 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1232 >            l.add(new StringTask());
1233 >            l.add(null);
1234 >            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1235 >            shouldThrow();
1236 >        } catch (NullPointerException success) {
1237 >        } finally {
1238 >            joinPool(e);
1239 >        }
1240 >    }
1241 >
1242 >    /**
1243 >     * timed invokeAny(c) throws ExecutionException if no task completes
1244 >     */
1245 >    public void testTimedInvokeAny4() throws Exception {
1246 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1247 >        try {
1248 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1249 >            l.add(new NPETask());
1250 >            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1251 >            shouldThrow();
1252 >        } catch (ExecutionException success) {
1253 >            assertTrue(success.getCause() instanceof NullPointerException);
1254 >        } finally {
1255 >            joinPool(e);
1256 >        }
1257 >    }
1258 >
1259 >    /**
1260 >     * timed invokeAny(c) returns result of some task
1261 >     */
1262 >    public void testTimedInvokeAny5() throws Exception {
1263 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1264 >        try {
1265 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1266 >            l.add(new StringTask());
1267 >            l.add(new StringTask());
1268 >            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1269 >            assertSame(TEST_STRING, result);
1270 >        } finally {
1271 >            joinPool(e);
1272 >        }
1273 >    }
1274 >
1275 >    /**
1276 >     * timed invokeAll(null) throws NPE
1277 >     */
1278 >    public void testTimedInvokeAll1() throws Exception {
1279 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1280 >        try {
1281 >            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1282 >            shouldThrow();
1283 >        } catch (NullPointerException success) {
1284 >        } finally {
1285 >            joinPool(e);
1286 >        }
1287 >    }
1288 >
1289 >    /**
1290 >     * timed invokeAll(,,null) throws NPE
1291 >     */
1292 >    public void testTimedInvokeAllNullTimeUnit() throws Exception {
1293 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1294 >        try {
1295 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1296 >            l.add(new StringTask());
1297 >            e.invokeAll(l, MEDIUM_DELAY_MS, null);
1298 >            shouldThrow();
1299 >        } catch (NullPointerException success) {
1300 >        } finally {
1301 >            joinPool(e);
1302 >        }
1303 >    }
1304 >
1305 >    /**
1306 >     * timed invokeAll(empty collection) returns empty collection
1307 >     */
1308 >    public void testTimedInvokeAll2() throws InterruptedException {
1309 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1310 >        try {
1311 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1312 >            assertTrue(r.isEmpty());
1313 >        } finally {
1314 >            joinPool(e);
1315 >        }
1316 >    }
1317 >
1318 >    /**
1319 >     * timed invokeAll(c) throws NPE if c has null elements
1320 >     */
1321 >    public void testTimedInvokeAll3() throws Exception {
1322 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1323 >        try {
1324 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1325 >            l.add(new StringTask());
1326 >            l.add(null);
1327 >            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1328 >            shouldThrow();
1329 >        } catch (NullPointerException success) {
1330 >        } finally {
1331 >            joinPool(e);
1332 >        }
1333 >    }
1334 >
1335 >    /**
1336 >     * get of element of invokeAll(c) throws exception on failed task
1337 >     */
1338 >    public void testTimedInvokeAll4() throws Exception {
1339 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1340 >        try {
1341 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1342 >            l.add(new NPETask());
1343 >            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1344 >            assertEquals(1, result.size());
1345 >            for (Future<String> future : result)
1346 >                future.get();
1347 >            shouldThrow();
1348 >        } catch (ExecutionException success) {
1349 >            assertTrue(success.getCause() instanceof NullPointerException);
1350 >        } finally {
1351 >            joinPool(e);
1352 >        }
1353 >    }
1354 >
1355 >    /**
1356 >     * timed invokeAll(c) returns results of all completed tasks
1357 >     */
1358 >    public void testTimedInvokeAll5() throws Exception {
1359 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1360 >        try {
1361 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1362 >            l.add(new StringTask());
1363 >            l.add(new StringTask());
1364 >            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1365 >            assertEquals(2, result.size());
1366 >            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1367 >                assertSame(TEST_STRING, it.next().get());
1368 >        } finally {
1369 >            joinPool(e);
1370 >        }
1371 >    }
1372 >
1373 >    /**
1374 >     * timed invokeAll(c) cancels tasks not completed by timeout
1375 >     */
1376 >    public void testTimedInvokeAll6() throws Exception {
1377 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1378 >        try {
1379 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1380 >            l.add(new StringTask());
1381 >            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1382 >            l.add(new StringTask());
1383 >            List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1384 >            assertEquals(3, result.size());
1385 >            Iterator<Future<String>> it = result.iterator();
1386 >            Future<String> f1 = it.next();
1387 >            Future<String> f2 = it.next();
1388 >            Future<String> f3 = it.next();
1389 >            assertTrue(f1.isDone());
1390 >            assertTrue(f2.isDone());
1391 >            assertTrue(f3.isDone());
1392 >            assertFalse(f1.isCancelled());
1393 >            assertTrue(f2.isCancelled());
1394 >        } finally {
1395 >            joinPool(e);
1396 >        }
1397 >    }
1398 >
1399 >    /**
1400 >     * Execution continues if there is at least one thread even if
1401 >     * thread factory fails to create more
1402 >     */
1403 >    public void testFailingThreadFactory() throws InterruptedException {
1404 >        ExecutorService e = new ThreadPoolExecutor(100, 100, LONG_DELAY_MS, MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1405 >        try {
1406 >            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1407 >            for (int k = 0; k < 100; ++k) {
1408 >                e.execute(new NoOpRunnable());
1409 >            }
1410 >            Thread.sleep(LONG_DELAY_MS);
1411 >        } finally {
1412 >            joinPool(e);
1413 >        }
1414 >    }
1415 >
1416 >    /**
1417 >     * allowsCoreThreadTimeOut is by default false.
1418 >     */
1419 >    public void testAllowsCoreThreadTimeOut() {
1420 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1421 >        assertFalse(tpe.allowsCoreThreadTimeOut());
1422 >        joinPool(tpe);
1423 >    }
1424 >
1425 >    /**
1426 >     * allowCoreThreadTimeOut(true) causes idle threads to time out
1427 >     */
1428 >    public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1429 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1430 >        tpe.allowCoreThreadTimeOut(true);
1431 >        tpe.execute(new NoOpRunnable());
1432 >        try {
1433 >            Thread.sleep(MEDIUM_DELAY_MS);
1434 >            assertEquals(0, tpe.getPoolSize());
1435 >        } finally {
1436 >            joinPool(tpe);
1437 >        }
1438 >    }
1439 >
1440 >    /**
1441 >     * allowCoreThreadTimeOut(false) causes idle threads not to time out
1442 >     */
1443 >    public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1444 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1445 >        tpe.allowCoreThreadTimeOut(false);
1446 >        tpe.execute(new NoOpRunnable());
1447 >        try {
1448 >            Thread.sleep(MEDIUM_DELAY_MS);
1449 >            assertTrue(tpe.getPoolSize() >= 1);
1450 >        } finally {
1451 >            joinPool(tpe);
1452 >        }
1453 >    }
1454 >
1455 >    /**
1456 >     * execute allows the same task to be submitted multiple times, even
1457 >     * if rejected
1458 >     */
1459 >    public void testRejectedRecycledTask() throws InterruptedException {
1460 >        final int nTasks = 1000;
1461 >        final AtomicInteger nRun = new AtomicInteger(0);
1462 >        final Runnable recycledTask = new Runnable() {
1463 >                public void run() {
1464 >                    nRun.getAndIncrement();
1465 >                } };
1466 >        final ThreadPoolExecutor p =
1467 >            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
1468 >                                   new ArrayBlockingQueue(30));
1469 >        try {
1470 >            for (int i = 0; i < nTasks; ++i) {
1471 >                for (;;) {
1472 >                    try {
1473 >                        p.execute(recycledTask);
1474 >                        break;
1475 >                    }
1476 >                    catch (RejectedExecutionException ignore) {
1477 >                    }
1478 >                }
1479 >            }
1480 >            Thread.sleep(5000); // enough time to run all tasks
1481 >            assertEquals(nRun.get(), nTasks);
1482 >        } finally {
1483 >            p.shutdown();
1484 >        }
1485 >    }
1486 >
1487   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines