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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines