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.1 by dl, Sun Aug 31 19:24:56 2003 UTC vs.
Revision 1.35 by jsr166, Sat Oct 9 19:30:35 2010 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{
58 <                            Thread.sleep(SHORT_DELAY_MS);
59 <                        }catch(InterruptedException e){
60 <                            fail("unexpected exception");
61 <                        }
62 <                    }
63 <                });
64 <            Thread.sleep(SHORT_DELAY_MS * 2);
65 <        }catch(InterruptedException e){
66 <            fail("unexpected exception");
165 >            p.setThreadFactory(null);
166 >            shouldThrow();
167 >        } catch (NullPointerException success) {
168          } finally {
169 <            one.shutdown();
169 >            joinPool(p);
170          }
171      }
172  
173      /**
174 <     *  Test to verify getActiveCount gives correct values
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 testGetActiveCount(){
200 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, 1, TimeUnit.SECONDS, 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.getActiveCount());
203 <            two.execute(newRunnable());
204 <            try{Thread.sleep(10);}catch(Exception e){}
81 <            assertEquals(1, two.getActiveCount());
202 >            p.setRejectedExecutionHandler(null);
203 >            shouldThrow();
204 >        } catch (NullPointerException success) {
205          } finally {
206 <            two.shutdown();
206 >            joinPool(p);
207          }
208      }
209 <    
209 >
210 >
211      /**
212 <     *  Test to verify getCompleteTaskCount gives correct values
212 >     * getLargestPoolSize increases, but doesn't overestimate, when
213 >     * multiple threads active
214       */
215 <    public void testGetCompletedTaskCount(){
216 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
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 <            assertEquals(0, two.getCompletedTaskCount());
94 <            two.execute(newRunnable());
95 <            try{Thread.sleep(2000);}catch(Exception e){}
96 <            assertEquals(1, two.getCompletedTaskCount());
279 >            p1.execute(new MediumRunnable());
280          } finally {
281 <            two.shutdown();
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 <     *  Test to verify getCorePoolSize gives correct values
288 >     * isTerminating is not true when running or when terminated
289       */
290 <    public void testGetCorePoolSize(){
291 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 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(1, one.getCorePoolSize());
294 >            p1.execute(new SmallRunnable());
295 >            assertFalse(p1.isTerminating());
296          } finally {
297 <            one.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 getKeepAliveTime gives correct values
305 >     * getQueue returns the work queue, which contains queued tasks
306       */
307 <    public void testGetKeepAliveTime(){
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(1, two.getKeepAliveTime(TimeUnit.SECONDS));
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 getLargestPoolSize gives correct values
330 >     * remove(task) removes queued task, and fails to remove active task
331       */
332 <    public void testGetLargestPoolSize(){
333 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, 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(0, two.getLargestPoolSize());
342 <            two.execute(newRunnable());
343 <            two.execute(newRunnable());
344 <            try{Thread.sleep(SHORT_DELAY_MS);} catch(Exception e){}
345 <            assertEquals(2, two.getLargestPoolSize());
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 <            two.shutdown();
352 >            joinPool(p1);
353          }
354      }
355 <    
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 <     *  Test to verify getMaximumPoolSize gives correct values
375 >     * shutDownNow returns a list containing tasks that were not run
376       */
377 <    public void testGetMaximumPoolSize(){
378 <        ThreadPoolExecutor two = new ThreadPoolExecutor(2, 2, 1, TimeUnit.SECONDS, 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 <            assertEquals(2, two.getMaximumPoolSize());
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 >
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 >     * Constructor throws if ThreadFactory is set top null
675 >     */
676 >    public void testConstructorNullPointerException8() {
677 >        try {
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 if saturated.
687 >     */
688 >    public void testSaturatedExecute() {
689 >        ThreadPoolExecutor p =
690 >            new ThreadPoolExecutor(1, 1,
691 >                                   LONG_DELAY_MS, MILLISECONDS,
692 >                                   new ArrayBlockingQueue<Runnable>(1));
693 >        try {
694 >            for (int i = 0; i < 2; ++i)
695 >                p.execute(new MediumRunnable());
696 >            for (int i = 0; i < 2; ++i) {
697 >                try {
698 >                    p.execute(new MediumRunnable());
699 >                    shouldThrow();
700 >                } catch (RejectedExecutionException success) {}
701 >            }
702          } finally {
703 <            two.shutdown();
703 >            joinPool(p);
704          }
705      }
706 <    
706 >
707      /**
708 <     *  Test to verify getPoolSize gives correct values
708 >     * executor using CallerRunsPolicy runs task if saturated.
709       */
710 <    public void testGetPoolSize(){
711 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
712 <        try {
713 <            assertEquals(0, one.getPoolSize());
714 <            one.execute(newRunnable());
715 <            assertEquals(1, one.getPoolSize());
710 >    public void testSaturatedExecute2() {
711 >        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
712 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
713 >        try {
714 >
715 >            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
716 >            for (int i = 0; i < 5; ++i) {
717 >                tasks[i] = new TrackedNoOpRunnable();
718 >            }
719 >            TrackedLongRunnable mr = new TrackedLongRunnable();
720 >            p.execute(mr);
721 >            for (int i = 0; i < 5; ++i) {
722 >                p.execute(tasks[i]);
723 >            }
724 >            for (int i = 1; i < 5; ++i) {
725 >                assertTrue(tasks[i].done);
726 >            }
727 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
728          } finally {
729 <            one.shutdown();
729 >            joinPool(p);
730          }
731      }
732 <    
732 >
733      /**
734 <     *  Test to verify getTaskCount gives correct values
734 >     * executor using DiscardPolicy drops task if saturated.
735       */
736 <    public void testGetTaskCount(){
737 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
736 >    public void testSaturatedExecute3() {
737 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
738 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
739          try {
740 <            assertEquals(0, one.getTaskCount());
741 <            for(int i = 0; i < 5; i++)
742 <                one.execute(newRunnable());
743 <            try{Thread.sleep(SHORT_DELAY_MS);}catch(Exception e){}
744 <            assertEquals(5, one.getTaskCount());
740 >
741 >            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
742 >            for (int i = 0; i < 5; ++i) {
743 >                tasks[i] = new TrackedNoOpRunnable();
744 >            }
745 >            p.execute(new TrackedLongRunnable());
746 >            for (int i = 0; i < 5; ++i) {
747 >                p.execute(tasks[i]);
748 >            }
749 >            for (int i = 0; i < 5; ++i) {
750 >                assertFalse(tasks[i].done);
751 >            }
752 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
753          } finally {
754 <            one.shutdown();
754 >            joinPool(p);
755          }
756      }
757 <    
757 >
758      /**
759 <     *  Test to verify isShutDown gives correct values
759 >     * executor using DiscardOldestPolicy drops oldest task if saturated.
760       */
761 <    public void testIsShutdown(){
762 <        
763 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
761 >    public void testSaturatedExecute4() {
762 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
763 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
764          try {
765 <            assertFalse(one.isShutdown());
765 >            p.execute(new TrackedLongRunnable());
766 >            TrackedLongRunnable r2 = new TrackedLongRunnable();
767 >            p.execute(r2);
768 >            assertTrue(p.getQueue().contains(r2));
769 >            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
770 >            p.execute(r3);
771 >            assertFalse(p.getQueue().contains(r2));
772 >            assertTrue(p.getQueue().contains(r3));
773 >            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
774 >        } finally {
775 >            joinPool(p);
776          }
777 <        finally {
778 <            one.shutdown();
777 >    }
778 >
779 >    /**
780 >     * execute throws RejectedExecutionException if shutdown
781 >     */
782 >    public void testRejectedExecutionExceptionOnShutdown() {
783 >        ThreadPoolExecutor tpe =
784 >            new ThreadPoolExecutor(1,1,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
785 >        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
786 >        try {
787 >            tpe.execute(new NoOpRunnable());
788 >            shouldThrow();
789 >        } catch (RejectedExecutionException success) {}
790 >
791 >        joinPool(tpe);
792 >    }
793 >
794 >    /**
795 >     * execute using CallerRunsPolicy drops task on shutdown
796 >     */
797 >    public void testCallerRunsOnShutdown() {
798 >        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
799 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
800 >
801 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
802 >        try {
803 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
804 >            p.execute(r);
805 >            assertFalse(r.done);
806 >        } finally {
807 >            joinPool(p);
808          }
196        assertTrue(one.isShutdown());
809      }
810  
199        
811      /**
812 <     *  Test to verify isTerminated gives correct values
202 <     *  Makes sure termination does not take an innapropriate
203 <     *  amount of time
812 >     * execute using DiscardPolicy drops task on shutdown
813       */
814 <    public void testIsTerminated(){
815 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
814 >    public void testDiscardOnShutdown() {
815 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
816 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
817 >
818 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
819          try {
820 <            one.execute(newRunnable());
820 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
821 >            p.execute(r);
822 >            assertFalse(r.done);
823          } finally {
824 <            one.shutdown();
824 >            joinPool(p);
825          }
212        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");
826      }
827  
828 +
829      /**
830 <     *  Test to verify that purge correctly removes cancelled tasks
223 <     *  from the queue
830 >     * execute using DiscardOldestPolicy drops task on shutdown
831       */
832 <    public void testPurge(){
833 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
832 >    public void testDiscardOldestOnShutdown() {
833 >        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
834 >        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
835 >
836 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
837          try {
838 <            CancellableTask[] tasks = new CancellableTask[5];
839 <            for(int i = 0; i < 5; i++){
840 <                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);
838 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
839 >            p.execute(r);
840 >            assertFalse(r.done);
841          } finally {
842 <            one.shutdown();
842 >            joinPool(p);
843          }
844      }
845  
846 +
847      /**
848 <     *  Test to verify shutDownNow returns a list
245 <     *  containing the correct number of elements
848 >     * execute(null) throws NPE
849       */
850 <    public void testShutDownNow(){
851 <        ThreadPoolExecutor one = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
249 <        List l;
850 >    public void testExecuteNull() {
851 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
852          try {
853 <            for(int i = 0; i < 5; i++)
854 <                one.execute(newRunnable());
853 >            tpe.execute(null);
854 >            shouldThrow();
855 >        } catch (NullPointerException success) {}
856 >
857 >        joinPool(tpe);
858 >    }
859 >
860 >    /**
861 >     * setCorePoolSize of negative value throws IllegalArgumentException
862 >     */
863 >    public void testCorePoolSizeIllegalArgumentException() {
864 >        ThreadPoolExecutor tpe =
865 >            new ThreadPoolExecutor(1, 2,
866 >                                   LONG_DELAY_MS, MILLISECONDS,
867 >                                   new ArrayBlockingQueue<Runnable>(10));
868 >        try {
869 >            tpe.setCorePoolSize(-1);
870 >            shouldThrow();
871 >        } catch (IllegalArgumentException success) {
872 >        } finally {
873 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
874          }
875 <        finally {
876 <            l = one.shutdownNow();
875 >        joinPool(tpe);
876 >    }
877 >
878 >    /**
879 >     * setMaximumPoolSize(int) throws IllegalArgumentException if
880 >     * given a value less the core pool size
881 >     */
882 >    public void testMaximumPoolSizeIllegalArgumentException() {
883 >        ThreadPoolExecutor tpe =
884 >            new ThreadPoolExecutor(2, 3,
885 >                                   LONG_DELAY_MS, MILLISECONDS,
886 >                                   new ArrayBlockingQueue<Runnable>(10));
887 >        try {
888 >            tpe.setMaximumPoolSize(1);
889 >            shouldThrow();
890 >        } catch (IllegalArgumentException success) {
891 >        } finally {
892 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
893          }
894 <        assertTrue(one.isShutdown());
258 <        assertTrue(l.size() <= 4);
894 >        joinPool(tpe);
895      }
896  
897 <    
898 <
899 <    
900 <    
901 <      
902 <    // Exception Tests
903 <    
897 >    /**
898 >     * setMaximumPoolSize throws IllegalArgumentException
899 >     * if given a negative value
900 >     */
901 >    public void testMaximumPoolSizeIllegalArgumentException2() {
902 >        ThreadPoolExecutor tpe =
903 >            new ThreadPoolExecutor(2, 3,
904 >                                   LONG_DELAY_MS, MILLISECONDS,
905 >                                   new ArrayBlockingQueue<Runnable>(10));
906 >        try {
907 >            tpe.setMaximumPoolSize(-1);
908 >            shouldThrow();
909 >        } catch (IllegalArgumentException success) {
910 >        } finally {
911 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
912 >        }
913 >        joinPool(tpe);
914 >    }
915  
916 <    //---- Tests if corePoolSize argument is less than zero
917 <    public void testConstructor1() {
918 <        try{
919 <            new ThreadPoolExecutor(-1,1,100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
920 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
916 >
917 >    /**
918 >     * setKeepAliveTime throws IllegalArgumentException
919 >     * when given a negative value
920 >     */
921 >    public void testKeepAliveTimeIllegalArgumentException() {
922 >        ThreadPoolExecutor tpe =
923 >            new ThreadPoolExecutor(2, 3,
924 >                                   LONG_DELAY_MS, MILLISECONDS,
925 >                                   new ArrayBlockingQueue<Runnable>(10));
926 >        try {
927 >            tpe.setKeepAliveTime(-1,MILLISECONDS);
928 >            shouldThrow();
929 >        } catch (IllegalArgumentException success) {
930 >        } finally {
931 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
932          }
933 <        catch (IllegalArgumentException i){}
933 >        joinPool(tpe);
934      }
935 <    
936 <    //---- Tests if maximumPoolSize is less than zero
937 <    public void testConstructor2() {
938 <        try{
939 <            new ThreadPoolExecutor(1,-1,100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
940 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
935 >
936 >    /**
937 >     * terminated() is called on termination
938 >     */
939 >    public void testTerminated() {
940 >        ExtendedTPE tpe = new ExtendedTPE();
941 >        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
942 >        assertTrue(tpe.terminatedCalled);
943 >        joinPool(tpe);
944 >    }
945 >
946 >    /**
947 >     * beforeExecute and afterExecute are called when executing task
948 >     */
949 >    public void testBeforeAfter() throws InterruptedException {
950 >        ExtendedTPE tpe = new ExtendedTPE();
951 >        try {
952 >            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
953 >            tpe.execute(r);
954 >            Thread.sleep(SHORT_DELAY_MS);
955 >            assertTrue(r.done);
956 >            assertTrue(tpe.beforeCalled);
957 >            assertTrue(tpe.afterCalled);
958 >            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
959 >        } finally {
960 >            joinPool(tpe);
961          }
284        catch (IllegalArgumentException i2){}
962      }
963 <    
964 <    //---- Tests if maximumPoolSize is equal to zero
965 <    public void testConstructor3() {
966 <        try{
967 <            new ThreadPoolExecutor(1,0,100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
968 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
963 >
964 >    /**
965 >     * completed submit of callable returns result
966 >     */
967 >    public void testSubmitCallable() throws Exception {
968 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
969 >        try {
970 >            Future<String> future = e.submit(new StringTask());
971 >            String result = future.get();
972 >            assertSame(TEST_STRING, result);
973 >        } finally {
974 >            joinPool(e);
975          }
293        catch (IllegalArgumentException i3){}
976      }
977  
978 <    //---- Tests if keepAliveTime is less than zero
979 <    public void testConstructor4() {
980 <        try{
981 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
982 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
978 >    /**
979 >     * completed submit of runnable returns successfully
980 >     */
981 >    public void testSubmitRunnable() throws Exception {
982 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
983 >        try {
984 >            Future<?> future = e.submit(new NoOpRunnable());
985 >            future.get();
986 >            assertTrue(future.isDone());
987 >        } finally {
988 >            joinPool(e);
989          }
302        catch (IllegalArgumentException i4){}
990      }
991  
992 <    //---- Tests if corePoolSize is greater than the maximumPoolSize
993 <    public void testConstructor5() {
994 <        try{
995 <            new ThreadPoolExecutor(2,1,100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
996 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
992 >    /**
993 >     * completed submit of (runnable, result) returns result
994 >     */
995 >    public void testSubmitRunnable2() throws Exception {
996 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
997 >        try {
998 >            Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
999 >            String result = future.get();
1000 >            assertSame(TEST_STRING, result);
1001 >        } finally {
1002 >            joinPool(e);
1003          }
311        catch (IllegalArgumentException i5){}
1004      }
1005 <        
1006 <    //---- Tests if workQueue is set to null
1007 <    public void testNullPointerException() {
1008 <        try{
1009 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,null);
1010 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1005 >
1006 >
1007 >    /**
1008 >     * invokeAny(null) throws NPE
1009 >     */
1010 >    public void testInvokeAny1() throws Exception {
1011 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1012 >        try {
1013 >            e.invokeAny(null);
1014 >            shouldThrow();
1015 >        } catch (NullPointerException success) {
1016 >        } finally {
1017 >            joinPool(e);
1018          }
320        catch (NullPointerException n){}  
1019      }
322    
1020  
1021 <    
1022 <    //---- Tests if corePoolSize argument is less than zero
1023 <    public void testConstructor6() {
1024 <        try{
1025 <            new ThreadPoolExecutor(-1,1,100L,TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread());
1026 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1027 <        }catch (IllegalArgumentException i6){}
1021 >    /**
1022 >     * invokeAny(empty collection) throws IAE
1023 >     */
1024 >    public void testInvokeAny2() throws Exception {
1025 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1026 >        try {
1027 >            e.invokeAny(new ArrayList<Callable<String>>());
1028 >            shouldThrow();
1029 >        } catch (IllegalArgumentException success) {
1030 >        } finally {
1031 >            joinPool(e);
1032 >        }
1033      }
1034 <    
1035 <    //---- Tests if maximumPoolSize is less than zero
1036 <    public void testConstructor7() {
1037 <        try{
1038 <            new ThreadPoolExecutor(1,-1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread());
1039 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1034 >
1035 >    /**
1036 >     * invokeAny(c) throws NPE if c has null elements
1037 >     */
1038 >    public void testInvokeAny3() throws Exception {
1039 >        CountDownLatch latch = new CountDownLatch(1);
1040 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1041 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1042 >        l.add(latchAwaitingStringTask(latch));
1043 >        l.add(null);
1044 >        try {
1045 >            e.invokeAny(l);
1046 >            shouldThrow();
1047 >        } catch (NullPointerException success) {
1048 >        } finally {
1049 >            latch.countDown();
1050 >            joinPool(e);
1051          }
339        catch (IllegalArgumentException i7){}
1052      }
1053  
1054 <    //---- Tests if maximumPoolSize is equal to zero
1055 <    public void testConstructor8() {
1056 <        try{
1057 <            new ThreadPoolExecutor(1,0,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread());
1058 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1054 >    /**
1055 >     * invokeAny(c) throws ExecutionException if no task completes
1056 >     */
1057 >    public void testInvokeAny4() throws Exception {
1058 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1059 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1060 >        l.add(new NPETask());
1061 >        try {
1062 >            e.invokeAny(l);
1063 >            shouldThrow();
1064 >        } catch (ExecutionException success) {
1065 >            assertTrue(success.getCause() instanceof NullPointerException);
1066 >        } finally {
1067 >            joinPool(e);
1068          }
348        catch (IllegalArgumentException i8){}
1069      }
1070  
1071 <    //---- Tests if keepAliveTime is less than zero
1072 <    public void testConstructor9() {
1073 <        try{
1074 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread());
1075 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1071 >    /**
1072 >     * invokeAny(c) returns result of some task
1073 >     */
1074 >    public void testInvokeAny5() throws Exception {
1075 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1076 >        try {
1077 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1078 >            l.add(new StringTask());
1079 >            l.add(new StringTask());
1080 >            String result = e.invokeAny(l);
1081 >            assertSame(TEST_STRING, result);
1082 >        } finally {
1083 >            joinPool(e);
1084          }
357        catch (IllegalArgumentException i9){}
1085      }
1086  
1087 <    //---- Tests if corePoolSize is greater than the maximumPoolSize
1088 <    public void testConstructor10() {
1089 <        try{
1090 <            new ThreadPoolExecutor(2,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread());
1091 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1087 >    /**
1088 >     * invokeAll(null) throws NPE
1089 >     */
1090 >    public void testInvokeAll1() throws Exception {
1091 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1092 >        try {
1093 >            e.invokeAll(null);
1094 >            shouldThrow();
1095 >        } catch (NullPointerException success) {
1096 >        } finally {
1097 >            joinPool(e);
1098          }
366        catch (IllegalArgumentException i10){}
1099      }
1100  
1101 <    //---- Tests if workQueue is set to null
1102 <    public void testNullPointerException2() {
1103 <        try{
1104 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,null,new testThread());
1105 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1101 >    /**
1102 >     * invokeAll(empty collection) returns empty collection
1103 >     */
1104 >    public void testInvokeAll2() throws InterruptedException {
1105 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1106 >        try {
1107 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1108 >            assertTrue(r.isEmpty());
1109 >        } finally {
1110 >            joinPool(e);
1111          }
375        catch (NullPointerException n2){}  
1112      }
1113  
1114 <    //---- Tests if threadFactory is set to null
1115 <    public void testNullPointerException3() {
1116 <        try{
1117 <            ThreadFactory f = null;
1118 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
1119 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1114 >    /**
1115 >     * invokeAll(c) throws NPE if c has null elements
1116 >     */
1117 >    public void testInvokeAll3() throws Exception {
1118 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1119 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1120 >        l.add(new StringTask());
1121 >        l.add(null);
1122 >        try {
1123 >            e.invokeAll(l);
1124 >            shouldThrow();
1125 >        } catch (NullPointerException success) {
1126 >        } finally {
1127 >            joinPool(e);
1128          }
385        catch (NullPointerException n3){}  
1129      }
1130 <
1131 <    
1132 <    //---- Tests if corePoolSize argument is less than zero
1133 <    public void testConstructor11() {
1134 <        try{
1135 <            new ThreadPoolExecutor(-1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testReject());
1136 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1130 >
1131 >    /**
1132 >     * get of element of invokeAll(c) throws exception on failed task
1133 >     */
1134 >    public void testInvokeAll4() throws Exception {
1135 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1136 >        try {
1137 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1138 >            l.add(new NPETask());
1139 >            List<Future<String>> futures = e.invokeAll(l);
1140 >            assertEquals(1, futures.size());
1141 >            try {
1142 >                futures.get(0).get();
1143 >                shouldThrow();
1144 >            } catch (ExecutionException success) {
1145 >                assertTrue(success.getCause() instanceof NullPointerException);
1146 >            }
1147 >        } finally {
1148 >            joinPool(e);
1149          }
395        catch (IllegalArgumentException i11){}
1150      }
1151  
1152 <    //---- Tests if maximumPoolSize is less than zero
1153 <    public void testConstructor12() {
1154 <        try{
1155 <            new ThreadPoolExecutor(1,-1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testReject());
1156 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1152 >    /**
1153 >     * invokeAll(c) returns results of all completed tasks
1154 >     */
1155 >    public void testInvokeAll5() throws Exception {
1156 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1157 >        try {
1158 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1159 >            l.add(new StringTask());
1160 >            l.add(new StringTask());
1161 >            List<Future<String>> futures = e.invokeAll(l);
1162 >            assertEquals(2, futures.size());
1163 >            for (Future<String> future : futures)
1164 >                assertSame(TEST_STRING, future.get());
1165 >        } finally {
1166 >            joinPool(e);
1167          }
404        catch (IllegalArgumentException i12){}
1168      }
1169  
1170 <    //---- Tests if maximumPoolSize is equal to zero
1171 <    public void testConstructor13() {
1172 <        try{
1173 <            new ThreadPoolExecutor(1,0,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testReject());
1174 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1170 >
1171 >
1172 >    /**
1173 >     * timed invokeAny(null) throws NPE
1174 >     */
1175 >    public void testTimedInvokeAny1() throws Exception {
1176 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1177 >        try {
1178 >            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1179 >            shouldThrow();
1180 >        } catch (NullPointerException success) {
1181 >        } finally {
1182 >            joinPool(e);
1183          }
413        catch (IllegalArgumentException i13){}
1184      }
1185  
1186 <    //---- Tests if keepAliveTime is less than zero
1187 <    public void testConstructor14() {
1188 <        try{
1189 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testReject());
1190 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1186 >    /**
1187 >     * timed invokeAny(,,null) throws NPE
1188 >     */
1189 >    public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1190 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1191 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1192 >        l.add(new StringTask());
1193 >        try {
1194 >            e.invokeAny(l, MEDIUM_DELAY_MS, null);
1195 >            shouldThrow();
1196 >        } catch (NullPointerException success) {
1197 >        } finally {
1198 >            joinPool(e);
1199          }
422        catch (IllegalArgumentException i14){}
1200      }
1201  
1202 <    //---- Tests if corePoolSize is greater than the maximumPoolSize
1203 <    public void testConstructor15() {
1204 <        try{
1205 <            new ThreadPoolExecutor(2,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testReject());
1206 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1202 >    /**
1203 >     * timed invokeAny(empty collection) throws IAE
1204 >     */
1205 >    public void testTimedInvokeAny2() throws Exception {
1206 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1207 >        try {
1208 >            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1209 >            shouldThrow();
1210 >        } catch (IllegalArgumentException success) {
1211 >        } finally {
1212 >            joinPool(e);
1213          }
431        catch (IllegalArgumentException i15){}
1214      }
1215  
1216 <    //---- Tests if workQueue is set to null
1217 <    public void testNullPointerException4() {
1218 <        try{
1219 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,null,new testReject());
1220 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1216 >    /**
1217 >     * timed invokeAny(c) throws NPE if c has null elements
1218 >     */
1219 >    public void testTimedInvokeAny3() throws Exception {
1220 >        CountDownLatch latch = new CountDownLatch(1);
1221 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1222 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1223 >        l.add(latchAwaitingStringTask(latch));
1224 >        l.add(null);
1225 >        try {
1226 >            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1227 >            shouldThrow();
1228 >        } catch (NullPointerException success) {
1229 >        } finally {
1230 >            latch.countDown();
1231 >            joinPool(e);
1232          }
440        catch (NullPointerException n4){}  
1233      }
1234  
1235 <    //---- Tests if handler is set to null
1236 <    public void testNullPointerException5() {
1237 <        try{
1238 <            RejectedExecutionHandler r = null;
1239 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
1240 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1235 >    /**
1236 >     * timed invokeAny(c) throws ExecutionException if no task completes
1237 >     */
1238 >    public void testTimedInvokeAny4() throws Exception {
1239 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1240 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1241 >        l.add(new NPETask());
1242 >        try {
1243 >            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1244 >            shouldThrow();
1245 >        } catch (ExecutionException success) {
1246 >            assertTrue(success.getCause() instanceof NullPointerException);
1247 >        } finally {
1248 >            joinPool(e);
1249          }
450        catch (NullPointerException n5){}  
1250      }
1251  
1252 <    
1253 <    //---- Tests if corePoolSize argument is less than zero
1254 <    public void testConstructor16() {
1255 <        try{
1256 <            new ThreadPoolExecutor(-1,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread(),new testReject());
1257 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1252 >    /**
1253 >     * timed invokeAny(c) returns result of some task
1254 >     */
1255 >    public void testTimedInvokeAny5() throws Exception {
1256 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1257 >        try {
1258 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1259 >            l.add(new StringTask());
1260 >            l.add(new StringTask());
1261 >            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1262 >            assertSame(TEST_STRING, result);
1263 >        } finally {
1264 >            joinPool(e);
1265          }
460        catch (IllegalArgumentException i16){}
1266      }
1267  
1268 <    //---- Tests if maximumPoolSize is less than zero
1269 <    public void testConstructor17() {
1270 <        try{
1271 <            new ThreadPoolExecutor(1,-1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread(),new testReject());
1272 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1268 >    /**
1269 >     * timed invokeAll(null) throws NPE
1270 >     */
1271 >    public void testTimedInvokeAll1() throws Exception {
1272 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1273 >        try {
1274 >            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1275 >            shouldThrow();
1276 >        } catch (NullPointerException success) {
1277 >        } finally {
1278 >            joinPool(e);
1279          }
469        catch (IllegalArgumentException i17){}
1280      }
1281  
1282 <    //---- Tests if maximumPoolSize is equal to zero
1283 <    public void testConstructor18() {
1284 <        try{
1285 <            new ThreadPoolExecutor(1,0,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread(),new testReject());
1286 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1282 >    /**
1283 >     * timed invokeAll(,,null) throws NPE
1284 >     */
1285 >    public void testTimedInvokeAllNullTimeUnit() throws Exception {
1286 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1287 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1288 >        l.add(new StringTask());
1289 >        try {
1290 >            e.invokeAll(l, MEDIUM_DELAY_MS, null);
1291 >            shouldThrow();
1292 >        } catch (NullPointerException success) {
1293 >        } finally {
1294 >            joinPool(e);
1295          }
478        catch (IllegalArgumentException i18){}
1296      }
1297  
1298 <    //---- Tests if keepAliveTime is less than zero
1299 <    public void testConstructor19() {
1300 <        try{
1301 <            new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread(),new testReject());
1302 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1298 >    /**
1299 >     * timed invokeAll(empty collection) returns empty collection
1300 >     */
1301 >    public void testTimedInvokeAll2() throws InterruptedException {
1302 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1303 >        try {
1304 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1305 >            assertTrue(r.isEmpty());
1306 >        } finally {
1307 >            joinPool(e);
1308          }
487        catch (IllegalArgumentException i19){}
1309      }
1310  
1311 <    //---- Tests if corePoolSize is greater than the maximumPoolSize
1312 <    public void testConstructor20() {
1313 <        try{
1314 <            new ThreadPoolExecutor(2,1,100L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new testThread(),new testReject());
1315 <            fail("ThreadPoolExecutor constructor should throw an IllegalArgumentException");            
1311 >    /**
1312 >     * timed invokeAll(c) throws NPE if c has null elements
1313 >     */
1314 >    public void testTimedInvokeAll3() throws Exception {
1315 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1316 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1317 >        l.add(new StringTask());
1318 >        l.add(null);
1319 >        try {
1320 >            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1321 >            shouldThrow();
1322 >        } catch (NullPointerException success) {
1323 >        } finally {
1324 >            joinPool(e);
1325          }
496        catch (IllegalArgumentException i20){}
1326      }
1327  
1328 <    //---- Tests if workQueue is set to null
1329 <    public void testNullPointerException6() {
1330 <        try{
1331 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,null,new testThread(),new testReject());
1332 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1328 >    /**
1329 >     * get of element of invokeAll(c) throws exception on failed task
1330 >     */
1331 >    public void testTimedInvokeAll4() throws Exception {
1332 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1333 >        List<Callable<String>> l = new ArrayList<Callable<String>>();
1334 >        l.add(new NPETask());
1335 >        List<Future<String>> futures =
1336 >            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1337 >        assertEquals(1, futures.size());
1338 >        try {
1339 >            futures.get(0).get();
1340 >            shouldThrow();
1341 >        } catch (ExecutionException success) {
1342 >            assertTrue(success.getCause() instanceof NullPointerException);
1343 >        } finally {
1344 >            joinPool(e);
1345          }
505        catch (NullPointerException n6){}  
1346      }
1347  
1348 <    //---- Tests if handler is set to null
1349 <    public void testNullPointerException7() {
1350 <        try{
1351 <            RejectedExecutionHandler r = null;
1352 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new testThread(),r);
1353 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1348 >    /**
1349 >     * timed invokeAll(c) returns results of all completed tasks
1350 >     */
1351 >    public void testTimedInvokeAll5() throws Exception {
1352 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1353 >        try {
1354 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1355 >            l.add(new StringTask());
1356 >            l.add(new StringTask());
1357 >            List<Future<String>> futures =
1358 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1359 >            assertEquals(2, futures.size());
1360 >            for (Future<String> future : futures)
1361 >                assertSame(TEST_STRING, future.get());
1362 >        } finally {
1363 >            joinPool(e);
1364          }
515        catch (NullPointerException n7){}  
1365      }
1366  
1367 <    //---- Tests if ThradFactory is set top null
1368 <    public void testNullPointerException8() {
1369 <        try{
1370 <            ThreadFactory f = null;
1371 <            new ThreadPoolExecutor(1,2,100L,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new testReject());
1372 <            fail("ThreadPoolExecutor constructor should throw a NullPointerException");        
1367 >    /**
1368 >     * timed invokeAll(c) cancels tasks not completed by timeout
1369 >     */
1370 >    public void testTimedInvokeAll6() throws Exception {
1371 >        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1372 >        try {
1373 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1374 >            l.add(new StringTask());
1375 >            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1376 >            l.add(new StringTask());
1377 >            List<Future<String>> futures =
1378 >                e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1379 >            assertEquals(3, futures.size());
1380 >            Iterator<Future<String>> it = futures.iterator();
1381 >            Future<String> f1 = it.next();
1382 >            Future<String> f2 = it.next();
1383 >            Future<String> f3 = it.next();
1384 >            assertTrue(f1.isDone());
1385 >            assertTrue(f2.isDone());
1386 >            assertTrue(f3.isDone());
1387 >            assertFalse(f1.isCancelled());
1388 >            assertTrue(f2.isCancelled());
1389 >        } finally {
1390 >            joinPool(e);
1391          }
525        catch (NullPointerException n8){}  
1392      }
527    
1393  
1394      /**
1395 <     *  Test to verify execute will throw RejectedExcutionException
1396 <     *  ThreadPoolExecutor will throw one when more runnables are
1397 <     *  executed then will fit in the Queue.
1398 <     */
1399 <    public void testRejectedExecutedException(){
1400 <        ThreadPoolExecutor tpe = null;
1401 <        try{
1402 <            tpe = new ThreadPoolExecutor(1,1,100,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
1403 <        }catch(Exception e){}
1404 <        tpe.shutdown();
1405 <        try{
541 <            tpe.execute(new Runnable(){
542 <                    public void run(){
543 <                        try{
544 <                            Thread.sleep(1000);
545 <                        }catch(InterruptedException e){}
546 <                    }
547 <                });
548 <            fail("ThreadPoolExecutor - void execute(Runnable) should throw RejectedExecutionException");
549 <        }catch(RejectedExecutionException sucess){}
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 sucess){
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 sucess){
1395 >     * Execution continues if there is at least one thread even if
1396 >     * thread factory fails to create more
1397 >     */
1398 >    public void testFailingThreadFactory() throws InterruptedException {
1399 >        ExecutorService e = new ThreadPoolExecutor(100, 100, LONG_DELAY_MS, MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1400 >        try {
1401 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1402 >            for (int k = 0; k < 100; ++k) {
1403 >                e.execute(new NoOpRunnable());
1404 >            }
1405 >            Thread.sleep(LONG_DELAY_MS);
1406          } finally {
1407 <            tpe.shutdown();
1407 >            joinPool(e);
1408          }
1409      }
1410 <    
1410 >
1411      /**
1412 <     *  Test to verify that setMaximumPoolSize will throw IllegalArgumentException
593 <     *  if given a negative number
1412 >     * allowsCoreThreadTimeOut is by default false.
1413       */
1414 <    public void testIllegalArgumentException2SP(){
1415 <        ThreadPoolExecutor tpe = null;
1416 <        try{
1417 <            tpe = new ThreadPoolExecutor(2,3,100,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1418 <        }catch(Exception e){}
1419 <        try{
1420 <            tpe.setMaximumPoolSize(-1);
1421 <            fail("ThreadPoolExecutor - void setMaximumPoolSize(int) should throw IllegalArgumentException");
1422 <        }catch(IllegalArgumentException sucess){
1414 >    public void testAllowsCoreThreadTimeOut() {
1415 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1416 >        assertFalse(tpe.allowsCoreThreadTimeOut());
1417 >        joinPool(tpe);
1418 >    }
1419 >
1420 >    /**
1421 >     * allowCoreThreadTimeOut(true) causes idle threads to time out
1422 >     */
1423 >    public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1424 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1425 >        tpe.allowCoreThreadTimeOut(true);
1426 >        tpe.execute(new NoOpRunnable());
1427 >        try {
1428 >            Thread.sleep(MEDIUM_DELAY_MS);
1429 >            assertEquals(0, tpe.getPoolSize());
1430          } finally {
1431 <            tpe.shutdown();
1431 >            joinPool(tpe);
1432          }
1433      }
608    
1434  
1435      /**
1436 <     *  Test to verify setKeepAliveTime will throw IllegalArgumentException
612 <     *  when given a negative value
1436 >     * allowCoreThreadTimeOut(false) causes idle threads not to time out
1437       */
1438 <    public void testIllegalArgumentException3(){
1439 <        ThreadPoolExecutor tpe = null;
1440 <        try{
1441 <            tpe = new ThreadPoolExecutor(2,3,100,TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1442 <        }catch(Exception e){}
1443 <        
1444 <        try{
621 <            tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
622 <            fail("ThreadPoolExecutor - void setKeepAliveTime(long, TimeUnit) should throw IllegalArgumentException");
623 <        }catch(IllegalArgumentException sucess){
1438 >    public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
1439 >        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1440 >        tpe.allowCoreThreadTimeOut(false);
1441 >        tpe.execute(new NoOpRunnable());
1442 >        try {
1443 >            Thread.sleep(MEDIUM_DELAY_MS);
1444 >            assertTrue(tpe.getPoolSize() >= 1);
1445          } finally {
1446 <            tpe.shutdown();
1446 >            joinPool(tpe);
1447          }
1448      }
1449 <  
1450 <    
1451 <  
1449 >
1450 >    /**
1451 >     * execute allows the same task to be submitted multiple times, even
1452 >     * if rejected
1453 >     */
1454 >    public void testRejectedRecycledTask() throws InterruptedException {
1455 >        final int nTasks = 1000;
1456 >        final AtomicInteger nRun = new AtomicInteger(0);
1457 >        final Runnable recycledTask = new Runnable() {
1458 >                public void run() {
1459 >                    nRun.getAndIncrement();
1460 >                } };
1461 >        final ThreadPoolExecutor p =
1462 >            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
1463 >                                   new ArrayBlockingQueue(30));
1464 >        try {
1465 >            for (int i = 0; i < nTasks; ++i) {
1466 >                for (;;) {
1467 >                    try {
1468 >                        p.execute(recycledTask);
1469 >                        break;
1470 >                    }
1471 >                    catch (RejectedExecutionException ignore) {
1472 >                    }
1473 >                }
1474 >            }
1475 >            Thread.sleep(5000); // enough time to run all tasks
1476 >            assertEquals(nRun.get(), nTasks);
1477 >        } finally {
1478 >            p.shutdown();
1479 >        }
1480 >    }
1481 >
1482   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines